summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-03 03:14:09 +0000
committertmsriram <tmsriram@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-03 03:14:09 +0000
commit9e196e8e9e95965beb6774b79eb683f598ffe413 (patch)
tree008202786e69247dd609add1c42e242d3e1dd2de
parent39f74d6673195737d5b8c6880b8c1ab9c1318cd2 (diff)
downloadgcc-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/ChangeLog39
-rw-r--r--gcc/config/i386/i386.c60
-rw-r--r--gcc/config/i386/i386.opt96
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr58944.c11
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" } */