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:
Nick Clifton
2021-06-17 16:19:20 +01:00
parent bcf8470303
commit 96cbfd9f04
5 changed files with 24 additions and 3 deletions

View File

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

View File

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

View File

@ -0,0 +1,2 @@
#name: PR 27904
#error_output: pr27904.l

View 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\]'

View File

@ -0,0 +1 @@
ldr q24, [x23, :dtprel_lo12_nc:sym]