This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH][GAS][AARCH64]Record instruction alignment for .inst directive.
- From: Renlin Li <renlin dot li at arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: Nicholas Clifton <nickc at redhat dot com>, Marcus Shawcroft <marcus dot shawcroft at gmail dot com>
- Date: Tue, 28 Apr 2015 16:45:46 +0100
- Subject: [PATCH][GAS][AARCH64]Record instruction alignment for .inst directive.
- Authentication-results: sourceware.org; auth=none
Hi all,
This is a simple patch that moves the alignment recording code in
mapping_state early before it returns. So that, all code related
alignment will be recorded.
For example, one case missed is for .inst directive. When .inst is
processed, it will call frag_align_code first, which calls
mapping_state_2 and set current state to MAP_INSN. Later when
mapping_state is called, it will return early, because there is no state
change.
For example,
.text
.short 0xffff
.inst 0x12345678 --> this will set MAP_INSN
ret --> while processing this insn, mapping_state will
early return as there is no state change.
The alignment of .text section will not be recorded.
Okay to commit?
Regards,
Renlin Li
gas/ChangeLog:
2015-04-28 Renlin Li <renlin.li@arm.com>
* config/tc-aarch64.c (mapping_state): Recording alignment before exit.
gas/testsuite/ChangeLog
2015-04-28 Renlin Li <renlin.li@arm.com>
* gas/aarch64/codealign_1.s: New.
* gas/aarch64/codealign_1.d: New.
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 5492ff4..231a578 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1460,17 +1460,17 @@ mapping_state (enum mstate state)
{
enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
- if (mapstate == state)
- /* The mapping symbol has already been emitted.
- There is nothing else to do. */
- return;
-
if (state == MAP_INSN)
/* AArch64 instructions require 4-byte alignment. When emitting
instructions into any section, record the appropriate section
alignment. */
record_alignment (now_seg, 2);
+ if (mapstate == state)
+ /* The mapping symbol has already been emitted.
+ There is nothing else to do. */
+ return;
+
#define TRANSITION(from, to) (mapstate == (from) && state == (to))
if (TRANSITION (MAP_UNDEFINED, MAP_DATA) && !subseg_text_p (now_seg))
/* Emit MAP_DATA within executable section in order. Otherwise, it will be
diff --git a/gas/testsuite/gas/aarch64/codealign_1.d b/gas/testsuite/gas/aarch64/codealign_1.d
new file mode 100644
index 0000000..08f4c25
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/codealign_1.d
@@ -0,0 +1,13 @@
+#objdump: --section-headers
+# Minimum code alignment should be set.
+
+.*: +file format.*aarch64.*
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 \.text .* .* .* .* 2\*\*2
+ .*CODE.*
+ 1 \.data .* .* .* .* 2\*\*0
+ .*DATA.*
+ 2 \.bss .* .* .* .* 2\*\*0
+.*
diff --git a/gas/testsuite/gas/aarch64/codealign_1.s b/gas/testsuite/gas/aarch64/codealign_1.s
new file mode 100644
index 0000000..b27cc6b
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/codealign_1.s
@@ -0,0 +1,3 @@
+.text
+ .byte 0xf
+ .inst 0xd503201f