This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[backport][2.25][aarch64]Don't create new frag for .inst directive when certain conditions fullfil
- From: Renlin Li <renlin dot li at arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: Marcus Shawcroft <Marcus dot Shawcroft at arm dot com>, Nicholas Clifton <nickc at redhat dot com>
- Date: Wed, 06 May 2015 14:49:00 +0100
- Subject: [backport][2.25][aarch64]Don't create new frag for .inst directive when certain conditions fullfil
- Authentication-results: sourceware.org; auth=none
Hi all,
This is a backport patch from the trunk introduced here:
https://sourceware.org/ml/binutils/2015-03/msg00389.html
After the change, new frag is created for .inst directive, only during
state transition in executable section. The same rule applies when
handling normal instructions.
binutils, gas, ld regresstion test Okay.
Okay to commit?
Regards,
Renlin Li
Backport from mainline
2015-05-06 Renlin Li <renlin.li@arm.com>
gas/ChangeLog
* config/tc-aarch64.c (s_aarch64_inst): Align frag during state
transition
within executable section.
(md_assemble): Likewise.
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index ce2ba95..62a1a3f 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1863,8 +1863,14 @@ s_aarch64_inst (int ignored ATTRIBUTE_UNUSED)
return;
}
- if (!need_pass_2)
+ /* Sections are assumed to start aligned. In text section, there is no
+ MAP_DATA symbol pending. So we only align the address during
+ MAP_DATA --> MAP_INSN transition.
+ For other sections, this is not guaranteed. */
+ enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+ if (!need_pass_2 && (subseg_text_p (now_seg) && mapstate == MAP_DATA))
frag_align_code (2, 0);
+
#ifdef OBJ_ELF
mapping_state (MAP_INSN);
#endif
@@ -5571,6 +5577,14 @@ md_assemble (char *str)
init_operand_error_report ();
+ /* Sections are assumed to start aligned. In text section, there is no
+ MAP_DATA symbol pending. So we only align the address during
+ MAP_DATA --> MAP_INSN transition.
+ For other sections, this is not guaranteed. */
+ enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+ if (!need_pass_2 && (subseg_text_p (now_seg) && mapstate == MAP_DATA))
+ frag_align_code (2, 0);
+
saved_cond = inst.cond;
reset_aarch64_instruction (&inst);
inst.cond = saved_cond;