diff options
author | Tristan Gingold <gingold@adacore.com> | 2011-06-14 09:03:52 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2011-06-14 09:03:52 +0000 |
commit | 2fb4b302aae40bf05c70dbcfb34a14959435354f (patch) | |
tree | a677d28b72fc4c47a6a78539082074945aa2ab58 /gas/config/tc-ppc.c | |
parent | 5ce5db06f19972530c86aacc3b501723b788699e (diff) | |
download | gdb-2fb4b302aae40bf05c70dbcfb34a14959435354f.zip gdb-2fb4b302aae40bf05c70dbcfb34a14959435354f.tar.gz gdb-2fb4b302aae40bf05c70dbcfb34a14959435354f.tar.bz2 |
gas/
2011-06-14 Tristan Gingold <gingold@adacore.com>
* config/tc-ppc.h (struct ppc_tc_sy): Complete comment on within.
(tc_new_dot_label): Define.
(ppc_new_dot_label): Declare.
* config/tc-ppc.c (ppc_frob_label): Set within target field.
(ppc_fix_adjustable): Use this field to adjust the reloc.
(ppc_new_dot_label): New function.
gas/testsuite/
2011-06-14 Tristan Gingold <gingold@adacore.com>
* gas/ppc/test1xcoff32.d: Adjust for csect anchor.
Diffstat (limited to 'gas/config/tc-ppc.c')
-rw-r--r-- | gas/config/tc-ppc.c | 62 |
1 files changed, 16 insertions, 46 deletions
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 2051e96..aba7097 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -5352,6 +5352,7 @@ ppc_frob_label (symbolS *sym) symbol_append (sym, symbol_get_tc (ppc_current_csect)->within, &symbol_rootP, &symbol_lastP); symbol_get_tc (ppc_current_csect)->within = sym; + symbol_get_tc (sym)->within = ppc_current_csect; } #ifdef OBJ_ELF @@ -5841,55 +5842,17 @@ ppc_fix_adjustable (fixS *fix) || (ppc_after_toc_frag != NULL && val >= ppc_after_toc_frag->fr_address))) { - symbolS *csect; - symbolS *next_csect; - - if (symseg == text_section) - csect = ppc_text_csects; - else if (symseg == data_section) - csect = ppc_data_csects; - else - abort (); + symbolS *csect = tc->within; - /* Skip the initial dummy symbol. */ - csect = symbol_get_tc (csect)->next; - - if (csect != (symbolS *) NULL) - { - while ((next_csect = symbol_get_tc (csect)->next) != (symbolS *) NULL - && (symbol_get_frag (next_csect)->fr_address <= val)) - { - /* If the csect address equals the symbol value, then we - have to look through the full symbol table to see - whether this is the csect we want. Note that we will - only get here if the csect has zero length. */ - if (symbol_get_frag (csect)->fr_address == val - && S_GET_VALUE (csect) == val) - { - symbolS *scan; + /* If the symbol was not declared by a label (eg: a section symbol), + use the section instead of the csect. This doesn't happen in + normal AIX assembly code. */ + if (csect == NULL) + csect = seg_info (symseg)->sym; - for (scan = symbol_next (csect); - scan != NULL; - scan = symbol_next (scan)) - { - if (symbol_get_tc (scan)->subseg != 0) - break; - if (scan == fix->fx_addsy) - break; - } + fix->fx_offset += val - symbol_get_frag (csect)->fr_address; + fix->fx_addsy = csect; - /* If we found the symbol before the next csect - symbol, then this is the csect we want. */ - if (scan == fix->fx_addsy) - break; - } - - csect = next_csect; - } - - fix->fx_offset += val - symbol_get_frag (csect)->fr_address; - fix->fx_addsy = csect; - } return 0; } @@ -5931,6 +5894,13 @@ ppc_force_relocation (fixS *fix) return generic_force_reloc (fix); } +void +ppc_new_dot_label (symbolS *sym) +{ + /* Anchor this label to the current csect for relocations. */ + symbol_get_tc (sym)->within = ppc_current_csect; +} + #endif /* OBJ_XCOFF */ #ifdef OBJ_ELF |