[AARCH64]Fix "align directive causes MAP_DATA symbol to be lost"
authorRenlin Li <renlin.li@arm.com>
Wed, 25 Mar 2015 12:33:07 +0000 (12:33 +0000)
committerJiong Wang <jiong.wang@arm.com>
Wed, 25 Mar 2015 12:33:07 +0000 (12:33 +0000)
gas/ChangeLog:

2015-03-25  Renlin Li  <renlin.li@arm.com>

  * config/tc-aarch64.c (mapping_state): Remove first MAP_DATA emitting code.
  (mapping_state_2): Emit first MAP_DATA symbol here.

gas/ChangeLog
gas/config/tc-aarch64.c

index 9f92729d48c8a9e1f37a09bf41d67199682be9ea..4a43a6646c20839eb6ed8f05343e9bda4a7ab672 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-25  Renlin Li  <renlin.li@arm.com>
+
+       * config/tc-aarch64.c (mapping_state): Remove first MAP_DATA emitting
+       code.
+       (mapping_state_2): Emit first MAP_DATA symbol here.
+
 2015-03-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/18087
index 50311342ab24bf68fdf225c650a1bc60db0bbd74..ef4fae88658767588d3a3cdf302018298df10e18 100644 (file)
@@ -1467,13 +1467,12 @@ 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)
 {
   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
 
-#define TRANSITION(from, to) (mapstate == (from) && state == (to))
-
   if (mapstate == state)
     /* The mapping symbol has already been emitted.
        There is nothing else to do.  */
@@ -1488,22 +1487,8 @@ mapping_state (enum mstate state)
   if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
     /* This case 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);
-    }
 
   mapping_state_2 (state, 0);
-#undef TRANSITION
 }
 
 /* Same as mapping_state, but MAX_CHARS bytes have already been
@@ -1522,9 +1507,24 @@ 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 */