* 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;