From 7a77f1ac2c6f899faa39e8c0b42d4284d586c44e Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sun, 10 May 2020 08:03:08 -0700 Subject: [PATCH] xtensa: allow runtime ABI selection 2020-06-15 Max Filippov bfd/ * elf32-xtensa.c (XSHAL_ABI, XTHAL_ABI_UNDEFINED) (XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New macros. (elf32xtensa_abi): New global variable. (xtensa_abi_choice): New function. (elf_xtensa_create_plt_entry): Use xtensa_abi_choice instead of XSHAL_ABI to select PLT code. gas/ * config/tc-xtensa.c (XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New macros. (elf32xtensa_abi): New declaration. (option_abi_windowed, option_abi_call0): New enum constants. (md_longopts): Add entries for --abi-windowed and --abi-call0. (md_parse_option): Add handlers for --abi-windowed and --abi-call0. (xtensa_add_config_info): Use xtensa_abi_choice instead of XSHAL_ABI to format ABI tag. * doc/as.texi (Target Xtensa options): Add --abi-windowed and --abi-call0 to the list of options. * doc/c-xtensa.texi: Add description for options --abi-windowed and --abi-call0. * testsuite/gas/xtensa/abi-call0.d: New test definition. * testsuite/gas/xtensa/abi-windowed.d: New test definition. * testsuite/gas/xtensa/abi.s: New test source. include/ * elf/xtensa.h (xtensa_abi_choice): New declaration. ld/ * emultempl/xtensaelf.em (XSHAL_ABI): Remove macro definition. (XTHAL_ABI_UNDEFINED, XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New macros. (elf32xtensa_abi): New declaration. (xt_config_info_unpack_and_check): Set elf32xtensa_abi if it is undefined. Use xtensa_abi_choice instead of XSHAL_ABI to test ABI tag consistency. (xtensa_add_config_info): Use xtensa_abi_choice instead of XSHAL_ABI to format ABI tag. (PARSE_AND_LIST_PROLOGUE): Define OPTION_ABI_WINDOWED, OPTION_ABI_CALL0 and declare elf32xtensa_abi. (PARSE_AND_LIST_LONGOPTS): Add entries for --abi-windowed and --abi-call0. (PARSE_AND_LIST_OPTIONS): Add help text for --abi-windowed and --abi-call0. (PARSE_AND_LIST_ARGS_CASES): Add handlers for --abi-windowed and --abi-call0. * ld.texi: Add description for options --abi-windowed and --abi-call0. --- bfd/ChangeLog | 9 ++++++ bfd/elf32-xtensa.c | 34 ++++++++++++++++++-- gas/ChangeLog | 19 ++++++++++++ gas/config/tc-xtensa.c | 29 ++++++++++++++--- gas/doc/as.texi | 1 + gas/doc/c-xtensa.texi | 8 +++++ gas/testsuite/gas/xtensa/abi-call0.d | 7 +++++ gas/testsuite/gas/xtensa/abi-windowed.d | 7 +++++ gas/testsuite/gas/xtensa/abi.s | 1 + include/ChangeLog | 4 +++ include/elf/xtensa.h | 3 ++ ld/ChangeLog | 22 +++++++++++++ ld/emultempl/xtensaelf.em | 41 ++++++++++++++++++++++--- ld/ld.texi | 11 +++++++ 14 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 gas/testsuite/gas/xtensa/abi-call0.d create mode 100644 gas/testsuite/gas/xtensa/abi-windowed.d create mode 100644 gas/testsuite/gas/xtensa/abi.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 741e96962b1..ecd7f8d53ef 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2020-06-15 Max Filippov + + * elf32-xtensa.c (XSHAL_ABI, XTHAL_ABI_UNDEFINED) + (XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New macros. + (elf32xtensa_abi): New global variable. + (xtensa_abi_choice): New function. + (elf_xtensa_create_plt_entry): Use xtensa_abi_choice instead of + XSHAL_ABI to select PLT code. + 2020-06-15 Roland McGrath * elflink.c (bfd_elf_define_start_stop): Use start_stop_visibility diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 9dc815edbb3..b223424cce4 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -37,6 +37,22 @@ #define XTENSA_NO_NOP_REMOVAL 0 +#ifndef XSHAL_ABI +#define XSHAL_ABI 0 +#endif + +#ifndef XTHAL_ABI_UNDEFINED +#define XTHAL_ABI_UNDEFINED -1 +#endif + +#ifndef XTHAL_ABI_WINDOWED +#define XTHAL_ABI_WINDOWED 0 +#endif + +#ifndef XTHAL_ABI_CALL0 +#define XTHAL_ABI_CALL0 1 +#endif + /* Local helper functions. */ static bfd_boolean add_extra_plt_sections (struct bfd_link_info *, int); @@ -164,6 +180,10 @@ int elf32xtensa_no_literal_movement = 1; bfd_boolean elf32xtensa_separate_props = FALSE; +/* Xtensa ABI. It affects PLT entry code. */ + +int elf32xtensa_abi = XTHAL_ABI_UNDEFINED; + /* Rename one of the generic section flags to better document how it is used here. */ /* Whether relocations have been processed. */ @@ -2247,6 +2267,13 @@ bfd_elf_xtensa_reloc (bfd *abfd, return flag; } +int xtensa_abi_choice (void) +{ + if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED) + return XSHAL_ABI; + else + return elf32xtensa_abi; +} /* Set up an entry in the procedure linkage table. */ @@ -2259,6 +2286,7 @@ elf_xtensa_create_plt_entry (struct bfd_link_info *info, bfd_vma plt_base, got_base; bfd_vma code_offset, lit_offset, abi_offset; int chunk; + int abi = xtensa_abi_choice (); chunk = reloc_index / PLT_ENTRIES_PER_CHUNK; splt = elf_xtensa_get_plt_section (info, chunk); @@ -2279,10 +2307,10 @@ elf_xtensa_create_plt_entry (struct bfd_link_info *info, /* Fill in the entry in the procedure linkage table. */ memcpy (splt->contents + code_offset, (bfd_big_endian (output_bfd) - ? elf_xtensa_be_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED] - : elf_xtensa_le_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]), + ? elf_xtensa_be_plt_entry[abi != XTHAL_ABI_WINDOWED] + : elf_xtensa_le_plt_entry[abi != XTHAL_ABI_WINDOWED]), PLT_ENTRY_SIZE); - abi_offset = XSHAL_ABI == XTHAL_ABI_WINDOWED ? 3 : 0; + abi_offset = abi == XTHAL_ABI_WINDOWED ? 3 : 0; bfd_put_16 (output_bfd, l32r_offset (got_base + 0, plt_base + code_offset + abi_offset), splt->contents + code_offset + abi_offset + 1); diff --git a/gas/ChangeLog b/gas/ChangeLog index 0c74415526f..b19576d027a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,22 @@ +2020-06-15 Max Filippov + + * config/tc-xtensa.c (XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New + macros. + (elf32xtensa_abi): New declaration. + (option_abi_windowed, option_abi_call0): New enum constants. + (md_longopts): Add entries for --abi-windowed and --abi-call0. + (md_parse_option): Add handlers for --abi-windowed and + --abi-call0. + (xtensa_add_config_info): Use xtensa_abi_choice instead of + XSHAL_ABI to format ABI tag. + * doc/as.texi (Target Xtensa options): Add --abi-windowed and + --abi-call0 to the list of options. + * doc/c-xtensa.texi: Add description for options --abi-windowed + and --abi-call0. + * testsuite/gas/xtensa/abi-call0.d: New test definition. + * testsuite/gas/xtensa/abi-windowed.d: New test definition. + * testsuite/gas/xtensa/abi.s: New test source. + 2020-06-14 H.J. Lu PR gas/26115 diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 14a5a2a9497..b512f7a36ba 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -31,8 +31,12 @@ #include "elf/xtensa.h" /* Provide default values for new configuration settings. */ -#ifndef XSHAL_ABI -#define XSHAL_ABI 0 +#ifndef XTHAL_ABI_WINDOWED +#define XTHAL_ABI_WINDOWED 0 +#endif + +#ifndef XTHAL_ABI_CALL0 +#define XTHAL_ABI_CALL0 1 #endif #ifndef XTENSA_MARCH_EARLIEST @@ -648,6 +652,10 @@ static bfd_boolean workaround_all_short_loops = FALSE; This option is defined in BDF library. */ extern bfd_boolean elf32xtensa_separate_props; +/* Xtensa ABI. + This option is defined in BDF library. */ +extern int elf32xtensa_abi; + static void xtensa_setup_hw_workarounds (int earliest, int latest) { @@ -735,6 +743,9 @@ enum option_separate_props, option_no_separate_props, + + option_abi_windowed, + option_abi_call0, }; const char *md_shortopts = ""; @@ -816,6 +827,9 @@ struct option md_longopts[] = { "separate-prop-tables", no_argument, NULL, option_separate_props }, + { "abi-windowed", no_argument, NULL, option_abi_windowed }, + { "abi-call0", no_argument, NULL, option_abi_call0 }, + { NULL, no_argument, NULL, 0 } }; @@ -1044,6 +1058,14 @@ md_parse_option (int c, const char *arg) elf32xtensa_separate_props = FALSE; return 1; + case option_abi_windowed: + elf32xtensa_abi = XTHAL_ABI_WINDOWED; + return 1; + + case option_abi_call0: + elf32xtensa_abi = XTHAL_ABI_CALL0; + return 1; + default: return 0; } @@ -8958,7 +8980,6 @@ is_local_forward_loop (const TInsn *insn, fragS *fragP) return FALSE; } - #define XTINFO_NAME "Xtensa_Info" #define XTINFO_NAMESZ 12 #define XTINFO_TYPE 1 @@ -8975,7 +8996,7 @@ xtensa_add_config_info (void) data = XNEWVEC (char, 100); sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n", - XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI); + XSHAL_USE_ABSOLUTE_LITERALS, xtensa_abi_choice ()); sz = strlen (data) + 1; /* Add enough null terminators to pad to a word boundary. */ diff --git a/gas/doc/as.texi b/gas/doc/as.texi index dd6c96835f9..f8d892eaa5c 100644 --- a/gas/doc/as.texi +++ b/gas/doc/as.texi @@ -626,6 +626,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@b{--[no-]transform}] [@b{--rename-section} @var{oldname}=@var{newname}] [@b{--[no-]trampolines}] + [@b{--abi-windowed}|@b{--abi-call0}] @end ifset @ifset Z80 diff --git a/gas/doc/c-xtensa.texi b/gas/doc/c-xtensa.texi index e0c5e1ae288..b17ee83dbf4 100644 --- a/gas/doc/c-xtensa.texi +++ b/gas/doc/c-xtensa.texi @@ -122,6 +122,14 @@ across a greater range of addresses. @xref{Xtensa Jump Relaxation, potentially be out of range. In the absence of such jumps this option does not affect code size or performance. The default is @samp{--trampolines}. + +@item --abi-windowed | --abi-call0 +@kindex --abi-windowed +@kindex --abi-call0 +Choose ABI tag written to the @code{.xtensa.info} section. ABI tag +indicates ABI of the assembly code. A warning is issued by the linker +on an attempt to link object files with inconsistent ABI tags. +Default ABI is chosen by the Xtensa core configuration. @end table @c man end diff --git a/gas/testsuite/gas/xtensa/abi-call0.d b/gas/testsuite/gas/xtensa/abi-call0.d new file mode 100644 index 00000000000..83ff10d708d --- /dev/null +++ b/gas/testsuite/gas/xtensa/abi-call0.d @@ -0,0 +1,7 @@ +#as: --abi-call0 +#objdump: -j .xtensa.info -s +#source: abi.s + +#... +.*ABI=1.* +#... diff --git a/gas/testsuite/gas/xtensa/abi-windowed.d b/gas/testsuite/gas/xtensa/abi-windowed.d new file mode 100644 index 00000000000..9f10fd03697 --- /dev/null +++ b/gas/testsuite/gas/xtensa/abi-windowed.d @@ -0,0 +1,7 @@ +#as: --abi-windowed +#objdump: -j .xtensa.info -s +#source: abi.s + +#... +.*ABI=0.* +#... diff --git a/gas/testsuite/gas/xtensa/abi.s b/gas/testsuite/gas/xtensa/abi.s new file mode 100644 index 00000000000..09cc1e1f7cd --- /dev/null +++ b/gas/testsuite/gas/xtensa/abi.s @@ -0,0 +1 @@ + .text diff --git a/include/ChangeLog b/include/ChangeLog index f30e5e2a24a..7201be9f4d1 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2020-06-15 Max Filippov + + * elf/xtensa.h (xtensa_abi_choice): New declaration. + 2020-06-12 Roland McGrath * bfdlink.h (struct bfd_link_info): New field start_stop_visibility. diff --git a/include/elf/xtensa.h b/include/elf/xtensa.h index bd5c80d1377..eac1a15dc33 100644 --- a/include/elf/xtensa.h +++ b/include/elf/xtensa.h @@ -225,6 +225,9 @@ xtensa_read_table_entries (bfd *abfd, extern int xtensa_compute_fill_extra_space (property_table_entry *entry); +extern int +xtensa_abi_choice (void); + #ifdef __cplusplus } #endif diff --git a/ld/ChangeLog b/ld/ChangeLog index 6700e727d83..73a99a061e7 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,25 @@ +2020-06-15 Max Filippov + + * emultempl/xtensaelf.em (XSHAL_ABI): Remove macro definition. + (XTHAL_ABI_UNDEFINED, XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New + macros. + (elf32xtensa_abi): New declaration. + (xt_config_info_unpack_and_check): Set elf32xtensa_abi if it is + undefined. Use xtensa_abi_choice instead of XSHAL_ABI to test + ABI tag consistency. + (xtensa_add_config_info): Use xtensa_abi_choice instead of + XSHAL_ABI to format ABI tag. + (PARSE_AND_LIST_PROLOGUE): Define OPTION_ABI_WINDOWED, + OPTION_ABI_CALL0 and declare elf32xtensa_abi. + (PARSE_AND_LIST_LONGOPTS): Add entries for --abi-windowed and + --abi-call0. + (PARSE_AND_LIST_OPTIONS): Add help text for --abi-windowed and + --abi-call0. + (PARSE_AND_LIST_ARGS_CASES): Add handlers for --abi-windowed and + --abi-call0. + * ld.texi: Add description for options --abi-windowed and + --abi-call0. + 2020-06-15 Roland McGrath * NEWS: Mention -z start-stop-visibility=... option for ELF. diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index 932721c6f16..53f40c22830 100644 --- a/ld/emultempl/xtensaelf.em +++ b/ld/emultempl/xtensaelf.em @@ -30,8 +30,16 @@ fragment <