aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenlin Li <renlin.li@arm.com>2015-03-25 12:33:07 +0000
committerJiong Wang <jiong.wang@arm.com>2015-03-25 12:33:07 +0000
commitbb383c6cf1ea43193ef9f407a3b7c3bdee9f5fa1 (patch)
tree15de2d63f5159a421bfc762eaff71093bc3e4c92
parent6a3753b34b7b4ff6b12d89ec1f6835799b54ef63 (diff)
downloadgdb-bb383c6cf1ea43193ef9f407a3b7c3bdee9f5fa1.zip
gdb-bb383c6cf1ea43193ef9f407a3b7c3bdee9f5fa1.tar.gz
gdb-bb383c6cf1ea43193ef9f407a3b7c3bdee9f5fa1.tar.bz2
[AARCH64]Fix "align directive causes MAP_DATA symbol to be lost"
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.
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-aarch64.c32
2 files changed, 22 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 9f92729..4a43a66 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 5031134..ef4fae8 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -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 */