mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-28 04:13:28 +08:00
[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.
This commit is contained in:
@ -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>
|
2015-04-02 Ed Maste <emaste@freebsd.org>
|
||||||
|
|
||||||
* config/tc-aarch64.c (set_error_kind): Delete.
|
* config/tc-aarch64.c (set_error_kind): Delete.
|
||||||
|
@ -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
|
/* Set the mapping state to STATE. Only call this when about to
|
||||||
emit some STATE bytes to the file. */
|
emit some STATE bytes to the file. */
|
||||||
|
|
||||||
#define TRANSITION(from, to) (mapstate == (from) && state == (to))
|
|
||||||
void
|
void
|
||||||
mapping_state (enum mstate state)
|
mapping_state (enum mstate state)
|
||||||
{
|
{
|
||||||
@ -1472,9 +1471,25 @@ mapping_state (enum mstate state)
|
|||||||
alignment. */
|
alignment. */
|
||||||
record_alignment (now_seg, 2);
|
record_alignment (now_seg, 2);
|
||||||
|
|
||||||
if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
|
#define TRANSITION(from, to) (mapstate == (from) && state == (to))
|
||||||
/* This case will be evaluated later in the next else. */
|
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;
|
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);
|
mapping_state_2 (state, 0);
|
||||||
}
|
}
|
||||||
@ -1495,24 +1510,9 @@ mapping_state_2 (enum mstate state, int max_chars)
|
|||||||
There is nothing else to do. */
|
There is nothing else to do. */
|
||||||
return;
|
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;
|
seg_info (now_seg)->tc_segment_info_data.mapstate = state;
|
||||||
make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
|
make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
|
||||||
}
|
}
|
||||||
#undef TRANSITION
|
|
||||||
#else
|
#else
|
||||||
#define mapping_state(x) /* nothing */
|
#define mapping_state(x) /* nothing */
|
||||||
#define mapping_state_2(x, y) /* nothing */
|
#define mapping_state_2(x, y) /* nothing */
|
||||||
@ -1855,8 +1855,15 @@ s_aarch64_inst (int ignored ATTRIBUTE_UNUSED)
|
|||||||
return;
|
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);
|
frag_align_code (2, 0);
|
||||||
|
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
mapping_state (MAP_INSN);
|
mapping_state (MAP_INSN);
|
||||||
#endif
|
#endif
|
||||||
@ -5698,6 +5705,15 @@ md_assemble (char *str)
|
|||||||
dump_opcode_operands (opcode);
|
dump_opcode_operands (opcode);
|
||||||
#endif /* DEBUG_AARCH64 */
|
#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);
|
mapping_state (MAP_INSN);
|
||||||
|
|
||||||
inst_base = &inst.base;
|
inst_base = &inst.base;
|
||||||
|
Reference in New Issue
Block a user