diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2019-04-10 01:18:01 -0700 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2019-04-11 11:40:52 -0700 |
commit | f8aecf3cc9a3c71a0fb9a8ddca8f131dde648276 (patch) | |
tree | 65c4eb8266a931a7a7c08f6dbadb6d25f4247366 | |
parent | 548791769dc737f05cb12e5ee4190b7e853beac9 (diff) | |
download | gdb-f8aecf3cc9a3c71a0fb9a8ddca8f131dde648276.zip gdb-f8aecf3cc9a3c71a0fb9a8ddca8f131dde648276.tar.gz gdb-f8aecf3cc9a3c71a0fb9a8ddca8f131dde648276.tar.bz2 |
xtensa: gas: clean up literal management code
gas/
2019-04-11 Max Filippov <jcmvbkbc@gmail.com>
* config/tc-xtensa.c (xtensa_literal_pseudo): Drop code that has
no effect.
(get_literal_pool_location): Only search for the literal pool
when auto litpools is used, otherwise take one recorded in the
tc_segment_info_data.
(xtensa_assign_litpool_addresses): New function.
(xtensa_move_literals): Don't duplicate 'literal pool location
required...' error message. Call xtensa_assign_litpool_addresses.
-rw-r--r-- | gas/ChangeLog | 11 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 114 |
2 files changed, 65 insertions, 60 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index f0d2a97..52dd5f3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,16 @@ 2019-04-11 Max Filippov <jcmvbkbc@gmail.com> + * config/tc-xtensa.c (xtensa_literal_pseudo): Drop code that has + no effect. + (get_literal_pool_location): Only search for the literal pool + when auto litpools is used, otherwise take one recorded in the + tc_segment_info_data. + (xtensa_assign_litpool_addresses): New function. + (xtensa_move_literals): Don't duplicate 'literal pool location + required...' error message. Call xtensa_assign_litpool_addresses. + +2019-04-11 Max Filippov <jcmvbkbc@gmail.com> + * config/tc-xtensa.c (xtensa_is_init_fini): Add declaration. (xtensa_mark_literal_pool_location): Don't add fill frag to literal section that records literal pool location. diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 6a80e76..458cba9 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -1531,7 +1531,6 @@ xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED) emit_state state; char *p, *base_name; char c; - segT dest_seg; if (inside_directive (directive_literal)) { @@ -1547,21 +1546,10 @@ xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED) saved_insn_labels = insn_labels; insn_labels = NULL; - /* If we are using text-section literals, then this is the right value... */ - dest_seg = now_seg; - base_name = input_line_pointer; xtensa_switch_to_literal_fragment (&state); - /* ...but if we aren't using text-section-literals, then we - need to put them in the section we just switched to. */ - if (use_literal_section || directive_state[directive_absolute_literals]) - dest_seg = now_seg; - - /* FIXME, despite the previous comments, dest_seg is unused... */ - (void) dest_seg; - /* All literals are aligned to four-byte boundaries. */ frag_align (2, 0, 0); record_alignment (now_seg, 2); @@ -4902,29 +4890,32 @@ get_expanded_loop_offset (xtensa_opcode opcode) static fragS * get_literal_pool_location (segT seg) { - struct litpool_seg *lps = litpool_seg_list.next; - struct litpool_frag *lpf; - for ( ; lps && lps->seg->id != seg->id; lps = lps->next) - ; - if (lps) + if (auto_litpools) { - for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) - { /* Skip "candidates" for now. */ - if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN && - lpf->priority == 1) - return lpf->fragP; - } - /* Must convert a lower-priority pool. */ - for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) + struct litpool_seg *lps = litpool_seg_list.next; + struct litpool_frag *lpf; + for ( ; lps && lps->seg->id != seg->id; lps = lps->next) + ; + if (lps) { - if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN) - return lpf->fragP; - } - /* Still no match -- try for a low priority pool. */ - for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) - { - if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN) - return lpf->fragP; + for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) + { /* Skip "candidates" for now. */ + if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN && + lpf->priority == 1) + return lpf->fragP; + } + /* Must convert a lower-priority pool. */ + for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) + { + if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN) + return lpf->fragP; + } + /* Still no match -- try for a low priority pool. */ + for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev) + { + if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN) + return lpf->fragP; + } } } return seg_info (seg)->tc_segment_info_data.literal_pool_loc; @@ -11169,29 +11160,9 @@ static bfd_boolean xtensa_is_init_fini (segT seg) } static void -xtensa_move_literals (void) +xtensa_assign_litpool_addresses (void) { - seg_list *segment; - frchainS *frchain_from, *frchain_to; - fragS *search_frag, *next_frag, *literal_pool, *insert_after; - fragS **frag_splice; - emit_state state; - segT dest_seg; - fixS *fix, *next_fix, **fix_splice; - sym_list *lit; struct litpool_seg *lps; - const char *init_name = INIT_SECTION_NAME; - const char *fini_name = FINI_SECTION_NAME; - int init_name_len = strlen(init_name); - int fini_name_len = strlen(fini_name); - - mark_literal_frags (literal_head->next); - - if (use_literal_section) - return; - - /* Assign addresses (rough estimates) to the potential literal pool locations - and create new ones if the gaps are too large. */ for (lps = litpool_seg_list.next; lps; lps = lps->next) { @@ -11248,7 +11219,35 @@ xtensa_move_literals (void) } } } +} +static void +xtensa_move_literals (void) +{ + seg_list *segment; + frchainS *frchain_from, *frchain_to; + fragS *search_frag, *next_frag, *literal_pool, *insert_after; + fragS **frag_splice; + emit_state state; + segT dest_seg; + fixS *fix, *next_fix, **fix_splice; + sym_list *lit; + const char *init_name = INIT_SECTION_NAME; + const char *fini_name = FINI_SECTION_NAME; + int init_name_len = strlen(init_name); + int fini_name_len = strlen(fini_name); + + mark_literal_frags (literal_head->next); + + if (use_literal_section) + return; + + /* Assign addresses (rough estimates) to the potential literal pool locations + and create new ones if the gaps are too large. */ + + xtensa_assign_litpool_addresses (); + + /* Walk through the literal segments. */ for (segment = literal_head->next; segment; segment = segment->next) { const char *seg_name = segment_name (segment->seg); @@ -11274,12 +11273,7 @@ xtensa_move_literals (void) } if (!search_frag) - { - search_frag = frchain_from->frch_root; - as_bad_where (search_frag->fr_file, search_frag->fr_line, - _("literal pool location required for text-section-literals; specify with .literal_position")); - continue; - } + continue; gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype == RELAX_LITERAL_POOL_BEGIN); |