This doesn't get very far yet, but it's the start of what I imagine the lto-wrapper changes will look like.
Bernd
Index: gomp-4_0-branch/gcc/lto-wrapper.c =================================================================== --- gomp-4_0-branch.orig/gcc/lto-wrapper.c +++ gomp-4_0-branch/gcc/lto-wrapper.c @@ -47,6 +47,8 @@ along with GCC; see the file COPYING3. #include "options.h" #include "simple-object.h" #include "lto-section-names.h" +#include "vec.h" +#include "out-targets.h" /* End of lto-streamer.h copy. */ @@ -443,6 +445,34 @@ merge_and_complain (struct cl_decoded_op } } +static int +mark_out_targets (void *, const char *name, off_t, off_t) +{ + size_t len = strlen (LTO_TARGET_SECTION_NAME_PREFIX); + if (strncmp (name, LTO_TARGET_SECTION_NAME_PREFIX, len) != 0) + return 1; + name += len; + unsigned i; + target_machine *m; + bool matched = false; + FOR_EACH_VEC_ELT (target_machines, i, m) + { + size_t tlen = strlen (m->triplet); + if (tlen == 0) + continue; + if (strncmp (name, m->triplet, tlen) == 0) + { + m->used = true; + matched = true; + printf ("found target %s in section %s\n", m->triplet, name); + } + } + if (!matched) + fatal ("unrecognized output target found in LTO input section %s", name); + + return 1; +} + /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */ static void @@ -511,6 +541,8 @@ run_gcc (unsigned argc, char *argv[]) close (fd); continue; } + + simple_object_find_sections (sobj, mark_out_targets, NULL, &err); if (!simple_object_find_section (sobj, LTO_SECTION_NAME_PREFIX "." "opts", &offset, &length, &errmsg, &err)) { @@ -937,6 +969,8 @@ main (int argc, char *argv[]) gcc_init_libintl (); + init_out_targets (); + diagnostic_initialize (global_dc, 0); if (signal (SIGINT, SIG_IGN) != SIG_IGN) Index: gomp-4_0-branch/gcc/Makefile.in =================================================================== --- gomp-4_0-branch.orig/gcc/Makefile.in +++ gomp-4_0-branch/gcc/Makefile.in @@ -1906,9 +1907,10 @@ collect2$(exeext): $(COLLECT2_OBJS) $(LI CFLAGS-collect2.o += -DTARGET_MACHINE=\"$(target_noncanonical)\" \ @TARGET_SYSTEM_ROOT_DEFINE@ -lto-wrapper$(exeext): lto-wrapper.o ggc-none.o libcommon-target.a $(LIBDEPS) +lto-wrapper$(exeext): lto-wrapper.o out-targets.o ggc-none.o \ + libcommon-target.a $(LIBDEPS) +$(LINKER) $(ALL_COMPILERFLAGS) $(LDFLAGS) -o T$@ \ - lto-wrapper.o ggc-none.o libcommon-target.a $(LIBS) + lto-wrapper.o out-targets.o ggc-none.o libcommon-target.a $(LIBS) mv -f T$@ $@ # Files used by all variants of C or by the stand-alone pre-processor.