This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [AArch64] Emit DATA_MAP in order within text section


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c1baaddf8861aea666b84baeb4746caff51a579d

commit c1baaddf8861aea666b84baeb4746caff51a579d
Author: Renlin Li <renlin.li@arm.com>
Date:   Thu Apr 2 14:59:45 2015 +0100

    [AArch64] Emit DATA_MAP in order within text section
    
    2015-03-27  Renlin Li  <renlin.li@arm.com>
    
    gas/
      * config/tc-aarch64.c (mapping_state): Emit MAP_DATA within text section in order.
      (mapping_state_2): Don't emit MAP_DATA here.
      (s_aarch64_inst): Align frag during state transition.
      (md_assemble): Likewise.

Diff:
---
 gas/ChangeLog           |  7 +++++++
 gas/config/tc-aarch64.c | 54 ++++++++++++++++++++++++++++++++-----------------
 2 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 4c57d73..d8335ab 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2015-04-02  Renlin Li  <renlin.li@arm.com>
+
+	* config/tc-aarch64.c (mapping_state): Emit MAP_DATA within text section in order.
+	(mapping_state_2): Don't emit MAP_DATA here.
+	(s_aarch64_inst): Align frag during state transition.
+	(md_assemble): Likewise.
+
 2015-04-02  Ed Maste  <emaste@freebsd.org>
 
 	* config/tc-aarch64.c (set_error_kind): Delete.
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 1d4d1d0..2163d53 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1455,7 +1455,6 @@ static void mapping_state_2 (enum mstate state, int max_chars);
 /* Set the mapping state to STATE.  Only call this when about to
    emit some STATE bytes to the file.  */
 
-#define TRANSITION(from, to) (mapstate == (from) && state == (to))
 void
 mapping_state (enum mstate state)
 {
@@ -1472,9 +1471,25 @@ mapping_state (enum mstate state)
        alignment.  */
     record_alignment (now_seg, 2);
 
-  if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
-    /* This case will be evaluated later in the next else.  */
+#define TRANSITION(from, to) (mapstate == (from) && state == (to))
+  if (TRANSITION (MAP_UNDEFINED, MAP_DATA) && now_seg != text_section)
+    /* Emit MAP_DATA within text section in order. Otherwise, it will be
+       evaluated later in the next else.  */
     return;
+  else if (TRANSITION (MAP_UNDEFINED, MAP_INSN))
+    {
+      /* Only add the symbol if the offset is > 0:
+	 if we're at the first frag, check it's size > 0;
+	 if we're not at the first frag, then for sure
+	 the offset is > 0.  */
+      struct frag *const frag_first = seg_info (now_seg)->frchainP->frch_root;
+      const int add_symbol = (frag_now != frag_first)
+	|| (frag_now_fix () > 0);
+
+      if (add_symbol)
+	make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
+    }
+#undef TRANSITION
 
   mapping_state_2 (state, 0);
 }
@@ -1495,24 +1510,9 @@ mapping_state_2 (enum mstate state, int max_chars)
        There is nothing else to do.  */
     return;
 
-  if (TRANSITION (MAP_UNDEFINED, MAP_INSN))
-    {
-      /* Only add the symbol if the offset is > 0:
-	 if we're at the first frag, check it's size > 0;
-	 if we're not at the first frag, then for sure
-	 the offset is > 0.  */
-      struct frag *const frag_first = seg_info (now_seg)->frchainP->frch_root;
-      const int add_symbol = (frag_now != frag_first)
-	|| (frag_now_fix () > 0);
-
-      if (add_symbol)
-	make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
-    }
-
   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
 }
-#undef TRANSITION
 #else
 #define mapping_state(x)	/* nothing */
 #define mapping_state_2(x, y)	/* nothing */
@@ -1855,8 +1855,15 @@ 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, align it anyway.  */
+  enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+  if (!need_pass_2 && ((now_seg == text_section && mapstate == MAP_DATA)
+		       || now_seg != text_section))
     frag_align_code (2, 0);
+
 #ifdef OBJ_ELF
   mapping_state (MAP_INSN);
 #endif
@@ -5698,6 +5705,15 @@ md_assemble (char *str)
 	dump_opcode_operands (opcode);
 #endif /* DEBUG_AARCH64 */
 
+    /* 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, align it anyway.  */
+    enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+    if (!need_pass_2 && ((now_seg == text_section && mapstate == MAP_DATA)
+			 || now_seg != text_section))
+	frag_align_code (2, 0);
+
       mapping_state (MAP_INSN);
 
       inst_base = &inst.base;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]