diff options
author | Renlin Li <renlin.li@arm.com> | 2015-04-02 14:59:45 +0100 |
---|---|---|
committer | Jiong Wang <jiong.wang@arm.com> | 2015-04-02 14:59:45 +0100 |
commit | c1baaddf8861aea666b84baeb4746caff51a579d (patch) | |
tree | 4538ca6dc634c37501319fb0eedc6ed3b495646a | |
parent | 726e626a7bdeaf5f828faf12e2c1e81504b8fb73 (diff) | |
download | gdb-c1baaddf8861aea666b84baeb4746caff51a579d.zip gdb-c1baaddf8861aea666b84baeb4746caff51a579d.tar.gz gdb-c1baaddf8861aea666b84baeb4746caff51a579d.tar.bz2 |
[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.
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | 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; |