This patch fixes PR 58944
authortmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Dec 2013 03:14:09 +0000 (03:14 +0000)
committertmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Dec 2013 03:14:09 +0000 (03:14 +0000)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.opt
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr58944.c [new file with mode: 0644]

index aa1c22a..df4c84c 100644 (file)
@@ -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
index b11363b..81e9ce8 100644 (file)
@@ -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;
index 5b3219a..1704c52 100644 (file)
@@ -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
index f4443d2..579c59b 100644 (file)
@@ -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 (file)
index 0000000..8164cf9
--- /dev/null
@@ -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" } */