Message ID | 20210108082417.GT725145@tucnak |
---|---|
State | New |
Headers | show |
Series | i386: Fix -mcmodel= vs. target attribute [PR98585] | expand |
On Fri, Jan 8, 2021 at 9:24 AM Jakub Jelinek <jakub@redhat.com> wrote: > > Hi! > > My patch to save/restore opts_set rather than essentially treating > global_options_set as a logical or whether some option has ever been > explicitly set somewhere apparently broke -mcmodel= vs. target attribute > (and as the patch shows some other options too). > The thing is, at least for options for which we ever test opts_set->x_* > or global_options_set.x_*, we need to save/restore them next to the > saving/restoring of the actual option values. > If an option has Save keyword or in case of TargetVariable, it is the > generic code that handles the saving and restoring of both the option > and corresponding opts_set flag automatically, for other variables > (TargetSave, or Target without Save) the backend needs to do that in the > target hook manually and in that case should save/restore both the option > values (the hooks mostly did that) and opts_set (they didn't). > > As it seems much easier to let the automatic saving/restoring do the work > for us unless the saving/restoring of the option needs some specific magic, > the following patch is a result of grepping through the backend for > opts_set->x_ and global_options_set.x_ and for all such referenced > variables, grepping whether it is saved/restored including opts_set properly > in the generated options-save.c or not. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2021-01-07 Jakub Jelinek <jakub@redhat.com> > > PR target/98585 > * config/i386/i386.opt (ix86_cmodel, ix86_incoming_stack_boundary_arg, > ix86_pmode, ix86_preferred_stack_boundary_arg, ix86_regparm, > ix86_veclibabi_type): Remove x_ prefix, use TargetVariable instead of > TargetSave and initialize for variables with enum types. > (mfentry, mstack-protector-guard-reg=, mstack-protector-guard-offset=, > mstack-protector-guard-symbol=): Add Save. > > * config/i386/i386-options.c (ix86_function_specific_save, > ix86_function_specific_restore): Don't save or restore x_ix86_cmodel, > x_ix86_incoming_stack_boundary_arg, x_ix86_pmode, > x_ix86_preferred_stack_boundary_arg, x_ix86_regparm, > x_ix86_veclibabi_type. > > * gcc.target/i386/pr98585.c: New test. LGTM. Thanks, Uros. > --- gcc/config/i386/i386.opt.jj 2021-01-07 21:08:41.017459644 +0100 > +++ gcc/config/i386/i386.opt 2021-01-07 21:16:02.468563270 +0100 > @@ -105,8 +105,8 @@ TargetSave > unsigned char arch_specified > > ;; -mcmodel= model > -TargetSave > -enum cmodel x_ix86_cmodel > +TargetVariable > +enum cmodel ix86_cmodel = CM_32 > > ;; -mabi= > TargetSave > @@ -133,24 +133,24 @@ TargetSave > int x_ix86_force_drap > > ;; -mincoming-stack-boundary= > -TargetSave > -int x_ix86_incoming_stack_boundary_arg > +TargetVariable > +int ix86_incoming_stack_boundary_arg > > ;; -maddress-mode= > -TargetSave > -enum pmode x_ix86_pmode > +TargetVariable > +enum pmode ix86_pmode = PMODE_SI > > ;; -mpreferred-stack-boundary= > -TargetSave > -int x_ix86_preferred_stack_boundary_arg > +TargetVariable > +int ix86_preferred_stack_boundary_arg > > ;; -mrecip= > TargetSave > const char *x_ix86_recip_name > > ;; -mregparm= > -TargetSave > -int x_ix86_regparm > +TargetVariable > +int ix86_regparm > > ;; -mlarge-data-threshold= > TargetSave > @@ -189,8 +189,8 @@ TargetSave > int x_ix86_tune_no_default > > ;; -mveclibabi= > -TargetSave > -enum ix86_veclibabi x_ix86_veclibabi_type > +TargetVariable > +enum ix86_veclibabi ix86_veclibabi_type = ix86_veclibabi_type_none > > ;; x86 options > m128bit-long-double > @@ -934,7 +934,7 @@ Target Mask(ISA_PREFETCHWT1) Var(ix86_is > Support PREFETCHWT1 built-in functions and code generation. > > mfentry > -Target Var(flag_fentry) > +Target Save Var(flag_fentry) > Emit profiling counter call at function entry before prologue. > > mrecord-mcount > @@ -1005,21 +1005,21 @@ EnumValue > Enum(stack_protector_guard) String(global) Value(SSP_GLOBAL) > > mstack-protector-guard-reg= > -Target RejectNegative Joined Var(ix86_stack_protector_guard_reg_str) > +Target Save RejectNegative Joined Var(ix86_stack_protector_guard_reg_str) > Use the given base register for addressing the stack-protector guard. > > TargetVariable > addr_space_t ix86_stack_protector_guard_reg = ADDR_SPACE_GENERIC > > mstack-protector-guard-offset= > -Target RejectNegative Joined Integer Var(ix86_stack_protector_guard_offset_str) > +Target Save RejectNegative Joined Integer Var(ix86_stack_protector_guard_offset_str) > Use the given offset for addressing the stack-protector guard. > > TargetVariable > HOST_WIDE_INT ix86_stack_protector_guard_offset = 0 > > mstack-protector-guard-symbol= > -Target RejectNegative Joined Integer Var(ix86_stack_protector_guard_symbol_str) > +Target Save RejectNegative Joined Integer Var(ix86_stack_protector_guard_symbol_str) > Use the given symbol for addressing the stack-protector guard. > > mmitigate-rop > --- gcc/config/i386/i386-options.c.jj 2021-01-04 10:25:45.426159170 +0100 > +++ gcc/config/i386/i386-options.c 2021-01-07 21:08:57.175280431 +0100 > @@ -651,18 +651,13 @@ ix86_function_specific_save (struct cl_t > 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; > @@ -672,7 +667,6 @@ ix86_function_specific_save (struct cl_t > 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. */ > @@ -788,18 +782,13 @@ ix86_function_specific_restore (struct g > 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; > @@ -809,7 +798,6 @@ ix86_function_specific_restore (struct g > 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; > ix86_tune_cost = processor_cost_table[ix86_tune]; > /* TODO: ix86_cost should be chosen at instruction or function granuality > so for cold code we use size_cost even in !optimize_size compilation. */ > --- gcc/testsuite/gcc.target/i386/pr98585.c.jj 2021-01-07 21:19:06.323524031 +0100 > +++ gcc/testsuite/gcc.target/i386/pr98585.c 2021-01-07 21:18:51.171692091 +0100 > @@ -0,0 +1,14 @@ > +/* PR target/98585 */ > +/* { dg-do compile { target *-*-linux* } } */ > +/* { dg-require-effective-target lp64 } */ > +/* { dg-options "-O2 -mcmodel=large -masm=att" } */ > +/* { dg-final { scan-assembler "movabs\[^\n\r]*bar" } } */ > + > +void bar (void); > + > +void > +__attribute__ ((target ("bmi2"))) > +foo() > +{ > + bar (); > +} > > Jakub >
--- gcc/config/i386/i386.opt.jj 2021-01-07 21:08:41.017459644 +0100 +++ gcc/config/i386/i386.opt 2021-01-07 21:16:02.468563270 +0100 @@ -105,8 +105,8 @@ TargetSave unsigned char arch_specified ;; -mcmodel= model -TargetSave -enum cmodel x_ix86_cmodel +TargetVariable +enum cmodel ix86_cmodel = CM_32 ;; -mabi= TargetSave @@ -133,24 +133,24 @@ TargetSave int x_ix86_force_drap ;; -mincoming-stack-boundary= -TargetSave -int x_ix86_incoming_stack_boundary_arg +TargetVariable +int ix86_incoming_stack_boundary_arg ;; -maddress-mode= -TargetSave -enum pmode x_ix86_pmode +TargetVariable +enum pmode ix86_pmode = PMODE_SI ;; -mpreferred-stack-boundary= -TargetSave -int x_ix86_preferred_stack_boundary_arg +TargetVariable +int ix86_preferred_stack_boundary_arg ;; -mrecip= TargetSave const char *x_ix86_recip_name ;; -mregparm= -TargetSave -int x_ix86_regparm +TargetVariable +int ix86_regparm ;; -mlarge-data-threshold= TargetSave @@ -189,8 +189,8 @@ TargetSave int x_ix86_tune_no_default ;; -mveclibabi= -TargetSave -enum ix86_veclibabi x_ix86_veclibabi_type +TargetVariable +enum ix86_veclibabi ix86_veclibabi_type = ix86_veclibabi_type_none ;; x86 options m128bit-long-double @@ -934,7 +934,7 @@ Target Mask(ISA_PREFETCHWT1) Var(ix86_is Support PREFETCHWT1 built-in functions and code generation. mfentry -Target Var(flag_fentry) +Target Save Var(flag_fentry) Emit profiling counter call at function entry before prologue. mrecord-mcount @@ -1005,21 +1005,21 @@ EnumValue Enum(stack_protector_guard) String(global) Value(SSP_GLOBAL) mstack-protector-guard-reg= -Target RejectNegative Joined Var(ix86_stack_protector_guard_reg_str) +Target Save RejectNegative Joined Var(ix86_stack_protector_guard_reg_str) Use the given base register for addressing the stack-protector guard. TargetVariable addr_space_t ix86_stack_protector_guard_reg = ADDR_SPACE_GENERIC mstack-protector-guard-offset= -Target RejectNegative Joined Integer Var(ix86_stack_protector_guard_offset_str) +Target Save RejectNegative Joined Integer Var(ix86_stack_protector_guard_offset_str) Use the given offset for addressing the stack-protector guard. TargetVariable HOST_WIDE_INT ix86_stack_protector_guard_offset = 0 mstack-protector-guard-symbol= -Target RejectNegative Joined Integer Var(ix86_stack_protector_guard_symbol_str) +Target Save RejectNegative Joined Integer Var(ix86_stack_protector_guard_symbol_str) Use the given symbol for addressing the stack-protector guard. mmitigate-rop --- gcc/config/i386/i386-options.c.jj 2021-01-04 10:25:45.426159170 +0100 +++ gcc/config/i386/i386-options.c 2021-01-07 21:08:57.175280431 +0100 @@ -651,18 +651,13 @@ ix86_function_specific_save (struct cl_t 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; @@ -672,7 +667,6 @@ ix86_function_specific_save (struct cl_t 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. */ @@ -788,18 +782,13 @@ ix86_function_specific_restore (struct g 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; @@ -809,7 +798,6 @@ ix86_function_specific_restore (struct g 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; ix86_tune_cost = processor_cost_table[ix86_tune]; /* TODO: ix86_cost should be chosen at instruction or function granuality so for cold code we use size_cost even in !optimize_size compilation. */ --- gcc/testsuite/gcc.target/i386/pr98585.c.jj 2021-01-07 21:19:06.323524031 +0100 +++ gcc/testsuite/gcc.target/i386/pr98585.c 2021-01-07 21:18:51.171692091 +0100 @@ -0,0 +1,14 @@ +/* PR target/98585 */ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mcmodel=large -masm=att" } */ +/* { dg-final { scan-assembler "movabs\[^\n\r]*bar" } } */ + +void bar (void); + +void +__attribute__ ((target ("bmi2"))) +foo() +{ + bar (); +}