This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 6/8][Binutils][AArch64] Close sequences at the end of sections
- From: Tamar Christina <tamar dot christina at arm dot com>
- To: binutils at sourceware dot org
- Cc: nd at arm dot com, Richard dot Earnshaw at arm dot com, marcus dot shawcroft at arm dot com
- Date: Mon, 24 Sep 2018 18:21:53 +0100
- Subject: [PATCH 6/8][Binutils][AArch64] Close sequences at the end of sections
Hi All,
Any open sequence at the end of a section or assembly is considered an error.
This patch adds a check at the end to ensure that all sequences have been closed
and if not reports a warning.
During disassembly it's not possible to detect this condition in the back-end so
the warning is only emitted from the assembler for now.
build on native hardware and regtested on
aarch64-none-elf, aarch64-none-elf (32 bit host),
aarch64-none-linux-gnu
Cross-compiled and regtested on
aarch64-none-linux-gnu, aarch64_be-none-linux-gnu
and no issues.
Ok for master??
Thanks,
Tamar
gas/
2018-09-24 Tamar Christina <tamar.christina@arm.com>
* config/tc-aarch64.c (force_automatic_sequence_close,
aarch64_frob_section): New.
* config/tc-aarch64.h (tc_frob_section, aarch64_frob_section): New.
--
diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h
index cdf988376d9761479dcb61913652486d167157dc..88df2aaaf0d762a0a76a85981a402e454ec17069 100644
--- a/gas/config/tc-aarch64.h
+++ b/gas/config/tc-aarch64.h
@@ -78,6 +78,8 @@ struct aarch64_fix
/* We also need to mark assembler created symbols: */
#define tc_frob_fake_label(S) aarch64_frob_label (S)
+#define tc_frob_section(S) aarch64_frob_section (S)
+
#define TC_FIX_TYPE struct aarch64_fix
#define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \
(FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; }
@@ -218,6 +220,7 @@ extern int aarch64_force_relocation (struct fix *);
extern void aarch64_cleanup (void);
extern void aarch64_start_line_hook (void);
extern void aarch64_frob_label (symbolS *);
+extern void aarch64_frob_section (asection *sec);
extern int aarch64_data_in_code (void);
extern char * aarch64_canonicalize_symbol_name (char *);
extern void aarch64_adjust_symtab (void);
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index a5fe6bceabe1ff7af57fb49c88e0597d99bfc154..085ffa26f0e4594fe97b50d19d79e27f742f34e6 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -6738,6 +6738,17 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
}
}
+static void
+force_automatic_sequence_close (void)
+{
+ if (now_instr_sequence.instr)
+ {
+ as_warn (_("previous `%s' sequence has not been closed"),
+ now_instr_sequence.instr->opcode->name);
+ init_insn_sequence (NULL, &now_instr_sequence);
+ }
+}
+
/* A wrapper function to interface with libopcodes on encoding and
record the error message if there is any.
@@ -6931,6 +6942,13 @@ aarch64_frob_label (symbolS * sym)
dwarf2_emit_label (sym);
}
+void
+aarch64_frob_section (asection *sec ATTRIBUTE_UNUSED)
+{
+ /* Check to see if we have a block to close. */
+ force_automatic_sequence_close ();
+}
+
int
aarch64_data_in_code (void)
{