From a346bb24cf3b9c71f6a66f022bf4ac80dbf0d8f8 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 2 Dec 2021 15:00:56 +0000 Subject: aarch64: Provide line info for unclosed sequences We warn about MOVPRFX instructions that have no following instruction. This patch adds a line number to the message, which is useful if the assembly code has multiple text sections. The new code is unconditional since OBJ_ELF is always defined for aarch64. gas/ * config/tc-aarch64.h (aarch64_segment_info_type): Add last_file and last_line. * config/tc-aarch64.c (now_instr_sequence): Delete. (force_automatic_sequence_close): Provide a line number when reporting unclosed sequences. (md_assemble): Record the location of the instruction in tc_segment_info. * testsuite/gas/aarch64/sve-movprfx_4.l: Add line number to error message. * testsuite/gas/aarch64/sve-movprfx_7.l: Likewise. * testsuite/gas/aarch64/sve-movprfx_8.l: Likewise. --- gas/config/tc-aarch64.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'gas/config/tc-aarch64.c') diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index b6ed80e..497c126 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -160,13 +160,6 @@ static aarch64_instruction inst; static bool parse_operands (char *, const aarch64_opcode *); static bool programmer_friendly_fixup (aarch64_instruction *); -#ifdef OBJ_ELF -# define now_instr_sequence seg_info \ - (now_seg)->tc_segment_info_data.insn_sequence -#else -static struct aarch64_instr_sequence now_instr_sequence; -#endif - /* Diagnostics inline function utilities. These are lightweight utilities which should only be called by parse_operands @@ -7801,11 +7794,15 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str) static void force_automatic_sequence_close (void) { - if (now_instr_sequence.instr) + struct aarch64_segment_info_type *tc_seg_info; + + tc_seg_info = &seg_info (now_seg)->tc_segment_info_data; + if (tc_seg_info->insn_sequence.instr) { - as_warn (_("previous `%s' sequence has not been closed"), - now_instr_sequence.instr->opcode->name); - init_insn_sequence (NULL, &now_instr_sequence); + as_warn_where (tc_seg_info->last_file, tc_seg_info->last_line, + _("previous `%s' sequence has not been closed"), + tc_seg_info->insn_sequence.instr->opcode->name); + init_insn_sequence (NULL, &tc_seg_info->insn_sequence); } } @@ -7855,6 +7852,7 @@ md_assemble (char *str) { templates *template; const aarch64_opcode *opcode; + struct aarch64_segment_info_type *tc_seg_info; aarch64_inst *inst_base; unsigned saved_cond; @@ -7867,7 +7865,9 @@ md_assemble (char *str) } /* Update the current insn_sequence from the segment. */ - insn_sequence = &seg_info (now_seg)->tc_segment_info_data.insn_sequence; + tc_seg_info = &seg_info (now_seg)->tc_segment_info_data; + insn_sequence = &tc_seg_info->insn_sequence; + tc_seg_info->last_file = as_where (&tc_seg_info->last_line); inst.reloc.type = BFD_RELOC_UNUSED; -- cgit v1.1