diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2020-05-10 08:03:08 -0700 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2020-06-15 13:01:30 -0700 |
commit | 7a77f1ac2c6f899faa39e8c0b42d4284d586c44e (patch) | |
tree | a62d6ddd84a685332322b873f7b2cd4facdc3601 /ld | |
parent | cae64165f47b64898c4f1982d294862cfae89a47 (diff) | |
download | gdb-7a77f1ac2c6f899faa39e8c0b42d4284d586c44e.zip gdb-7a77f1ac2c6f899faa39e8c0b42d4284d586c44e.tar.gz gdb-7a77f1ac2c6f899faa39e8c0b42d4284d586c44e.tar.bz2 |
xtensa: allow runtime ABI selection
2020-06-15 Max Filippov <jcmvbkbc@gmail.com>
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.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 22 | ||||
-rw-r--r-- | ld/emultempl/xtensaelf.em | 41 | ||||
-rw-r--r-- | ld/ld.texi | 11 |
3 files changed, 69 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 6700e72..73a99a0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,25 @@ +2020-06-15 Max Filippov <jcmvbkbc@gmail.com> + + * 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 <mcgrathr@google.com> * NEWS: Mention -z start-stop-visibility=... option for ELF. diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index 932721c..53f40c2 100644 --- a/ld/emultempl/xtensaelf.em +++ b/ld/emultempl/xtensaelf.em @@ -30,8 +30,16 @@ fragment <<EOF #include "bfd.h" /* Provide default values for new configuration settings. */ -#ifndef XSHAL_ABI -#define XSHAL_ABI 0 +#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 static void xtensa_wild_group_interleave (lang_statement_union_type *); @@ -49,6 +57,10 @@ static bfd_boolean xtensa_use_literal_pages = FALSE; #define EXTRA_VALIDATION 0 +/* Xtensa ABI. + This option is defined in BDF library. */ +extern int elf32xtensa_abi; + static char * elf_xtensa_choose_target (int argc ATTRIBUTE_UNUSED, @@ -306,7 +318,7 @@ xt_config_info_unpack_and_check (char *data, char **pmsg) { char *d, *key; - unsigned num; + int num; *pmismatch = FALSE; @@ -341,7 +353,11 @@ xt_config_info_unpack_and_check (char *data, if (! strcmp (key, "ABI")) { - if (num != XSHAL_ABI) + if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED) + { + elf32xtensa_abi = num; + } + else if (num != elf32xtensa_abi) { *pmismatch = TRUE; *pmsg = "ABI does not match"; @@ -489,7 +505,7 @@ elf_xtensa_before_allocation (void) data = xmalloc (100); sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n", - XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI); + XSHAL_USE_ABSOLUTE_LITERALS, xtensa_abi_choice ()); xtensa_info_size = strlen (data) + 1; /* Add enough null terminators to pad to a word boundary. */ @@ -1920,20 +1936,29 @@ PARSE_AND_LIST_PROLOGUE=' #define OPTION_OPT_SIZEOPT (300) #define OPTION_LITERAL_MOVEMENT (OPTION_OPT_SIZEOPT + 1) #define OPTION_NO_LITERAL_MOVEMENT (OPTION_LITERAL_MOVEMENT + 1) +#define OPTION_ABI_WINDOWED (OPTION_NO_LITERAL_MOVEMENT + 1) +#define OPTION_ABI_CALL0 (OPTION_ABI_WINDOWED + 1) extern int elf32xtensa_size_opt; extern int elf32xtensa_no_literal_movement; +extern int elf32xtensa_abi; ' PARSE_AND_LIST_LONGOPTS=' { "size-opt", no_argument, NULL, OPTION_OPT_SIZEOPT}, { "literal-movement", no_argument, NULL, OPTION_LITERAL_MOVEMENT}, { "no-literal-movement", no_argument, NULL, OPTION_NO_LITERAL_MOVEMENT}, + { "abi-windowed", no_argument, NULL, OPTION_ABI_WINDOWED}, + { "abi-call0", no_argument, NULL, OPTION_ABI_CALL0}, ' PARSE_AND_LIST_OPTIONS=' fprintf (file, _("\ --size-opt When relaxing longcalls, prefer size\n\ optimization over branch target alignment\n")); + fprintf (file, _("\ + --abi-windowed Choose windowed ABI for the output object\n")); + fprintf (file, _("\ + --abi-call0 Choose call0 ABI for the output object\n")); ' PARSE_AND_LIST_ARGS_CASES=' @@ -1946,6 +1971,12 @@ PARSE_AND_LIST_ARGS_CASES=' case OPTION_NO_LITERAL_MOVEMENT: elf32xtensa_no_literal_movement = 1; break; + case OPTION_ABI_WINDOWED: + elf32xtensa_abi = XTHAL_ABI_WINDOWED; + break; + case OPTION_ABI_CALL0: + elf32xtensa_abi = XTHAL_ABI_CALL0; + break; ' # Replace some of the standard ELF functions with our own versions. @@ -8565,6 +8565,17 @@ more than performance. With this option, the linker will not insert no-ops or widen density instructions to preserve branch target alignment. There may still be some cases where no-ops are required to preserve the correctness of the code. + +@item --abi-windowed +@itemx --abi-call0 +Choose ABI for the output object and for the generated PLT code. +PLT code inserted by the linker must match ABI of the output object +because windowed and call0 ABI use incompatible function call +conventions. +Default ABI is chosen by the ABI tag in the @code{.xtensa.info} section +of the first input object. +A warning is issued if ABI tags of input objects do not match each other +or the chosen output object ABI. @end table @ifclear GENERIC |