mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-15 03:48:11 +08:00
Fix an assertion failure in the AArch64 assembler triggered by incorrect instruction syntax.
PR 27904 * config/tc-aarch64.c (ldst_lo12_determine_real_reloc_type): Generate a syntax error message if the reloc qualifier does not match the instruction's size.
This commit is contained in:
@ -1,3 +1,10 @@
|
||||
2021-06-17 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 27904
|
||||
* config/tc-aarch64.c (ldst_lo12_determine_real_reloc_type):
|
||||
Generate a syntax error message if the reloc qualifier does not
|
||||
match the instruction's size.
|
||||
|
||||
2021-06-17 Clément Chigot <clement.chigot@atos.net>
|
||||
|
||||
* config/tc-ppc.c (md_begin): Create bss section with dummy
|
||||
|
@ -5591,7 +5591,7 @@ get_logsz (unsigned int size)
|
||||
static inline bfd_reloc_code_real_type
|
||||
ldst_lo12_determine_real_reloc_type (void)
|
||||
{
|
||||
unsigned logsz;
|
||||
unsigned logsz, max_logsz;
|
||||
enum aarch64_opnd_qualifier opd0_qlf = inst.base.operands[0].qualifier;
|
||||
enum aarch64_opnd_qualifier opd1_qlf = inst.base.operands[1].qualifier;
|
||||
|
||||
@ -5650,13 +5650,22 @@ ldst_lo12_determine_real_reloc_type (void)
|
||||
gas_assert (opd1_qlf != AARCH64_OPND_QLF_NIL);
|
||||
|
||||
logsz = get_logsz (aarch64_get_qualifier_esize (opd1_qlf));
|
||||
|
||||
if (inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12
|
||||
|| inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC
|
||||
|| inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12
|
||||
|| inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC)
|
||||
gas_assert (logsz <= 3);
|
||||
max_logsz = 3;
|
||||
else
|
||||
gas_assert (logsz <= 4);
|
||||
max_logsz = 4;
|
||||
|
||||
if (logsz > max_logsz)
|
||||
{
|
||||
/* SEE PR 27904 for an example of this. */
|
||||
set_fatal_syntax_error
|
||||
(_("relocation qualifier does not match instruction size"));
|
||||
return BFD_RELOC_AARCH64_NONE;
|
||||
}
|
||||
|
||||
/* In reloc.c, these pseudo relocation types should be defined in similar
|
||||
order as above reloc_ldst_lo12 array. Because the array index calculation
|
||||
|
2
gas/testsuite/gas/aarch64/pr27904.d
Normal file
2
gas/testsuite/gas/aarch64/pr27904.d
Normal file
@ -0,0 +1,2 @@
|
||||
#name: PR 27904
|
||||
#error_output: pr27904.l
|
2
gas/testsuite/gas/aarch64/pr27904.l
Normal file
2
gas/testsuite/gas/aarch64/pr27904.l
Normal file
@ -0,0 +1,2 @@
|
||||
[^:]*: Assembler messages:
|
||||
[^:]*:1: Error: relocation qualifier does not match instruction size at operand 3 -- `ldr q24,\[x23,:dtprel_lo12_nc:sym\]'
|
1
gas/testsuite/gas/aarch64/pr27904.s
Normal file
1
gas/testsuite/gas/aarch64/pr27904.s
Normal file
@ -0,0 +1 @@
|
||||
ldr q24, [x23, :dtprel_lo12_nc:sym]
|
Reference in New Issue
Block a user