From a346bb24cf3b9c71f6a66f022bf4ac80dbf0d8f8 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 2 Dec 2021 15:00:56 +0000 Subject: [PATCH] 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 +++++++++++------------ gas/config/tc-aarch64.h | 2 ++ gas/testsuite/gas/aarch64/sve-movprfx_4.l | 2 +- gas/testsuite/gas/aarch64/sve-movprfx_7.l | 2 +- gas/testsuite/gas/aarch64/sve-movprfx_8.l | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index b6ed80e6d3a..497c126ea83 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; diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h index 658b6935cd3..78bff0a1b56 100644 --- a/gas/config/tc-aarch64.h +++ b/gas/config/tc-aarch64.h @@ -225,6 +225,8 @@ void mapping_state (enum mstate); struct aarch64_segment_info_type { + const char *last_file; + unsigned last_line; enum mstate mapstate; unsigned int marked_pr_dependency; aarch64_instr_sequence insn_sequence; diff --git a/gas/testsuite/gas/aarch64/sve-movprfx_4.l b/gas/testsuite/gas/aarch64/sve-movprfx_4.l index 277a6d969f1..6ea4551b4d5 100644 --- a/gas/testsuite/gas/aarch64/sve-movprfx_4.l +++ b/gas/testsuite/gas/aarch64/sve-movprfx_4.l @@ -1,2 +1,2 @@ [^:]*: Assembler messages: -.*: Warning: previous `movprfx' sequence has not been closed +.*:8: Warning: previous `movprfx' sequence has not been closed diff --git a/gas/testsuite/gas/aarch64/sve-movprfx_7.l b/gas/testsuite/gas/aarch64/sve-movprfx_7.l index 277a6d969f1..e5776c73595 100644 --- a/gas/testsuite/gas/aarch64/sve-movprfx_7.l +++ b/gas/testsuite/gas/aarch64/sve-movprfx_7.l @@ -1,2 +1,2 @@ [^:]*: Assembler messages: -.*: Warning: previous `movprfx' sequence has not been closed +.*:7: Warning: previous `movprfx' sequence has not been closed diff --git a/gas/testsuite/gas/aarch64/sve-movprfx_8.l b/gas/testsuite/gas/aarch64/sve-movprfx_8.l index 277a6d969f1..e5776c73595 100644 --- a/gas/testsuite/gas/aarch64/sve-movprfx_8.l +++ b/gas/testsuite/gas/aarch64/sve-movprfx_8.l @@ -1,2 +1,2 @@ [^:]*: Assembler messages: -.*: Warning: previous `movprfx' sequence has not been closed +.*:7: Warning: previous `movprfx' sequence has not been closed -- 2.30.2