diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2010-01-23 12:05:33 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2010-01-23 12:05:33 +0000 |
commit | c865e45b1b6d482d20b3f6096d5227216db0e451 (patch) | |
tree | 22f683e1c80498b296b3c10cd2a906f305cce9cc /gas | |
parent | d35e937f74be8b03c594eb2b070db34c4e0541d6 (diff) | |
download | gdb-c865e45b1b6d482d20b3f6096d5227216db0e451.zip gdb-c865e45b1b6d482d20b3f6096d5227216db0e451.tar.gz gdb-c865e45b1b6d482d20b3f6096d5227216db0e451.tar.bz2 |
bfd/
* coff-rs6000.c (xcoff_howto_table): Change size to 0 and bitsize to 1.
(_bfd_xcoff_reloc_type_lookup): Handle BFD_RELOC_NONE.
* coff64-rs6000.c (xcoff64_howto_table): Change size to 0 and
bitsize to 1.
(xcoff64_reloc_type_lookup): Handle BFD_RELOC_NONE.
gas/
* write.h (fix_at_start): Declare.
* write.c (fix_new_internal): Add at_beginning parameter.
Use it instead of REVERSE_SORT_RELOCS. Fix the handling of
seg_fix_tailP for the at_beginning/REVERSE_SORT_RELOCS case.
(fix_new, fix_new_exp): Update accordingly.
(fix_at_start): New function.
* config/tc-ppc.c (md_pseudo_table): Add .ref to the OBJ_XCOFF section.
(ppc_ref): New function, for OBJ_XCOFF.
(md_apply_fix): Handle BFD_RELOC_NONE for OBJ_XCOFF.
* config/te-i386aix.h (REVERSE_SORT_RELOCS): Remove #undef.
gas/testsuite/
* gas/ppc/xcoff-ref-1.s, gas/ppc/xcoff-ref-1.l: New test.
* gas/ppc/aix.exp: Run it.
ld/testsuite/
* ld-powerpc/aix-ref-1-32.od, ld-powerpc/aix-ref-1-64.od,
ld-powerpc/aix-ref-1.s: New tests.
* ld-powerpc/aix52.exp: Run them.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 13 | ||||
-rw-r--r-- | gas/config/tc-ppc.c | 59 | ||||
-rw-r--r-- | gas/config/te-i386aix.h | 4 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/aix.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-ref-1.l | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-ref-1.s | 6 | ||||
-rw-r--r-- | gas/write.c | 53 | ||||
-rw-r--r-- | gas/write.h | 3 |
9 files changed, 124 insertions, 26 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 78640a5..f21a21e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2010-01-23 Richard Sandiford <r.sandiford@uk.ibm.com> + + * write.h (fix_at_start): Declare. + * write.c (fix_new_internal): Add at_beginning parameter. + Use it instead of REVERSE_SORT_RELOCS. Fix the handling of + seg_fix_tailP for the at_beginning/REVERSE_SORT_RELOCS case. + (fix_new, fix_new_exp): Update accordingly. + (fix_at_start): New function. + * config/tc-ppc.c (md_pseudo_table): Add .ref to the OBJ_XCOFF section. + (ppc_ref): New function, for OBJ_XCOFF. + (md_apply_fix): Handle BFD_RELOC_NONE for OBJ_XCOFF. + * config/te-i386aix.h (REVERSE_SORT_RELOCS): Remove #undef. + 2010-01-21 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * config/te-solaris.h (DWARF2_EH_FRAME_READ_ONLY): Make read-only diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 327f3c1..212f822 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -108,6 +108,7 @@ static void ppc_change_csect (symbolS *, offsetT); static void ppc_function (int); static void ppc_extern (int); static void ppc_lglobl (int); +static void ppc_ref (int); static void ppc_section (int); static void ppc_named_section (int); static void ppc_stabx (int); @@ -212,6 +213,7 @@ const pseudo_typeS md_pseudo_table[] = { "extern", ppc_extern, 0 }, { "function", ppc_function, 0 }, { "lglobl", ppc_lglobl, 0 }, + { "ref", ppc_ref, 0 }, { "rename", ppc_rename, 0 }, { "section", ppc_named_section, 0 }, { "stabx", ppc_stabx, 0 }, @@ -3559,6 +3561,58 @@ ppc_lglobl (int ignore ATTRIBUTE_UNUSED) demand_empty_rest_of_line (); } +/* The .ref pseudo-op. It takes a list of symbol names and inserts R_REF + relocations at the beginning of the current csect. + + (In principle, there's no reason why the relocations _have_ to be at + the beginning. Anywhere in the csect would do. However, inserting + at the beginning is what the native assmebler does, and it helps to + deal with cases where the .ref statements follow the section contents.) + + ??? .refs don't work for empty .csects. However, the native assembler + doesn't report an error in this case, and neither yet do we. */ + +static void +ppc_ref (int ignore ATTRIBUTE_UNUSED) +{ + char *name; + char c; + + if (ppc_current_csect == NULL) + { + as_bad (_(".ref outside .csect")); + ignore_rest_of_line (); + return; + } + + do + { + name = input_line_pointer; + c = get_symbol_end (); + + fix_at_start (symbol_get_frag (ppc_current_csect), 0, + symbol_find_or_make (name), 0, FALSE, BFD_RELOC_NONE); + + *input_line_pointer = c; + SKIP_WHITESPACE (); + c = *input_line_pointer; + if (c == ',') + { + input_line_pointer++; + SKIP_WHITESPACE (); + if (is_end_of_line[(unsigned char) *input_line_pointer]) + { + as_bad (_("missing symbol name")); + ignore_rest_of_line (); + return; + } + } + } + while (c == ','); + + demand_empty_rest_of_line (); +} + /* The .rename pseudo-op. The RS/6000 assembler can rename symbols, although I don't know why it bothers. */ @@ -6032,6 +6086,11 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) PPC_HA (value), 2); break; +#ifdef OBJ_XCOFF + case BFD_RELOC_NONE: + break; +#endif + #ifdef OBJ_ELF case BFD_RELOC_PPC64_HIGHER: if (fixP->fx_pcrel) diff --git a/gas/config/te-i386aix.h b/gas/config/te-i386aix.h index 04ce464..2b174a9 100644 --- a/gas/config/te-i386aix.h +++ b/gas/config/te-i386aix.h @@ -24,10 +24,6 @@ #include "obj-format.h" -/* Undefine REVERSE_SORT_RELOCS to keep the relocation entries sorted - in ascending vaddr. */ -#undef REVERSE_SORT_RELOCS - /* Define KEEP_RELOC_INFO so that the strip reloc info flag F_RELFLG is not used in the filehdr for COFF output. */ #define KEEP_RELOC_INFO diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index c14187d..a2b65e6 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-23 Richard Sandiford <r.sandiford@uk.ibm.com> + + * gas/ppc/xcoff-ref-1.s, gas/ppc/xcoff-ref-1.l: New test. + * gas/ppc/aix.exp: Run it. + 2010-01-21 H.J. Lu <hongjiu.lu@intel.com> * gas/i386/x86-64-xsave.s: Add tests for xsave64 and xrstor64. diff --git a/gas/testsuite/gas/ppc/aix.exp b/gas/testsuite/gas/ppc/aix.exp index bed4237..917f0d9 100644 --- a/gas/testsuite/gas/ppc/aix.exp +++ b/gas/testsuite/gas/ppc/aix.exp @@ -65,4 +65,6 @@ if [istarget powerpc-ibm-aix*] then { run_dump_test "textalign-xcoff-002" run_dump_test "xcoff-branch-1-32" run_dump_test "xcoff-branch-1-64" + + run_list_test "xcoff-ref-1" } diff --git a/gas/testsuite/gas/ppc/xcoff-ref-1.l b/gas/testsuite/gas/ppc/xcoff-ref-1.l new file mode 100644 index 0000000..2120a20 --- /dev/null +++ b/gas/testsuite/gas/ppc/xcoff-ref-1.l @@ -0,0 +1,5 @@ +.*: Assembler messages: +.*:1: Error: .ref outside .csect +.*:3: Error: junk at end of line, first unrecognized character is `1' +.*:4: Error: missing symbol name +.*:5: Error: missing symbol name diff --git a/gas/testsuite/gas/ppc/xcoff-ref-1.s b/gas/testsuite/gas/ppc/xcoff-ref-1.s new file mode 100644 index 0000000..74e264f --- /dev/null +++ b/gas/testsuite/gas/ppc/xcoff-ref-1.s @@ -0,0 +1,6 @@ + .ref foo + .csect bar[rw] + .ref 1234 + .ref a, + .ref , + .ref diff --git a/gas/write.c b/gas/write.c index 1ded21f..a148b24 100644 --- a/gas/write.c +++ b/gas/write.c @@ -150,7 +150,8 @@ fix_new_internal (fragS *frag, /* Which frag? */ symbolS *sub_symbol, /* X_op_symbol. */ offsetT offset, /* X_add_number. */ int pcrel, /* TRUE if PC-relative relocation. */ - RELOC_ENUM r_type ATTRIBUTE_UNUSED /* Relocation type. */) + RELOC_ENUM r_type ATTRIBUTE_UNUSED /* Relocation type. */, + int at_beginning) /* Add to the start of the list? */ { fixS *fixP; @@ -194,10 +195,6 @@ fix_new_internal (fragS *frag, /* Which frag? */ as_where (&fixP->fx_file, &fixP->fx_line); - /* Usually, we want relocs sorted numerically, but while - comparing to older versions of gas that have relocs - reverse sorted, it is convenient to have this compile - time option. xoxorich. */ { fixS **seg_fix_rootP = (frags_chained @@ -207,22 +204,22 @@ fix_new_internal (fragS *frag, /* Which frag? */ ? &seg_info (now_seg)->fix_tail : &frchain_now->fix_tail); -#ifdef REVERSE_SORT_RELOCS - - fixP->fx_next = *seg_fix_rootP; - *seg_fix_rootP = fixP; - -#else /* REVERSE_SORT_RELOCS */ - - fixP->fx_next = NULL; - - if (*seg_fix_tailP) - (*seg_fix_tailP)->fx_next = fixP; + if (at_beginning) + { + fixP->fx_next = *seg_fix_rootP; + *seg_fix_rootP = fixP; + if (fixP->fx_next == NULL) + *seg_fix_tailP = fixP; + } else - *seg_fix_rootP = fixP; - *seg_fix_tailP = fixP; - -#endif /* REVERSE_SORT_RELOCS */ + { + fixP->fx_next = NULL; + if (*seg_fix_tailP) + (*seg_fix_tailP)->fx_next = fixP; + else + *seg_fix_rootP = fixP; + *seg_fix_tailP = fixP; + } } return fixP; @@ -240,7 +237,7 @@ fix_new (fragS *frag, /* Which frag? */ RELOC_ENUM r_type /* Relocation type. */) { return fix_new_internal (frag, where, size, add_symbol, - (symbolS *) NULL, offset, pcrel, r_type); + (symbolS *) NULL, offset, pcrel, r_type, FALSE); } /* Create a fixup for an expression. Currently we only support fixups @@ -308,7 +305,19 @@ fix_new_exp (fragS *frag, /* Which frag? */ break; } - return fix_new_internal (frag, where, size, add, sub, off, pcrel, r_type); + return fix_new_internal (frag, where, size, add, sub, off, pcrel, + r_type, FALSE); +} + +/* Create a fixup at the beginning of FRAG. The arguments are the same + as for fix_new, except that WHERE is implicitly 0. */ + +fixS * +fix_at_start (fragS *frag, int size, symbolS *add_symbol, + offsetT offset, int pcrel, RELOC_ENUM r_type) +{ + return fix_new_internal (frag, 0, size, add_symbol, + (symbolS *) NULL, offset, pcrel, r_type, TRUE); } /* Generic function to determine whether a fixup requires a relocation. */ diff --git a/gas/write.h b/gas/write.h index d5fe679..8303f1b 100644 --- a/gas/write.h +++ b/gas/write.h @@ -176,6 +176,9 @@ extern void number_to_chars_bigendian (char *, valueT, int); extern fixS *fix_new (fragS * frag, int where, int size, symbolS * add_symbol, offsetT offset, int pcrel, bfd_reloc_code_real_type r_type); +extern fixS *fix_at_start + (fragS * frag, int size, symbolS * add_symbol, + offsetT offset, int pcrel, bfd_reloc_code_real_type r_type); extern fixS *fix_new_exp (fragS * frag, int where, int size, expressionS *exp, int pcrel, bfd_reloc_code_real_type r_type); |