[PATCH] Fix PR58944

Sriraman Tallam tmsriram@google.com
Tue Nov 26 00:45:00 GMT 2013


Hi,

  I have attached a patch to fix this bug :

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58944

  A similar problem was also reported here:
http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01050.html


  Recently, 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  in PR58944 and
ix86_preferred_stack_boundary_arg was not saved in the latter case.

   This patch saves all the  target options used in i386.opt which are
either obtained from the command-line or set to some default. Is this
patch alright?

Thanks
Sri
-------------- next part --------------
	* 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.
	* testsuite/gcc.target/i386/pr58944.c: New test.

Index: testsuite/gcc.target/i386/pr58944.c
===================================================================
--- testsuite/gcc.target/i386/pr58944.c	(revision 0)
+++ testsuite/gcc.target/i386/pr58944.c	(revision 0)
@@ -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_small__\" is not used" } */ 
+/* { dg-prune-output "macro \"__XSAVE__\" is not used" } */ 
+/* { dg-prune-output "macro \"__XSAVEOPT__\" is not used" } */ 
Index: config/i386/i386.opt
===================================================================
--- config/i386/i386.opt	(revision 205232)
+++ config/i386/i386.opt	(working copy)
@@ -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: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 205232)
+++ config/i386/i386.c	(working copy)
@@ -4284,6 +4284,30 @@ ix86_function_specific_save (struct cl_target_opti
   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.  */
@@ -4313,6 +4337,30 @@ ix86_function_specific_restore (struct gcc_options
   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)
@@ -4627,8 +4675,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;


More information about the Gcc-patches mailing list