On Tue, 8 Nov 2011, Joseph S. Myers wrote: > On Mon, 7 Nov 2011, Richard Guenther wrote: > > > Joseph, do you have any advise on how to address frontend specific > > options in a more general way? I'm trying to re-construct a > > command-line that when processed frontend agnostic would produce > > the same end-result in global_options as if going through the frontend. > > Is that even possible (do you have option examples that would show > > this is impossible?) > > Reconstructing command lines is never going to be particularly reliable. > I think the short-term fix will be saving these particular options > explicitly, and the longer-term fix will be representing them (anything > affecting IR semantics rather than just what IR gets generated) in the IR > so that once the front end is finished the global settings never get used. > (That doesn't mean moving them all to the individual GIMPLE operations, > although for complex-method that would be the best location; moving them > to struct function, with appropriate code to stream the new fields and do > whatever's appropriate when inlining between functions with different > settings, would still be useful.)
Ok, yes - that's the general direction. I've modified the patch to use global_options again and checked in the following. Bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2011-11-08 Richard Guenther <rguent...@suse.de> PR lto/50999 * lto-opts.c (append_to_collect_gcc_options): Split out from... (lto_write_options): ... here. Prepend frontend specific flags. Index: gcc/lto-opts.c =================================================================== *** gcc/lto-opts.c (revision 181150) --- gcc/lto-opts.c (working copy) *************** along with GCC; see the file COPYING3. *** 35,40 **** --- 35,63 ---- #include "lto-streamer.h" #include "toplev.h" + /* Append the option piece OPT to the COLLECT_GCC_OPTIONS string + set up by OB, appropriately quoted and separated by spaces + (if !*FIRST_P). */ + + static void + append_to_collect_gcc_options (struct obstack *ob, + bool *first_p, const char *opt) + { + const char *p, *q = opt; + if (!first_p) + obstack_grow (ob, " ", 1); + obstack_grow (ob, "'", 1); + while ((p = strchr (q, '\''))) + { + obstack_grow (ob, q, p - q); + obstack_grow (ob, "'\\''", 4); + q = ++p; + } + obstack_grow (ob, q, strlen (q)); + obstack_grow (ob, "'", 1); + *first_p = false; + } + /* Write currently held options to an LTO IL section. */ void *************** lto_write_options (void) *** 45,60 **** struct obstack temporary_obstack; unsigned int i, j; char *args; section_name = lto_get_section_name (LTO_section_opts, NULL, NULL); lto_begin_section (section_name, false); memset (&stream, 0, sizeof (stream)); obstack_init (&temporary_obstack); for (i = 1; i < save_decoded_options_count; ++i) { struct cl_decoded_option *option = &save_decoded_options[i]; - const char *q, *p; /* Skip frontend and driver specific options here. */ if (!(cl_options[option->opt_index].flags & (CL_COMMON|CL_TARGET|CL_LTO))) --- 68,97 ---- struct obstack temporary_obstack; unsigned int i, j; char *args; + bool first_p = true; section_name = lto_get_section_name (LTO_section_opts, NULL, NULL); lto_begin_section (section_name, false); memset (&stream, 0, sizeof (stream)); obstack_init (&temporary_obstack); + + /* Output options that affect GIMPLE IL semantics and are implicitely + enabled by the frontend. + This for now includes an explicit set of options that we also handle + explicitly in lto-wrapper.c. In the end the effects on GIMPLE IL + semantics should be explicitely encoded in the IL or saved per + function rather than per compilation unit. */ + /* -fexceptions causes the EH machinery to be initialized, enabling + generation of unwind data so that explicit throw() calls work. */ + if (global_options.x_flag_exceptions) + append_to_collect_gcc_options (&temporary_obstack, &first_p, + "-fexceptions"); + + /* Output explicitely passed options. */ for (i = 1; i < save_decoded_options_count; ++i) { struct cl_decoded_option *option = &save_decoded_options[i]; /* Skip frontend and driver specific options here. */ if (!(cl_options[option->opt_index].flags & (CL_COMMON|CL_TARGET|CL_LTO))) *************** lto_write_options (void) *** 82,113 **** break; } ! if (i != 1) ! obstack_grow (&temporary_obstack, " ", 1); ! obstack_grow (&temporary_obstack, "'", 1); ! q = option->canonical_option[0]; ! while ((p = strchr (q, '\''))) ! { ! obstack_grow (&temporary_obstack, q, p - q); ! obstack_grow (&temporary_obstack, "'\\''", 4); ! q = ++p; ! } ! obstack_grow (&temporary_obstack, q, strlen (q)); ! obstack_grow (&temporary_obstack, "'", 1); ! ! for (j = 1; j < option->canonical_option_num_elements; ++j) ! { ! obstack_grow (&temporary_obstack, " '", 2); ! q = option->canonical_option[j]; ! while ((p = strchr (q, '\''))) ! { ! obstack_grow (&temporary_obstack, q, p - q); ! obstack_grow (&temporary_obstack, "'\\''", 4); ! q = ++p; ! } ! obstack_grow (&temporary_obstack, q, strlen (q)); ! obstack_grow (&temporary_obstack, "'", 1); ! } } obstack_grow (&temporary_obstack, "\0", 1); args = XOBFINISH (&temporary_obstack, char *); --- 119,127 ---- break; } ! for (j = 0; j < option->canonical_option_num_elements; ++j) ! append_to_collect_gcc_options (&temporary_obstack, &first_p, ! option->canonical_option[j]); } obstack_grow (&temporary_obstack, "\0", 1); args = XOBFINISH (&temporary_obstack, char *);