This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR50999, serialize frontend specific flags (-fexceptions)
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 <rguenther@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 *);