diff options
author | tmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-03 03:14:09 +0000 |
---|---|---|
committer | tmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-03 03:14:09 +0000 |
commit | 9e196e8e9e95965beb6774b79eb683f598ffe413 (patch) | |
tree | 008202786e69247dd609add1c42e242d3e1dd2de | |
parent | 39f74d6673195737d5b8c6880b8c1ab9c1318cd2 (diff) | |
download | gcc-9e196e8e9e95965beb6774b79eb683f598ffe413.tar.gz |
This patch fixes PR 58944
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58944
ix86_valid_target_attribute_tree in config/i386/i386.c was
refactored to not depend on global_options structure and to be able to
use any gcc_options structure. One clean way to fix this is by having
target_option_default_node save all the default target options which
can be restored to any gcc_options structure. The root cause of the
above bugs was that ix86_arch_string and ix86_tune_string was not
saved in target_option_deault_node.
This patch saves all the target options used in i386.opt which are
either obtained from the command-line or set to some default.
Testing:
Patch tested for bootstrap on all default languages(also obj-c++ and ada)
on x86_64 and regression testsuite checked for parity with RUNTESTFLAGS -m32
and m64.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205616 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 39 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 60 | ||||
-rw-r--r-- | gcc/config/i386/i386.opt | 96 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr58944.c | 11 |
5 files changed, 205 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aa1c22a3ec0..df4c84cac9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,42 @@ +2013-12-02 Sriraman Tallam <tmsriram@google.com> + + PR target/58944 + * config/i386/i386.opt (ix86_arch_string): Mark this variable + for saving in cl_target_option. + (ix86_tune_string): Ditto. + (ix86_cmodel): Ditto. + (ix86_abi): Ditto. + (ix86_asm_dialect): Ditto. + (ix86_branch_cost): Ditto. + (ix86_dump_tunes): Ditto. + (ix86_force_align_arg_pointer): Ditto. + (ix86_force_drap): Ditto. + (ix86_incoming_stack_boundary_arg): Ditto. + (ix86_pmode): Ditto. + (ix86_preferred_stack_boundary_arg): Ditto. + (ix86_recip_name): Ditto. + (ix86_regparm): Ditto. + (ix86_section_threshold): Ditto. + (ix86_sse2avx): Ditto. + (ix86_stack_protector_guard): Ditto. + (ix86_stringop_alg): Ditto. + (ix86_tls_dialect): Ditto. + (ix86_tune_ctrl_string): Ditto. + (ix86_tune_memcpy_strategy): Ditto. + (ix86_tune_memset_strategy): Ditto. + (ix86_tune_no_default): Ditto. + (ix86_veclibabi_type): Ditto. + * config/i386/i386.c + (function_specific_save): Save the above variables + in gcc_options to cl_target_option. + (function_specific_restore): Do the reverse done in + function_specific_save. + (ix86_valid_target_attribute_tree): Change ix86_arch_string + and ix86_tune_string to use the opts structure. + (ix86_option_override_internal):Change + ix86_incoming_stack_boundary_arg to + opts->x_ix86_incoming_stack_boundary_arg + 2013-12-02 Joern Rennecke <joern.rennecke@embecosm.com> * config/epiphany/epiphany.h: Wrap rtl_opt_pass declarations diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b11363be2df..81e9ce83489 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3866,16 +3866,16 @@ ix86_option_override_internal (bool main_args_p, ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary; if (opts_set->x_ix86_incoming_stack_boundary_arg) { - if (ix86_incoming_stack_boundary_arg + if (opts->x_ix86_incoming_stack_boundary_arg < (TARGET_64BIT_P (opts->x_ix86_isa_flags) ? 4 : 2) - || ix86_incoming_stack_boundary_arg > 12) + || opts->x_ix86_incoming_stack_boundary_arg > 12) error ("-mincoming-stack-boundary=%d is not between %d and 12", - ix86_incoming_stack_boundary_arg, + opts->x_ix86_incoming_stack_boundary_arg, TARGET_64BIT_P (opts->x_ix86_isa_flags) ? 4 : 2); else { ix86_user_incoming_stack_boundary - = (1 << ix86_incoming_stack_boundary_arg) * BITS_PER_UNIT; + = (1 << opts->x_ix86_incoming_stack_boundary_arg) * BITS_PER_UNIT; ix86_incoming_stack_boundary = ix86_user_incoming_stack_boundary; } @@ -4282,6 +4282,30 @@ ix86_function_specific_save (struct cl_target_option *ptr, ptr->x_ix86_isa_flags_explicit = opts->x_ix86_isa_flags_explicit; ptr->x_ix86_target_flags_explicit = opts->x_ix86_target_flags_explicit; ptr->x_recip_mask_explicit = opts->x_recip_mask_explicit; + ptr->x_ix86_arch_string = opts->x_ix86_arch_string; + ptr->x_ix86_tune_string = opts->x_ix86_tune_string; + ptr->x_ix86_cmodel = opts->x_ix86_cmodel; + ptr->x_ix86_abi = opts->x_ix86_abi; + ptr->x_ix86_asm_dialect = opts->x_ix86_asm_dialect; + ptr->x_ix86_branch_cost = opts->x_ix86_branch_cost; + ptr->x_ix86_dump_tunes = opts->x_ix86_dump_tunes; + ptr->x_ix86_force_align_arg_pointer = opts->x_ix86_force_align_arg_pointer; + ptr->x_ix86_force_drap = opts->x_ix86_force_drap; + ptr->x_ix86_incoming_stack_boundary_arg = opts->x_ix86_incoming_stack_boundary_arg; + ptr->x_ix86_pmode = opts->x_ix86_pmode; + ptr->x_ix86_preferred_stack_boundary_arg = opts->x_ix86_preferred_stack_boundary_arg; + ptr->x_ix86_recip_name = opts->x_ix86_recip_name; + ptr->x_ix86_regparm = opts->x_ix86_regparm; + ptr->x_ix86_section_threshold = opts->x_ix86_section_threshold; + ptr->x_ix86_sse2avx = opts->x_ix86_sse2avx; + ptr->x_ix86_stack_protector_guard = opts->x_ix86_stack_protector_guard; + ptr->x_ix86_stringop_alg = opts->x_ix86_stringop_alg; + ptr->x_ix86_tls_dialect = opts->x_ix86_tls_dialect; + ptr->x_ix86_tune_ctrl_string = opts->x_ix86_tune_ctrl_string; + ptr->x_ix86_tune_memcpy_strategy = opts->x_ix86_tune_memcpy_strategy; + ptr->x_ix86_tune_memset_strategy = opts->x_ix86_tune_memset_strategy; + ptr->x_ix86_tune_no_default = opts->x_ix86_tune_no_default; + ptr->x_ix86_veclibabi_type = opts->x_ix86_veclibabi_type; /* The fields are char but the variables are not; make sure the values fit in the fields. */ @@ -4311,6 +4335,30 @@ ix86_function_specific_restore (struct gcc_options *opts, opts->x_ix86_isa_flags_explicit = ptr->x_ix86_isa_flags_explicit; opts->x_ix86_target_flags_explicit = ptr->x_ix86_target_flags_explicit; opts->x_recip_mask_explicit = ptr->x_recip_mask_explicit; + opts->x_ix86_arch_string = ptr->x_ix86_arch_string; + opts->x_ix86_tune_string = ptr->x_ix86_tune_string; + opts->x_ix86_cmodel = ptr->x_ix86_cmodel; + opts->x_ix86_abi = ptr->x_ix86_abi; + opts->x_ix86_asm_dialect = ptr->x_ix86_asm_dialect; + opts->x_ix86_branch_cost = ptr->x_ix86_branch_cost; + opts->x_ix86_dump_tunes = ptr->x_ix86_dump_tunes; + opts->x_ix86_force_align_arg_pointer = ptr->x_ix86_force_align_arg_pointer; + opts->x_ix86_force_drap = ptr->x_ix86_force_drap; + opts->x_ix86_incoming_stack_boundary_arg = ptr->x_ix86_incoming_stack_boundary_arg; + opts->x_ix86_pmode = ptr->x_ix86_pmode; + opts->x_ix86_preferred_stack_boundary_arg = ptr->x_ix86_preferred_stack_boundary_arg; + opts->x_ix86_recip_name = ptr->x_ix86_recip_name; + opts->x_ix86_regparm = ptr->x_ix86_regparm; + opts->x_ix86_section_threshold = ptr->x_ix86_section_threshold; + opts->x_ix86_sse2avx = ptr->x_ix86_sse2avx; + opts->x_ix86_stack_protector_guard = ptr->x_ix86_stack_protector_guard; + opts->x_ix86_stringop_alg = ptr->x_ix86_stringop_alg; + opts->x_ix86_tls_dialect = ptr->x_ix86_tls_dialect; + opts->x_ix86_tune_ctrl_string = ptr->x_ix86_tune_ctrl_string; + opts->x_ix86_tune_memcpy_strategy = ptr->x_ix86_tune_memcpy_strategy; + opts->x_ix86_tune_memset_strategy = ptr->x_ix86_tune_memset_strategy; + opts->x_ix86_tune_no_default = ptr->x_ix86_tune_no_default; + opts->x_ix86_veclibabi_type = ptr->x_ix86_veclibabi_type; /* Recreate the arch feature tests if the arch changed */ if (old_arch != ix86_arch) @@ -4625,8 +4673,8 @@ ix86_valid_target_attribute_tree (tree args, struct gcc_options *opts, struct gcc_options *opts_set) { - const char *orig_arch_string = ix86_arch_string; - const char *orig_tune_string = ix86_tune_string; + const char *orig_arch_string = opts->x_ix86_arch_string; + const char *orig_tune_string = opts->x_ix86_tune_string; enum fpmath_unit orig_fpmath_set = opts_set->x_ix86_fpmath; int orig_tune_defaulted = ix86_tune_defaulted; int orig_arch_specified = ix86_arch_specified; diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index 5b3219aaf22..1704c526746 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -48,6 +48,14 @@ unsigned char arch TargetSave unsigned char tune +;; -march= processor-string +TargetSave +const char *x_ix86_arch_string + +;; -mtune= processor-string +TargetSave +const char *x_ix86_tune_string + ;; CPU schedule model TargetSave unsigned char schedule @@ -76,6 +84,94 @@ unsigned char tune_defaulted TargetSave unsigned char arch_specified +;; -mcmodel= model +TargetSave +enum cmodel x_ix86_cmodel + +;; -mabi= +TargetSave +enum calling_abi x_ix86_abi + +;; -masm= +TargetSave +enum asm_dialect x_ix86_asm_dialect + +;; -mbranch-cost= +TargetSave +int x_ix86_branch_cost + +;; -mdump-tune-features= +TargetSave +int x_ix86_dump_tunes + +;; -mstackrealign= +TargetSave +int x_ix86_force_align_arg_pointer + +;; -mforce-drap= +TargetSave +int x_ix86_force_drap + +;; -mincoming-stack-boundary= +TargetSave +int x_ix86_incoming_stack_boundary_arg + +;; -maddress-mode= +TargetSave +enum pmode x_ix86_pmode + +;; -mpreferred-stack-boundary= +TargetSave +int x_ix86_preferred_stack_boundary_arg + +;; -mrecip= +TargetSave +const char *x_ix86_recip_name + +;; -mregparm= +TargetSave +int x_ix86_regparm + +;; -mlarge-data-threshold= +TargetSave +int x_ix86_section_threshold + +;; -msse2avx= +TargetSave +int x_ix86_sse2avx + +;; -mstack-protector-guard= +TargetSave +enum stack_protector_guard x_ix86_stack_protector_guard + +;; -mstringop-strategy= +TargetSave +enum stringop_alg x_ix86_stringop_alg + +;; -mtls-dialect= +TargetSave +enum tls_dialect x_ix86_tls_dialect + +;; -mtune-ctrl= +TargetSave +const char *x_ix86_tune_ctrl_string + +;; -mmemcpy-strategy= +TargetSave +const char *x_ix86_tune_memcpy_strategy + +;; -mmemset-strategy= +TargetSave +const char *x_ix86_tune_memset_strategy + +;; -mno-default= +TargetSave +int x_ix86_tune_no_default + +;; -mveclibabi= +TargetSave +enum ix86_veclibabi x_ix86_veclibabi_type + ;; x86 options m128bit-long-double Target RejectNegative Report Mask(128BIT_LONG_DOUBLE) Save diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4443d2515a..579c59ba1b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-02 Sriraman Tallam <tmsriram@google.com> + + PR target/58944 + * testsuite/gcc.target/i386/pr58944.c: New test. + 2013-12-02 Joseph Myers <joseph@codesourcery.com> PR c/58235 diff --git a/gcc/testsuite/gcc.target/i386/pr58944.c b/gcc/testsuite/gcc.target/i386/pr58944.c new file mode 100644 index 00000000000..8164cf99508 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr58944.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-Wunused-macros -march=native" } */ + +#pragma GCC push_options +#pragma GCC target("xsaveopt") +void fn1(void) {} +#pragma GCC pop_options + +/* { dg-prune-output "macro \"__code_model_" } */ +/* { dg-prune-output "macro \"__XSAVE__\" is not used" } */ +/* { dg-prune-output "macro \"__XSAVEOPT__\" is not used" } */ |