Jakub Jelinek <ja...@redhat.com> writes: > On Mon, Jan 06, 2014 at 10:27:06AM +0000, Richard Sandiford wrote: >> Of course, IMO, the cleanest fix would be to use switchable targets >> for i386... > > The following patch does that, bootstrapped/regtested on x86_64-linux and > i686-linux.
Neat, thanks. Looks like it's a lot less intrusive than I thought it might be. > The only problem with the patch is PCH, > +FAIL: 17_intro/headers/c++200x/stdc++.cc (test for excess errors) > +FAIL: 17_intro/headers/c++200x/stdc++_multiple_inclusion.cc (test for excess > errors) > (both 32-bit and 64-bit regtests), where it ICEs. I guess the problem is > that the target globals are allocated partly in GC, partly in heap and > even if they were allocated completely in GC and GTY(()) marked fully all > the individual pointed structures, we IMNSHO still don't want it to be > saved during PCH and restored later, what we have is basically just a cache > of the target globals. > > Dunno what is the best way to handle that though. > Either before writing PCH c-common.c could call some tree.c routine that > would traverse the cl_option_hash_table hash table and for every > TARGET_OPTION_NODE in the hash table clear TREE_TARGET_GLOBALS. > Or perhaps some gengtype extension to run some routine before PCH saving > on the tree_target_option structs and clear the globals field in there. > Or use GTY((user)) on tree_target_option, but then dunno how we'd handle the > marking of the embedded opts field (and common). > Any ideas? Not really. For MIPS this was relatively easy since there was only one non-default instance: /* Implement TARGET_PREPARE_PCH_SAVE. */ static void mips_prepare_pch_save (void) { /* We are called in a context where the current MIPS16 vs. non-MIPS16 setting should be irrelevant. The question then is: which setting makes most sense at load time? The PCH is loaded before the first token is read. We should never have switched into MIPS16 mode by that point, and thus should not have populated mips16_globals. Nor can we load the entire contents of mips16_globals from the PCH file, because mips16_globals contains a combination of GGC and non-GGC data. There is therefore no point in trying save the GGC part of mips16_globals to the PCH file, or to preserve MIPS16ness across the PCH save and load. The loading compiler would not have access to the non-GGC parts of mips16_globals (either from the PCH file, or from a copy that the loading compiler generated itself) and would have to call target_reinit anyway. It therefore seems best to switch back to non-MIPS16 mode at save time, and to ensure that mips16_globals remains null after a PCH load. */ mips_set_compression_mode (0); mips16_globals = 0; } The idea of iterating over cl_option_hash_table sounded good though. It might also be the easiest option. Hopefully at some point we can move the main body of ix86_set_current_function into generic code, but that's probably 4.10 material. Thanks, Richard