xtensa: don't expect XCHAL_* macros to be constant

Get rid of the assumption that XCHAL_* macros are preprocessor
constants: don't use them in preprocessor conditionals or in static
variable initializers.

2017-06-14  Max Filippov  <jcmvbkbc@gmail.com>
bfd/
	* elf32-xtensa.c (elf_xtensa_be_plt_entry,
	elf_xtensa_le_plt_entry): Add dimension for the ABI to arrays,
	keep both windowed and call0 ABI PLT definitions.
	(elf_xtensa_create_plt_entry): Use selected ABI to choose upper
	elf_xtensa_*_plt_entry endex.
	(ELF_MAXPAGESIZE): Fix at minimal supported MMU page size.

gas/
	* config/tc-xtensa.c (density_supported, xtensa_fetch_width,
	absolute_literals_supported): Leave definitions uninitialized.
	(directive_state): Leave entries for directive_density and
	directive_absolute_literals initialized to false.
	(xg_init_global_config, xtensa_init): New functions.
	* config/tc-xtensa.h (TARGET_BYTES_BIG_ENDIAN): Define as 0.
	(HOST_SPECIAL_INIT): New definition.
	(xtensa_init): New declaration.
This commit is contained in:
Max Filippov
2017-05-17 02:09:14 -07:00
parent b46c4cf090
commit f7e16c2a9c
5 changed files with 84 additions and 37 deletions

View File

@ -1,3 +1,12 @@
2017-06-14 Max Filippov <jcmvbkbc@gmail.com>
* elf32-xtensa.c (elf_xtensa_be_plt_entry,
elf_xtensa_le_plt_entry): Add dimension for the ABI to arrays,
keep both windowed and call0 ABI PLT definitions.
(elf_xtensa_create_plt_entry): Use selected ABI to choose upper
elf_xtensa_*_plt_entry endex.
(ELF_MAXPAGESIZE): Fix at minimal supported MMU page size.
2017-06-14 Nick Clifton <nickc@redhat.com> 2017-06-14 Nick Clifton <nickc@redhat.com>
PR binutils/21578 PR binutils/21578

View File

@ -519,28 +519,42 @@ elf_xtensa_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
invoked. Note: the 32-byte frame size used here cannot be changed invoked. Note: the 32-byte frame size used here cannot be changed
without a corresponding change in the runtime linker. */ without a corresponding change in the runtime linker. */
static const bfd_byte elf_xtensa_be_plt_entry[PLT_ENTRY_SIZE] = static const bfd_byte elf_xtensa_be_plt_entry[][PLT_ENTRY_SIZE] =
{ {
#if XSHAL_ABI == XTHAL_ABI_WINDOWED {
0x6c, 0x10, 0x04, /* entry sp, 32 */ 0x6c, 0x10, 0x04, /* entry sp, 32 */
#endif 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */ 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */ 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */ 0x0a, 0x80, 0x00, /* jx a8 */
0x0a, 0x80, 0x00, /* jx a8 */ 0 /* unused */
0 /* unused */ },
{
0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
0x0a, 0x80, 0x00, /* jx a8 */
0 /* unused */
}
}; };
static const bfd_byte elf_xtensa_le_plt_entry[PLT_ENTRY_SIZE] = static const bfd_byte elf_xtensa_le_plt_entry[][PLT_ENTRY_SIZE] =
{ {
#if XSHAL_ABI == XTHAL_ABI_WINDOWED {
0x36, 0x41, 0x00, /* entry sp, 32 */ 0x36, 0x41, 0x00, /* entry sp, 32 */
#endif 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */ 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */ 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */ 0xa0, 0x08, 0x00, /* jx a8 */
0xa0, 0x08, 0x00, /* jx a8 */ 0 /* unused */
0 /* unused */ },
{
0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
0xa0, 0x08, 0x00, /* jx a8 */
0 /* unused */
}
}; };
/* The size of the thread control block. */ /* The size of the thread control block. */
@ -2336,8 +2350,8 @@ elf_xtensa_create_plt_entry (struct bfd_link_info *info,
/* Fill in the entry in the procedure linkage table. */ /* Fill in the entry in the procedure linkage table. */
memcpy (splt->contents + code_offset, memcpy (splt->contents + code_offset,
(bfd_big_endian (output_bfd) (bfd_big_endian (output_bfd)
? elf_xtensa_be_plt_entry ? elf_xtensa_be_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]
: elf_xtensa_le_plt_entry), : elf_xtensa_le_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]),
PLT_ENTRY_SIZE); PLT_ENTRY_SIZE);
abi_offset = XSHAL_ABI == XTHAL_ABI_WINDOWED ? 3 : 0; abi_offset = XSHAL_ABI == XTHAL_ABI_WINDOWED ? 3 : 0;
bfd_put_16 (output_bfd, l32r_offset (got_base + 0, bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
@ -11317,11 +11331,7 @@ static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
#define ELF_MACHINE_CODE EM_XTENSA #define ELF_MACHINE_CODE EM_XTENSA
#define ELF_MACHINE_ALT1 EM_XTENSA_OLD #define ELF_MACHINE_ALT1 EM_XTENSA_OLD
#if XCHAL_HAVE_MMU #define ELF_MAXPAGESIZE 0x1000
#define ELF_MAXPAGESIZE (1 << XCHAL_MMU_MIN_PTE_PAGE_SIZE)
#else /* !XCHAL_HAVE_MMU */
#define ELF_MAXPAGESIZE 1
#endif /* !XCHAL_HAVE_MMU */
#endif /* ELF_ARCH */ #endif /* ELF_ARCH */
#define elf_backend_can_gc_sections 1 #define elf_backend_can_gc_sections 1

View File

@ -1,3 +1,14 @@
2017-06-14 Max Filippov <jcmvbkbc@gmail.com>
* config/tc-xtensa.c (density_supported, xtensa_fetch_width,
absolute_literals_supported): Leave definitions uninitialized.
(directive_state): Leave entries for directive_density and
directive_absolute_literals initialized to false.
(xg_init_global_config, xtensa_init): New functions.
* config/tc-xtensa.h (TARGET_BYTES_BIG_ENDIAN): Define as 0.
(HOST_SPECIAL_INIT): New definition.
(xtensa_init): New declaration.
2017-06-07 Michael Collison <michael.collison@arm.com> 2017-06-07 Michael Collison <michael.collison@arm.com>
* config/tc-aarch64.c (reg_entry_reg_names): Add IP0, * config/tc-aarch64.c (reg_entry_reg_names): Add IP0,

View File

@ -72,13 +72,13 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
/* Flags to indicate whether the hardware supports the density and /* Flags to indicate whether the hardware supports the density and
absolute literals options. */ absolute literals options. */
bfd_boolean density_supported = XCHAL_HAVE_DENSITY; bfd_boolean density_supported;
bfd_boolean absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS; bfd_boolean absolute_literals_supported;
static vliw_insn cur_vinsn; static vliw_insn cur_vinsn;
unsigned xtensa_num_pipe_stages; unsigned xtensa_num_pipe_stages;
unsigned xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH; unsigned xtensa_fetch_width;
static enum debug_info_type xt_saved_debug_type = DEBUG_NONE; static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
@ -419,21 +419,13 @@ bfd_boolean directive_state[] =
{ {
FALSE, /* none */ FALSE, /* none */
FALSE, /* literal */ FALSE, /* literal */
#if !XCHAL_HAVE_DENSITY
FALSE, /* density */ FALSE, /* density */
#else
TRUE, /* density */
#endif
TRUE, /* transform */ TRUE, /* transform */
FALSE, /* freeregs */ FALSE, /* freeregs */
FALSE, /* longcalls */ FALSE, /* longcalls */
FALSE, /* literal_prefix */ FALSE, /* literal_prefix */
FALSE, /* schedule */ FALSE, /* schedule */
#if XSHAL_USE_ABSOLUTE_LITERALS
TRUE /* absolute_literals */
#else
FALSE /* absolute_literals */ FALSE /* absolute_literals */
#endif
}; };
/* A circular list of all potential and actual literal pool locations /* A circular list of all potential and actual literal pool locations
@ -5216,6 +5208,24 @@ md_number_to_chars (char *buf, valueT val, int n)
number_to_chars_littleendian (buf, val, n); number_to_chars_littleendian (buf, val, n);
} }
static void
xg_init_global_config (void)
{
target_big_endian = XCHAL_HAVE_BE;
density_supported = XCHAL_HAVE_DENSITY;
absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
directive_state[directive_density] = XCHAL_HAVE_DENSITY;
directive_state[directive_absolute_literals] = XSHAL_USE_ABSOLUTE_LITERALS;
}
void
xtensa_init (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
{
xg_init_global_config ();
}
/* This function is called once, at assembler startup time. It should /* This function is called once, at assembler startup time. It should
set up all the tables, etc. that the MD part of the assembler will set up all the tables, etc. that the MD part of the assembler will

View File

@ -30,7 +30,7 @@ struct fix;
#include "xtensa-isa.h" #include "xtensa-isa.h"
#include "xtensa-config.h" #include "xtensa-config.h"
#define TARGET_BYTES_BIG_ENDIAN XCHAL_HAVE_BE #define TARGET_BYTES_BIG_ENDIAN 0
/* Maximum number of opcode slots in a VLIW instruction. */ /* Maximum number of opcode slots in a VLIW instruction. */
@ -335,6 +335,13 @@ extern bfd_boolean xtensa_check_inside_bundle (void);
extern void xtensa_handle_align (fragS *); extern void xtensa_handle_align (fragS *);
extern char *xtensa_section_rename (const char *); extern char *xtensa_section_rename (const char *);
/* We need to set the target endianness in xtensa_init and not in md_begin.
This is because xtensa_target_format is called before md_begin, and we
want to have all non-statically initialized fields initialized. */
#define HOST_SPECIAL_INIT xtensa_init
extern void xtensa_init (int, char **);
#define TARGET_FORMAT xtensa_target_format () #define TARGET_FORMAT xtensa_target_format ()
#define TARGET_ARCH bfd_arch_xtensa #define TARGET_ARCH bfd_arch_xtensa
#define TC_SEGMENT_INFO_TYPE xtensa_segment_info #define TC_SEGMENT_INFO_TYPE xtensa_segment_info