From: Jakub Jelinek Date: Wed, 25 Feb 2015 06:46:22 +0000 (+0100) Subject: re PR lto/64374 (LTO ICE in extract_insn, at recog.c:2327) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=599131236dcff82a8d8f5664ec297163e7287c85;p=gcc.git re PR lto/64374 (LTO ICE in extract_insn, at recog.c:2327) PR lto/64374 * target.def (target_option_stream_in): New target hook. * tree-streamer-in.c (streamer_read_tree_bitfields): Invoke targetm.target_option.post_stream_in if non-NULL. * doc/tm.texi.in: Add @hook TARGET_OPTION_POST_STREAM_IN. * doc/tm.texi: Updated. * config/i386/i386.c (ix86_function_specific_post_stream_in): New function. (TARGET_OPTION_POST_STREAM_IN): Redefine. From-SVN: r220958 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 776821bb545..dd8db64f130 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-02-25 Jakub Jelinek + + PR lto/64374 + * target.def (target_option_stream_in): New target hook. + * tree-streamer-in.c (streamer_read_tree_bitfields): Invoke + targetm.target_option.post_stream_in if non-NULL. + * doc/tm.texi.in: Add @hook TARGET_OPTION_POST_STREAM_IN. + * doc/tm.texi: Updated. + * config/i386/i386.c (ix86_function_specific_post_stream_in): New + function. + (TARGET_OPTION_POST_STREAM_IN): Redefine. + 2015-02-24 Jeff Law PR target/65117 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 66200216d3f..bc4fb4be399 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2463,6 +2463,7 @@ static void ix86_function_specific_save (struct cl_target_option *, struct gcc_options *opts); static void ix86_function_specific_restore (struct gcc_options *opts, struct cl_target_option *); +static void ix86_function_specific_post_stream_in (struct cl_target_option *); static void ix86_function_specific_print (FILE *, int, struct cl_target_option *); static bool ix86_valid_target_attribute_p (tree, tree, tree, int); @@ -4571,6 +4572,57 @@ ix86_function_specific_restore (struct gcc_options *opts, set_ix86_tune_features (ix86_tune, false); } +/* Adjust target options after streaming them in. This is mainly about + reconciling them with global options. */ + +static void +ix86_function_specific_post_stream_in (struct cl_target_option *ptr) +{ + /* flag_pic is a global option, but ix86_cmodel is target saved option + partly computed from flag_pic. If flag_pic is on, adjust x_ix86_cmodel + for PIC, or error out. */ + if (flag_pic) + switch (ptr->x_ix86_cmodel) + { + case CM_SMALL: + ptr->x_ix86_cmodel = CM_SMALL_PIC; + break; + + case CM_MEDIUM: + ptr->x_ix86_cmodel = CM_MEDIUM_PIC; + break; + + case CM_LARGE: + ptr->x_ix86_cmodel = CM_LARGE_PIC; + break; + + case CM_KERNEL: + error ("code model %s does not support PIC mode", "kernel"); + break; + + default: + break; + } + else + switch (ptr->x_ix86_cmodel) + { + case CM_SMALL_PIC: + ptr->x_ix86_cmodel = CM_SMALL; + break; + + case CM_MEDIUM_PIC: + ptr->x_ix86_cmodel = CM_MEDIUM; + break; + + case CM_LARGE_PIC: + ptr->x_ix86_cmodel = CM_LARGE; + break; + + default: + break; + } +} + /* Print the current options */ static void @@ -52007,6 +52059,9 @@ ix86_initialize_bounds (tree var, tree lb, tree ub, tree *stmts) #undef TARGET_OPTION_RESTORE #define TARGET_OPTION_RESTORE ix86_function_specific_restore +#undef TARGET_OPTION_POST_STREAM_IN +#define TARGET_OPTION_POST_STREAM_IN ix86_function_specific_post_stream_in + #undef TARGET_OPTION_PRINT #define TARGET_OPTION_PRINT ix86_function_specific_print diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 6f36ec624d2..6e5d2c04411 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -9905,6 +9905,12 @@ information in the @code{struct cl_target_option} structure for function-specific options to the @code{struct gcc_options} structure. @end deftypefn +@deftypefn {Target Hook} void TARGET_OPTION_POST_STREAM_IN (struct cl_target_option *@var{ptr}) +This hook is called to update target-specific information in the +@code{struct cl_target_option} structure after it is streamed in from +LTO bytecode. +@end deftypefn + @deftypefn {Target Hook} void TARGET_OPTION_PRINT (FILE *@var{file}, int @var{indent}, struct cl_target_option *@var{ptr}) This hook is called to print any additional target-specific information in the @code{struct cl_target_option} structure for diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 121c3057ba2..16d5df769af 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -7251,6 +7251,8 @@ on this implementation detail. @hook TARGET_OPTION_RESTORE +@hook TARGET_OPTION_POST_STREAM_IN + @hook TARGET_OPTION_PRINT @hook TARGET_OPTION_PRAGMA_PARSE diff --git a/gcc/target.def b/gcc/target.def index 035dece8fa5..a00181aa9bb 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -5501,6 +5501,15 @@ information in the @code{struct cl_target_option} structure for\n\ function-specific options to the @code{struct gcc_options} structure.", void, (struct gcc_options *opts, struct cl_target_option *ptr), NULL) +/* Function to update target-specific option information after being + streamed in. */ +DEFHOOK +(post_stream_in, + "This hook is called to update target-specific information in the\n\ +@code{struct cl_target_option} structure after it is streamed in from\n\ +LTO bytecode.", + void, (struct cl_target_option *ptr), NULL) + /* Function to print any extra target state from the target options structure. */ DEFHOOK diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index b4b64823851..94b6e51e873 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -559,7 +559,11 @@ streamer_read_tree_bitfields (struct lto_input_block *ib, #ifndef ACCEL_COMPILER if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) - cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr)); + { + cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr)); + if (targetm.target_option.post_stream_in) + targetm.target_option.post_stream_in (TREE_TARGET_OPTION (expr)); + } #endif if (code == OMP_CLAUSE)