diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 49 |
2 files changed, 39 insertions, 17 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 33085e0..6350be1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2004-03-19 Bob Wilson <bob.wilson@acm.org> + + * config/tc-xtensa.c (mark_literal_frags): New function. + (xtensa_move_literals): Call mark_literal_frags for all literal + segments, including init and fini literal segments. + (xtensa_post_relax_hook): Swap use of xt_insn_sec and xt_literal_sec. + 2004-03-19 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * tc-hppa.c (cons_fix_new_hppa): Check for PC relative base type. diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index c011600..8f101db 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -638,6 +638,8 @@ static void xtensa_move_seg_list_to_beginning PARAMS ((seg_list *)); static void xtensa_move_literals PARAMS ((void)); +static void mark_literal_frags + PARAMS ((seg_list *)); static void xtensa_reorder_seg_list PARAMS ((seg_list *, segT)); static void xtensa_reorder_segments @@ -7485,21 +7487,9 @@ xtensa_move_literals () fixS *fix, *next_fix, **fix_splice; sym_list *lit; - /* As clunky as this is, we can't rely on frag_var - and frag_variant to get called in all situations. */ - - segment = literal_head->next; - while (segment) - { - frchain_from = seg_info (segment->seg)->frchainP; - search_frag = frchain_from->frch_root; - while (search_frag) - { - search_frag->tc_frag_data.is_literal = TRUE; - search_frag = search_frag->fr_next; - } - segment = segment->next; - } + mark_literal_frags (literal_head->next); + mark_literal_frags (init_literal_head->next); + mark_literal_frags (fini_literal_head->next); if (use_literal_section) return; @@ -7603,6 +7593,31 @@ xtensa_move_literals () } +/* Walk over all the frags for segments in a list and mark them as + containing literals. As clunky as this is, we can't rely on frag_var + and frag_variant to get called in all situations. */ + +static void +mark_literal_frags (segment) + seg_list *segment; +{ + frchainS *frchain_from; + fragS *search_frag; + + while (segment) + { + frchain_from = seg_info (segment->seg)->frchainP; + search_frag = frchain_from->frch_root; + while (search_frag) + { + search_frag->tc_frag_data.is_literal = TRUE; + search_frag = search_frag->fr_next; + } + segment = segment->next; + } +} + + static void xtensa_reorder_seg_list (head, after) seg_list *head; @@ -7872,11 +7887,11 @@ xtensa_post_relax_hook () xtensa_create_property_segments (get_frag_is_insn, XTENSA_INSN_SEC_NAME, - xt_literal_sec); + xt_insn_sec); if (use_literal_section) xtensa_create_property_segments (get_frag_is_literal, XTENSA_LIT_SEC_NAME, - xt_insn_sec); + xt_literal_sec); } |