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. --- 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