From 691e88fbd168b5e573bbea9935b77ce8a8fbd2fa Mon Sep 17 00:00:00 2001 From: Renlin Li Date: Thu, 7 May 2015 11:47:53 +0100 Subject: [PATCH] [AArch64][Backport] Don't always create new frag for .inst directive 2015-05-06 Renlin Li Backport from mainline gas/ * config/tc-aarch64.c (s_aarch64_inst): Align frag during state transition within executable section. (md_assemble): Likewise. --- gas/ChangeLog | 6 ++++++ gas/config/tc-aarch64.c | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 300833a8e63..7632ef836c0 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2015-05-07 Renlin Li + + * config/tc-aarch64.c (s_aarch64_inst): Align frag during state + transition within executable section. + (md_assemble): Likewise. + 2015-04-06 Evandro Menezes * config/tc-aarch64.c: Add support for Samsung Exynos M1. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index bc5f7dd9a2f..893abd7c2a6 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -1864,8 +1864,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 @@ -5630,6 +5636,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; -- 2.47.2