Hi, this is polished version of the patch to implement IL level incremental inking. -flinker-output is now documented and can be specified to the GCC driver. In this case plugin gets option -linker-output-known and it stops from attempts to detect it from info passed down by linker. I also added doc for the flag to invoke.texi
Modulo the testsuite compensation the rest of patch is basically unchanged since earlier version: lto-wrapper looks for linker-output flag and switches to non-WPA mode (because we do not want to execute ltrans compilatoins) and lto frontends configure the compiler to output IL and possibly flat lto binary to the object file. Bootstrapped/regtested x86_64-linux, OK? Honza * lto-plugin.c: Document options; add -linker-output-known; determine when to use rel and when nolto-rel output. * lto-wrapper.c (run_gcc): Look for -flinker-output=rel also in the list of options passed from the driver. * passes.c (ipa_write_summaries): Only modify statements if body is in memory. * cgraphunit.c (ipa_passes): Also produce intermeidate code when incrementally linking. (ipa_passes): LIkewise. * lto-cgraph.c (lto_output_node): When incrementally linking do not pass down resolution info. * common.opt (flag_incremental_link): Update info. * gcc.c (plugin specs): Turn flinker-output=* to -plugin-opt=-linker-output-known * toplev.c (compile_file): Also cut compilation when doing incremental link. * flag-types.h (enum lto_partition_model): Add LTO_LINKER_OUTPUT_NOLTOREL. (invoke.texi): Add -flinker-output docs. * lang.opt (lto_linker_output): Add nolto-rel. * lto-lang.c (lto_post_options): Handle LTO_LINKER_OUTPUT_REL and LTO_LINKER_OUTPUT_NOLTOREL:. (lto_init): Generate lto when doing incremental link. * gcc.dg/lto/20081120-2_0.c: Add -flinker-output=nolto-rel * gcc.dg/lto/20090126-1_0.c: Likewise. * gcc.dg/lto/20091020-2_0.c: Likewise. * gcc.dg/lto/20081204-2_0.c: Likewise. * gcc.dg/lto/20091015-1_0.c: Likewise. * gcc.dg/lto/20090126-2_0.c: Likewiwe. * gcc.dg/lto/20090116_0.c: Likewise. * gcc.dg/lto/20081224_0.c: Likewise. * gcc.dg/lto/20091027-1_0.c: Likewise. * gcc.dg/lto/20090219_0.c: Likewise. * gcc.dg/lto/20081212-1_0.c: Likewise. * gcc.dg/lto/20091013-1_0.c: Likewise. * gcc.dg/lto/20081126_0.c: Likewise. * gcc.dg/lto/20090206-1_0.c: Likewise. * gcc.dg/lto/20091016-1_0.c: Likewise. * gcc.dg/lto/20081120-1_0.c: Likewise. * gcc.dg/lto/20091020-1_0.c: Likewise. * gcc.dg/lto/20100426_0.c: Likewise. * gcc.dg/lto/20081204-1_0.c: Likewise. * gcc.dg/lto/20091014-1_0.c: Likewise. * g++.dg/lto/20081109-1_0.C: Likewise. * g++.dg/lto/20100724-1_0.C: Likewise. * g++.dg/lto/20081204-1_0.C: Likewise. * g++.dg/lto/pr45679-2_0.C: Likewise. * g++.dg/lto/20110311-1_0.C: Likewise. * g++.dg/lto/20090302_0.C: Likewise. * g++.dg/lto/20081118_0.C: Likewise. * g++.dg/lto/20091002-2_0.C: Likewise. * g++.dg/lto/20081120-2_0.C: Likewise. * g++.dg/lto/20081123_0.C: Likewise. * g++.dg/lto/20090313_0.C: Likewise. * g++.dg/lto/pr54625-1_0.c: Likewise. * g++.dg/lto/pr48354-1_0.C: Likewise. * g++.dg/lto/20081219_0.C: Likewise. * g++.dg/lto/pr48042_0.C: Likewise. * g++.dg/lto/20101015-2_0.C: Likewise. * g++.dg/lto/pr45679-1_0.C: Likewise. * g++.dg/lto/20091026-1_0.C: Likewise. * g++.dg/lto/pr45621_0.C: Likewise. * g++.dg/lto/20081119-1_0.C: Likewise. * g++.dg/lto/20101010-4_0.C: Likewise. * g++.dg/lto/20081120-1_0.C: Likewise. * g++.dg/lto/20091002-1_0.C: Likewise. * g++.dg/lto/20091002-3_0.C: Likewise. * gfortran.dg/lto/20091016-1_0.f90: Likewise. * gfortran.dg/lto/pr47839_0.f90: Likewise. * gfortran.dg/lto/pr46911_0.f: Likewise. * gfortran.dg/lto/20091028-1_0.f90: Likewise. * gfortran.dg/lto/20091028-2_0.f90: Likewise. Index: lto-plugin/lto-plugin.c =================================================================== --- lto-plugin/lto-plugin.c (revision 231081) +++ lto-plugin/lto-plugin.c (working copy) @@ -27,10 +27,13 @@ along with this program; see the file CO More information at http://gcc.gnu.org/wiki/whopr/driver. This plugin should be passed the lto-wrapper options and will forward them. - It also has 2 options of its own: + It also has options at his own: -debug: Print the command line used to run lto-wrapper. -nop: Instead of running lto-wrapper, pass the original to the plugin. This - only works if the input files are hybrid. */ + only works if the input files are hybrid. + -linker-output-known: Do not determine linker output + -sym-style={none,win32,underscore|uscore} + -pass-through */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -151,6 +154,7 @@ static ld_plugin_add_symbols add_symbols static struct plugin_file_info *claimed_files = NULL; static unsigned int num_claimed_files = 0; +static unsigned int non_claimed_files = 0; static struct plugin_file_info *offload_files = NULL; static unsigned int num_offload_files = 0; @@ -169,6 +173,7 @@ static char nop; static char *resolution_file = NULL; static enum ld_plugin_output_file_type linker_output; static int linker_output_set; +static int linker_output_known; /* The version of gold being used, or -1 if not gold. The number is MAJOR * 100 + MINOR. */ @@ -626,7 +631,8 @@ all_symbols_read_handler (void) { unsigned i; unsigned num_lto_args - = num_claimed_files + num_offload_files + lto_wrapper_num_args + 2; + = num_claimed_files + num_offload_files + lto_wrapper_num_args + 1 + + !linker_output_known; char **lto_argv; const char *linker_output_str; const char **lto_arg_ptr; @@ -651,26 +657,38 @@ all_symbols_read_handler (void) for (i = 0; i < lto_wrapper_num_args; i++) *lto_arg_ptr++ = lto_wrapper_argv[i]; - assert (linker_output_set); - switch (linker_output) + if (!linker_output_known) { - case LDPO_REL: - linker_output_str = "-flinker-output=rel"; - break; - case LDPO_DYN: - linker_output_str = "-flinker-output=dyn"; - break; - case LDPO_PIE: - linker_output_str = "-flinker-output=pie"; - break; - case LDPO_EXEC: - linker_output_str = "-flinker-output=exec"; - break; - default: - message (LDPL_FATAL, "unsupported linker output %i", linker_output); - break; + assert (linker_output_set); + switch (linker_output) + { + case LDPO_REL: + if (non_claimed_files) + { + message (LDPL_WARNING, "incremental linking of LTO and non-LTO " + "objects; using -flinker-output=nolto-rel which will " + "bypass whole program optimization"); + linker_output_str = "-flinker-output=nolto-rel"; + } + else + linker_output_str = "-flinker-output=rel"; + break; + case LDPO_DYN: + linker_output_str = "-flinker-output=dyn"; + break; + case LDPO_PIE: + linker_output_str = "-flinker-output=pie"; + break; + case LDPO_EXEC: + linker_output_str = "-flinker-output=exec"; + break; + default: + message (LDPL_FATAL, "unsupported linker output %i", linker_output); + linker_output_str = ""; + break; + } + *lto_arg_ptr++ = xstrdup (linker_output_str); } - *lto_arg_ptr++ = xstrdup (linker_output_str); for (i = 0; i < num_claimed_files; i++) { struct plugin_file_info *info = &claimed_files[i]; @@ -1023,6 +1041,7 @@ claim_file_handler (const struct ld_plug goto cleanup; err: + non_claimed_files++; free (lto_file.name); cleanup: @@ -1037,6 +1056,8 @@ claim_file_handler (const struct ld_plug static void process_option (const char *option) { + if (strcmp (option, "-linker-output-known") == 0) + linker_output_known = 1; if (strcmp (option, "-debug") == 0) debug = 1; else if (strcmp (option, "-nop") == 0) Index: gcc/lto-wrapper.c =================================================================== --- gcc/lto-wrapper.c (revision 231081) +++ gcc/lto-wrapper.c (working copy) @@ -912,6 +912,7 @@ run_gcc (unsigned argc, char *argv[]) bool have_offload = false; unsigned lto_argc = 0, offload_argc = 0; char **lto_argv, **offload_argv; + bool linker_output_rel = false; /* Get the driver and options. */ collect_gcc = getenv ("COLLECT_GCC"); @@ -953,9 +954,12 @@ run_gcc (unsigned argc, char *argv[]) file_offset = (off_t) loffset; } fd = open (filename, O_RDONLY | O_BINARY); + /* Linker plugin passes -fresolution and -flinker-output options. */ if (fd == -1) { lto_argv[lto_argc++] = argv[i]; + if (strcmp (argv[i], "-flinker-output=rel") == 0) + linker_output_rel = true; continue; } @@ -1029,11 +1033,18 @@ run_gcc (unsigned argc, char *argv[]) lto_mode = LTO_MODE_WHOPR; break; + case OPT_flinker_output_: + linker_output_rel = !strcmp (option->arg, "rel"); + break; + default: break; } } + if (linker_output_rel) + no_partition = true; + if (no_partition) { lto_mode = LTO_MODE_LTO; Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 231081) +++ gcc/passes.c (working copy) @@ -2530,7 +2530,7 @@ ipa_write_summaries (void) { struct cgraph_node *node = order[i]; - if (node->has_gimple_body_p ()) + if (gimple_has_body_p (node->decl)) { /* When streaming out references to statements as part of some IPA pass summary, the statements need to have uids assigned and the Index: gcc/cgraphunit.c =================================================================== --- gcc/cgraphunit.c (revision 231081) +++ gcc/cgraphunit.c (working copy) @@ -2270,8 +2270,10 @@ ipa_passes (void) if (flag_generate_lto || flag_generate_offload) targetm.asm_out.lto_start (); - if (!in_lto_p) + if (!in_lto_p || flag_incremental_link == 2) { + if (!quiet_flag) + fprintf (stderr, "Streaming LTO\n"); if (g->have_offload) { section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX; @@ -2290,7 +2292,9 @@ ipa_passes (void) if (flag_generate_lto || flag_generate_offload) targetm.asm_out.lto_end (); - if (!flag_ltrans && (in_lto_p || !flag_lto || flag_fat_lto_objects)) + if (!flag_ltrans + && ((in_lto_p && flag_incremental_link != 2) + || !flag_lto || flag_fat_lto_objects)) execute_ipa_pass_list (passes->all_regular_ipa_passes); invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_END, NULL); @@ -2381,7 +2385,8 @@ symbol_table::compile (void) /* Do nothing else if any IPA pass found errors or if we are just streaming LTO. */ if (seen_error () - || (!in_lto_p && flag_lto && !flag_fat_lto_objects)) + || ((!in_lto_p || flag_incremental_link == 2) + && flag_lto && !flag_fat_lto_objects)) { timevar_pop (TV_CGRAPHOPT); return; Index: gcc/lto-cgraph.c =================================================================== --- gcc/lto-cgraph.c (revision 231081) +++ gcc/lto-cgraph.c (working copy) @@ -534,7 +534,10 @@ lto_output_node (struct lto_simple_outpu bp_pack_value (&bp, node->thunk.thunk_p, 1); bp_pack_value (&bp, node->parallelized_function, 1); bp_pack_enum (&bp, ld_plugin_symbol_resolution, - LDPR_NUM_KNOWN, node->resolution); + LDPR_NUM_KNOWN, + /* When doing incremental link, we will get new resolution + info next time we process the file. */ + flag_incremental_link ? LDPR_UNKNOWN : node->resolution); bp_pack_value (&bp, node->instrumentation_clone, 1); bp_pack_value (&bp, node->split_part, 1); streamer_write_bitpack (&bp); Index: gcc/common.opt =================================================================== --- gcc/common.opt (revision 231081) +++ gcc/common.opt (working copy) @@ -48,7 +48,8 @@ bool in_lto_p = false ; This variable is set to non-0 only by LTO front-end. 1 indicates that ; the output produced will be used for incrmeental linking (thus weak symbols -; can still be bound). +; can still be bound) and 2 indicates that the IL is going to be linked and +; and output to LTO object file. Variable int flag_incremental_link = 0 Index: gcc/gcc.c =================================================================== --- gcc/gcc.c (revision 231081) +++ gcc/gcc.c (working copy) @@ -953,6 +953,7 @@ proper position among the other output f -plugin %(linker_plugin_file) \ -plugin-opt=%(lto_wrapper) \ -plugin-opt=-fresolution=%u.res \ + %{flinker-output=*:-plugin-opt=-linker-output-known} \ %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \ }" PLUGIN_COND_CLOSE #else Index: gcc/toplev.c =================================================================== --- gcc/toplev.c (revision 231081) +++ gcc/toplev.c (working copy) @@ -504,7 +504,8 @@ compile_file (void) /* Compilation unit is finalized. When producing non-fat LTO object, we are basically finished. */ - if (in_lto_p || !flag_lto || flag_fat_lto_objects) + if ((in_lto_p && flag_incremental_link != 2) + || !flag_lto || flag_fat_lto_objects) { /* File-scope initialization for AddressSanitizer. */ if (flag_sanitize & SANITIZE_ADDRESS) Index: gcc/lto/lang.opt =================================================================== --- gcc/lto/lang.opt (revision 231081) +++ gcc/lto/lang.opt (working copy) @@ -34,6 +34,9 @@ EnumValue Enum(lto_linker_output) String(rel) Value(LTO_LINKER_OUTPUT_REL) EnumValue +Enum(lto_linker_output) String(nolto-rel) Value(LTO_LINKER_OUTPUT_NOLTOREL) + +EnumValue Enum(lto_linker_output) String(dyn) Value(LTO_LINKER_OUTPUT_DYN) EnumValue Index: gcc/lto/lto-lang.c =================================================================== --- gcc/lto/lto-lang.c (revision 231081) +++ gcc/lto/lto-lang.c (working copy) @@ -823,6 +823,26 @@ lto_post_options (const char **pfilename switch (flag_lto_linker_output) { case LTO_LINKER_OUTPUT_REL: /* .o: incremental link producing LTO IL */ + /* Configure compiler same way as normal frontend would do with -flto: + this way we read the trees (declarations & types), symbol table, + optimization summaries and link them. Subsequently we output new LTO + file. */ + flag_lto = ""; + flag_incremental_link = 2; + flag_whole_program = 0; + flag_wpa = 0; + flag_generate_lto = 1; + /* It would be cool to produce .o file directly, but our current + simple objects does not contain the lto symbol markers. Go the slow + way through the asm file. */ + lang_hooks.lto.begin_section = lhd_begin_section; + lang_hooks.lto.append_data = lhd_append_data; + lang_hooks.lto.end_section = lhd_end_section; + if (flag_ltrans) + error ("-flinker-output=rel and -fltrans are mutually exclussive"); + break; + + case LTO_LINKER_OUTPUT_NOLTOREL: /* .o: incremental link producing asm */ flag_whole_program = 0; flag_incremental_link = 1; break; @@ -1243,7 +1263,7 @@ lto_init (void) int i; /* We need to generate LTO if running in WPA mode. */ - flag_generate_lto = (flag_wpa != NULL); + flag_generate_lto = (flag_incremental_link == 2 || flag_wpa != NULL); /* Create the basic integer types. */ build_common_tree_nodes (flag_signed_char, flag_short_double); Index: gcc/flag-types.h =================================================================== --- gcc/flag-types.h (revision 231081) +++ gcc/flag-types.h (working copy) @@ -269,6 +269,7 @@ enum lto_partition_model { enum lto_linker_output { LTO_LINKER_OUTPUT_UNKNOWN, LTO_LINKER_OUTPUT_REL, + LTO_LINKER_OUTPUT_NOLTOREL, LTO_LINKER_OUTPUT_DYN, LTO_LINKER_OUTPUT_PIE, LTO_LINKER_OUTPUT_EXEC Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 231081) +++ gcc/doc/invoke.texi (working copy) @@ -492,7 +492,8 @@ Objective-C and Objective-C++ Dialects}. @item Linker Options @xref{Link Options,,Options for Linking}. -@gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} -l@var{library} @gol +@gccoptlist{@var{object-file-name} -flinker-output=@var{type} @gol +-fuse-ld=@var{linker} -l@var{library} @gol -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic @gol -s -static -static-libgcc -static-libstdc++ @gol -static-libasan -static-libtsan -static-liblsan -static-libubsan @gol @@ -11317,6 +11318,50 @@ If any of these options is used, then th object file names should not be used as arguments. @xref{Overall Options}. +@item -flinker-output=@var{type} +@opindex -flinker-output +This option controls the code generation of the link time optimizer. By +default the linker output is determined by the linker plugin automatically. For +debugging the compiler and in the case of incremental linking it may be useful +to control the type manually. + +If @var{type} is @samp{exec} the code generation is configured to produce static +binary. In this case @option{-fpic} and @option{-fpie} are both disabled. + +If @var{type} is @samp{dyn} the code generation is configured to produce shared +library. In this case @option{-fpic} or @option{-fPIC} is preserved. These +options arenot implied to make it possible to build static libraries without +position independent code on architectures this is possible, i.e. on x86. + +If @var{type} is @samp{pie} the code generation is configured to produce +@option{-fpie} executable. This result in similar optimizations as @samp{exec} +except that @option{-fpie} is not disabled if specified at compilation time. + +If @var{type} is @samp{rel} the compiler assumes that incremental linking is +done. The sections containing intermediate code for link-time optimization are +merged, pre-optimized, and output to the resulting object file. In addition if +@option{-ffat-lto-objects} is specified the binary code is produced for future +non-lto linking. The object file produced by incremental linking will be smaller +than a static library produced from the same object files. At link-time the +result of incremental linking will also load faster to compiler than a static +library assuming that majority of objects in the library are used. + +Finally @samp{nolto-rel} configure compiler to for incremental linking where +code generation is forced, final binary is produced and the intermediate code +for later link-time optimization is stripped. When multiple object files are +linked together the resulting code will be optimized better than with link time +optimizations disabled (for example, the cross-module inlining will happen), +most of benefits of whole program optimizations are however lost. + +During the incremental link (by @option{-r}) the linker plugin will default to +@option{rel}. With current interfaces to GNU Binutils it is however not +possible to link incrementally LTO objects and non-LTO objects into a single +mixed object file. In the case any of object files in incremental link can not +be used for link-time optimization the linker plugin will output warning and +use @samp{nolto-rel}. To maintain the whole program optimization it is +recommended to link such objects into static library instead. Alternatively it +is possible to use H.J. Lu's binutils with support for mixed objects. + @item -fuse-ld=bfd @opindex fuse-ld=bfd Use the @command{bfd} linker instead of the default linker. Index: gcc/testsuite/gcc.dg/lto/20081120-2_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081120-2_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081120-2_0.c (working copy) @@ -1,3 +1,4 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ void bar(void) {} Index: gcc/testsuite/gcc.dg/lto/20090126-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20090126-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20090126-1_0.c (working copy) @@ -1,6 +1,6 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-O0 -flto -flto-partition=1to1}} } */ -/* { dg-extra-ld-options {-r -nostdlib -O2 -flto -flto-partition=1to1} } */ +/* { dg-extra-ld-options {-r -nostdlib -O2 -flto -flto-partition=1to1 -flinker-output=nolto-rel} } */ int main(int argc, char **argv) { return 0; Index: gcc/testsuite/gcc.dg/lto/20091020-2_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091020-2_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091020-2_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ typedef struct { int NumPackStreams; Index: gcc/testsuite/gcc.dg/lto/20081204-2_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081204-2_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081204-2_0.c (working copy) @@ -1,5 +1,6 @@ /* { dg-lto-do link } */ /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */ /* { dg-lto-options {{-w -flto -fPIC -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ register int ri asm("edi"); Index: gcc/testsuite/gcc.dg/lto/20091015-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091015-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091015-1_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -O2 -flto} {-fPIC -r -nostdlib -O2 -flto -flto-partition=1to1}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ #include "20091015-1_b.h" void diagnostic_initialize (FILE **stream) { *stream = stderr; } Index: gcc/testsuite/gcc.dg/lto/20090126-2_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20090126-2_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20090126-2_0.c (working copy) @@ -1,7 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -O2 -flto -flto-partition=1to1}} } */ -/* { dg-extra-ld-options {-fno-PIC -r -nostdlib -O2 -flto -flto-partition=1to1} } */ +/* { dg-extra-ld-options {-fno-PIC -r -nostdlib -O2 -flto -flto-partition=1to1 -flinker-output=nolto-rel} } */ int main(int argc, char **argv) { return 0; Index: gcc/testsuite/gcc.dg/lto/20090116_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20090116_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20090116_0.c (working copy) @@ -1,7 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-O1 -flto -flto-partition=1to1 -fPIC}} } */ -/* { dg-extra-ld-options {-r -nostdlib -O0} } */ +/* { dg-extra-ld-options {-r -nostdlib -O0 -flinker-output=nolto-rel} } */ int foo(void) { int ret, i; Index: gcc/testsuite/gcc.dg/lto/20081224_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081224_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081224_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ #include "20081224_0.h" extern struct foo x; Index: gcc/testsuite/gcc.dg/lto/20091027-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091027-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091027-1_0.c (working copy) @@ -1,5 +1,5 @@ /* { dg-lto-do link } */ -/* { dg-extra-ld-options "-r -nostdlib" } */ +/* { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } */ typedef struct _xmlDict xmlDict; struct _xmlDict { Index: gcc/testsuite/gcc.dg/lto/20090219_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20090219_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20090219_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-O3 -flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ struct Foo { int f1, f2, f3, f4, f5; }; Index: gcc/testsuite/gcc.dg/lto/20081212-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081212-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081212-1_0.c (working copy) @@ -1,4 +1,5 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ int exported_var = 42; /* { dg-final { scan-symbol "exported_var" } } */ Index: gcc/testsuite/gcc.dg/lto/20091013-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091013-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091013-1_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -flto} {-fPIC -r -nostdlib -O2 -flto}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ void * HeapAlloc(void*,unsigned int,unsigned long); Index: gcc/testsuite/gcc.dg/lto/20081126_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081126_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081126_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */ /* { dg-lto-options {{-flto -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ int f(void) { register int ri asm("edi"); Index: gcc/testsuite/gcc.dg/lto/20090206-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20090206-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20090206-1_0.c (working copy) @@ -3,6 +3,7 @@ /* { dg-lto-options {{-fPIC -r -nostdlib -flto -flto-partition=1to1 -msse2}} } */ /* { dg-require-effective-target sse2 } */ /* { dg-suppress-ld-options {-fPIC -msse2} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ typedef short v8hi __attribute__((__vector_size__(16))); void func (void) { Index: gcc/testsuite/gcc.dg/lto/20091016-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091016-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091016-1_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -O2 -flto}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ typedef struct VEC_constructor_elt_gc { } VEC_constructor_elt_gc; #include "20091016-1_a.h" Index: gcc/testsuite/gcc.dg/lto/20081120-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081120-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081120-1_0.c (working copy) @@ -1,5 +1,6 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-flto -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ extern int stat(void) __asm__("" "stat64"); extern inline int stat(void) { } static void foo(void) { stat(); } Index: gcc/testsuite/gcc.dg/lto/20091020-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091020-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091020-1_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ typedef struct { int NumPackStreams; Index: gcc/testsuite/gcc.dg/lto/20100426_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20100426_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20100426_0.c (working copy) @@ -1,5 +1,6 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-r -nostdlib -flto -g}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ long Perl_my_htonl (long l) { Index: gcc/testsuite/gcc.dg/lto/20081204-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20081204-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20081204-1_0.c (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* Tests for the absence during linking of: lto1: error: type of 'i' does not match original declaration */ Index: gcc/testsuite/gcc.dg/lto/20091014-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/20091014-1_0.c (revision 231081) +++ gcc/testsuite/gcc.dg/lto/20091014-1_0.c (working copy) @@ -1,5 +1,6 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* Empty file. See PR41173. */ Index: gcc/testsuite/g++.dg/lto/20081109-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081109-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081109-1_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} } -// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions" } +// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions -flinker-output=nolto-rel" } void func(); class Foo { }; void bar() { try { func(); } catch (Foo) { } }; Index: gcc/testsuite/g++.dg/lto/20100724-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20100724-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20100724-1_0.C (working copy) @@ -1,6 +1,6 @@ /* { dg-lto-do link } */ /* { dg-lto-options {{-ftoplevel-reorder -flto -flto-partition=none} {-ftoplevel-reorder -flto -flto-partition=1to1}} } */ -/* { dg-extra-ld-options {-r -nostdlib} } */ +/* { dg-extra-ld-options {-r -nostdlib -flinker-output=nolto-rel} } */ struct Foo { virtual ~Foo(); }; struct Bar:public Foo { Bar() { } }; Index: gcc/testsuite/g++.dg/lto/20081204-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081204-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081204-1_0.C (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* Tests for the absence during linking of: lto1: error: type of '_ZTVN10__cxxabiv120__si_class_type_infoE' does Index: gcc/testsuite/g++.dg/lto/pr45679-2_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/pr45679-2_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr45679-2_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-lto-options {{-O3 -Wno-multichar}} } -// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" } extern "C" { typedef struct { union { Index: gcc/testsuite/g++.dg/lto/20110311-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20110311-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20110311-1_0.C (working copy) @@ -1,5 +1,5 @@ /* { dg-lto-do link } */ -/* { dg-extra-ld-options "-r -nostdlib" } */ +/* { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } */ struct NullType {}; Index: gcc/testsuite/g++.dg/lto/20090302_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20090302_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20090302_0.C (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ struct Foo { bool Mumble(); static void Bar() { if (foo_->Mumble()) foo_ = 0; } Index: gcc/testsuite/g++.dg/lto/20081118_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081118_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081118_0.C (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ /* We used to ICE because of dangling pointers. */ Index: gcc/testsuite/g++.dg/lto/20091002-2_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20091002-2_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20091002-2_0.C (working copy) @@ -1,7 +1,7 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-fPIC}} } -// { dg-extra-ld-options "-fPIC -r -nostdlib" } +// { dg-extra-ld-options "-fPIC -r -nostdlib -flinker-output=nolto-rel" } class DataArray { int max() const { } Index: gcc/testsuite/g++.dg/lto/20081120-2_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081120-2_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081120-2_0.C (working copy) @@ -1,5 +1,6 @@ // { dg-lto-do link } // { dg-lto-options {{-flto -r -nostdlib}} } +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ template < typename > struct Foo { inline void rdstate() { Index: gcc/testsuite/g++.dg/lto/20081123_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081123_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081123_0.C (working copy) @@ -1,6 +1,7 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} } +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ int f(void) Index: gcc/testsuite/g++.dg/lto/20090313_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20090313_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20090313_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} } -// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" } int X; Index: gcc/testsuite/g++.dg/lto/pr54625-1_0.c =================================================================== --- gcc/testsuite/g++.dg/lto/pr54625-1_0.c (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr54625-1_0.c (working copy) @@ -1,5 +1,5 @@ /* { dg-lto-do link } */ -/* { dg-extra-ld-options { -r -nostdlib } } */ +/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */ float a; double sin (); Index: gcc/testsuite/g++.dg/lto/pr48354-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/pr48354-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr48354-1_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-lto-options { { -g -flto } } } -// { dg-extra-ld-options "-r -nostdlib" } +// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } template<typename T> struct Identity { typedef T type; }; struct S { Index: gcc/testsuite/g++.dg/lto/20081219_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081219_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081219_0.C (working copy) @@ -1,7 +1,7 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -O2}} } -// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib" } +// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" } typedef long int ptrdiff_t; extern "C" Index: gcc/testsuite/g++.dg/lto/pr48042_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/pr48042_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr48042_0.C (working copy) @@ -1,5 +1,5 @@ // { dg-lto-do link } -// { dg-extra-ld-options "-r -nostdlib -g" } +// { dg-extra-ld-options "-r -nostdlib -g -flinker-output=nolto-rel" } class A { virtual int x() = 0; Index: gcc/testsuite/g++.dg/lto/20101015-2_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20101015-2_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20101015-2_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-lto-options { { -flto } { -g -flto } } } -// { dg-extra-ld-options "-r -nostdlib" } +// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } struct Base { ~Base (); }; void fun(void) { struct Deriv : Base { } x; } Index: gcc/testsuite/g++.dg/lto/pr45679-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/pr45679-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr45679-1_0.C (working copy) @@ -1,6 +1,6 @@ // { dg-lto-do link } // { dg-lto-options {{-O3 -Wno-multichar}} } -// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" } extern "C" { typedef struct __locale_struct { Index: gcc/testsuite/g++.dg/lto/20091026-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20091026-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20091026-1_0.C (working copy) @@ -1,5 +1,5 @@ // { dg-lto-do link } -// { dg-extra-ld-options "-r -nostdlib" } +// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } #include "20091026-1_a.h" cObject *cHead::find(const char *objname) const Index: gcc/testsuite/g++.dg/lto/pr45621_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/pr45621_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/pr45621_0.C (working copy) @@ -1,5 +1,5 @@ // { dg-lto-do assemble } -// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r" } +// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r -flinker-output=nolto-rel" } #include "pr45621.h" void Index: gcc/testsuite/g++.dg/lto/20081119-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081119-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081119-1_0.C (working copy) @@ -1,6 +1,7 @@ /* { dg-lto-do link } */ /* { dg-require-effective-target fpic } */ /* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ #include "20081119-1.h" Index: gcc/testsuite/g++.dg/lto/20101010-4_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20101010-4_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20101010-4_0.C (working copy) @@ -1,5 +1,6 @@ // { dg-lto-do link } // { dg-lto-options { { -std=c++0x -flto -r -nostdlib } { -std=c++0x -flto -g -r -nostdlib } } } +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ typedef decltype(nullptr) nullptr_t; class shared_ptr { Index: gcc/testsuite/g++.dg/lto/20081120-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20081120-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20081120-1_0.C (working copy) @@ -1,5 +1,6 @@ // { dg-lto-do link } // { dg-lto-options {{-flto -r -nostdlib}} } +/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */ extern "C" { extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int) Index: gcc/testsuite/g++.dg/lto/20091002-1_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20091002-1_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20091002-1_0.C (working copy) @@ -1,7 +1,7 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-fPIC -flto}} } -// { dg-extra-ld-options "-fPIC -r -nostdlib" } +// { dg-extra-ld-options "-fPIC -r -nostdlib -flinker-output=nolto-rel" } namespace std __attribute__ ((__visibility__ ("default"))) { Index: gcc/testsuite/g++.dg/lto/20091002-3_0.C =================================================================== --- gcc/testsuite/g++.dg/lto/20091002-3_0.C (revision 231081) +++ gcc/testsuite/g++.dg/lto/20091002-3_0.C (working copy) @@ -1,7 +1,7 @@ // { dg-lto-do link } // { dg-require-effective-target fpic } // { dg-lto-options {{-fPIC}} } -// { dg-extra-ld-options "-fPIC -r -nostdlib" } +// { dg-extra-ld-options "-fPIC -r -nostdlib -flinker-output=nolto-rel" } template < class T > class DataArray { Index: gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90 =================================================================== --- gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90 (revision 231081) +++ gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90 (working copy) @@ -1,5 +1,6 @@ ! { dg-lto-do link } ! { dg-lto-options {{-flto -g -fPIC -r -nostdlib} {-O -flto -g -fPIC -r -nostdlib}} } +! { dg-extra-ld-options "-flinker-output=nolto-rel" } FUNCTION makenumberstring(x) IMPLICIT NONE Index: gcc/testsuite/gfortran.dg/lto/pr47839_0.f90 =================================================================== --- gcc/testsuite/gfortran.dg/lto/pr47839_0.f90 (revision 231081) +++ gcc/testsuite/gfortran.dg/lto/pr47839_0.f90 (working copy) @@ -1,6 +1,6 @@ ! { dg-lto-do link } ! { dg-lto-options {{ -g -flto }} } -! { dg-extra-ld-options "-r -nostdlib" } +! { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } MODULE globalvar_mod integer :: xstop Index: gcc/testsuite/gfortran.dg/lto/pr46911_0.f =================================================================== --- gcc/testsuite/gfortran.dg/lto/pr46911_0.f (revision 231081) +++ gcc/testsuite/gfortran.dg/lto/pr46911_0.f (working copy) @@ -1,6 +1,6 @@ ! { dg-lto-do link } ! { dg-lto-options {{ -O2 -flto -g }} } -! { dg-extra-ld-options "-r -nostdlib" } +! { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } common/main1/ eps(2) call dalie6s(iqmod6,1,wx,cor6d) end Index: gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90 =================================================================== --- gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90 (revision 231081) +++ gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90 (working copy) @@ -1,5 +1,5 @@ ! { dg-lto-do link } -! { dg-extra-ld-options "-r -nostdlib -finline-functions" } +! { dg-extra-ld-options "-r -nostdlib -finline-functions -flinker-output=nolto-rel" } SUBROUTINE int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & DataHandle, Element, VarName, Data, code ) Index: gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90 =================================================================== --- gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90 (revision 231081) +++ gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90 (working copy) @@ -1,5 +1,5 @@ ! { dg-lto-do link } -! { dg-extra-ld-options "-r -nostdlib -finline-functions" } +! { dg-extra-ld-options "-r -nostdlib -finline-functions -flinker-output=nolto-rel" } SUBROUTINE int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, & DataHandle, Element, VarName, Data, code )