On 16.02.19 18:49, Jakub Jelinek wrote: > Hi! > > If S390_USE_TARGET_ATTRIBUTE is 0 (e.g. because of configuring against old > binutils or even with no binutils at all), then indirect jumps are emitted > unconditionally, no matter what is selected on the command line, including > the default options. The problem is that s390_indirect_branch_settings > is never called and only that function sets the flags the *.md macros test. > > Fixed thusly, bootstrapped/regtested on s390x-linux (with recent binutils) > and tested on x86_64-linux -> s390x-linux cross (without any binutils). > Ok for trunk and after a while for release branches? > > 2019-02-16 Jakub Jelinek <ja...@redhat.com> > > PR target/89361 > * config/s390/s390.c (s390_indirect_branch_attrvalue, > s390_indirect_branch_settings): Define unconditionally. > (s390_set_current_function): Likewise, but guard the whole body except > the s390_indirect_branch_settings call with > #if S390_USE_TARGET_ATTRIBUTE. > (TARGET_SET_CURRENT_FUNCTION): Redefine unconditionally.
Ok. Thanks for taking care of this! Andreas > > --- gcc/config/s390/s390.c.jj 2019-02-12 21:48:52.944076465 +0100 > +++ gcc/config/s390/s390.c 2019-02-15 14:16:46.053206087 +0100 > @@ -15462,6 +15462,7 @@ s390_can_inline_p (tree caller, tree cal > > return ret; > } > +#endif > > /* Set VAL to correct enum value according to the indirect-branch or > function-return attribute in ATTR. */ > @@ -15535,6 +15536,7 @@ s390_indirect_branch_settings (tree fnde > s390_indirect_branch_attrvalue (attr, > &cfun->machine->function_return_mem); > } > > +#if S390_USE_TARGET_ATTRIBUTE > /* Restore targets globals from NEW_TREE and invalidate s390_previous_fndecl > cache. */ > > @@ -15550,6 +15552,7 @@ s390_activate_target_options (tree new_t > TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts (); > s390_previous_fndecl = NULL_TREE; > } > +#endif > > /* Establish appropriate back-end context for processing the function > FNDECL. The argument might be NULL to indicate processing at top > @@ -15557,6 +15560,7 @@ s390_activate_target_options (tree new_t > static void > s390_set_current_function (tree fndecl) > { > +#if S390_USE_TARGET_ATTRIBUTE > /* Only change the context if the function changes. This hook is called > several times in the course of compiling a function, and we don't want > to > slow things down too much or call target_reinit when it isn't safe. */ > @@ -15588,10 +15592,9 @@ s390_set_current_function (tree fndecl) > if (old_tree != new_tree) > s390_activate_target_options (new_tree); > s390_previous_fndecl = fndecl; > - > +#endif > s390_indirect_branch_settings (fndecl); > } > -#endif > > /* Implement TARGET_USE_BY_PIECES_INFRASTRUCTURE_P. */ > > @@ -16331,10 +16334,10 @@ s390_case_values_threshold (void) > #undef TARGET_ASM_FILE_END > #define TARGET_ASM_FILE_END s390_asm_file_end > > -#if S390_USE_TARGET_ATTRIBUTE > #undef TARGET_SET_CURRENT_FUNCTION > #define TARGET_SET_CURRENT_FUNCTION s390_set_current_function > > +#if S390_USE_TARGET_ATTRIBUTE > #undef TARGET_OPTION_VALID_ATTRIBUTE_P > #define TARGET_OPTION_VALID_ATTRIBUTE_P s390_valid_target_attribute_p > > > Jakub >