]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Sat, 30 Jan 2010 09:58:03 +0000 (09:58 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Sat, 30 Jan 2010 09:58:03 +0000 (09:58 +0000)
* 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.

12 files changed:
bfd/ChangeLog
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
gas/ChangeLog
gas/config/tc-ppc.c
gas/config/te-i386aix.h
gas/testsuite/ChangeLog
gas/testsuite/gas/ppc/aix.exp
gas/write.c
gas/write.h
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/aix52.exp

index 4e562c38451b83fd369de5bf11b16a27edfc9086..47c7f2841955ab7b335a35e913dd4b534c1590cb 100644 (file)
@@ -1,3 +1,11 @@
+2010-01-30  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * 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.
+
 2010-01-27  Alan Modra  <amodra@gmail.com>
 
        PR ld/11217
index e8d54841a6a9c760cef86aadbe7cad6eb9c36f19..040a030a40b689c8d6512dbacb78be57c7b9d432 100644 (file)
@@ -896,11 +896,11 @@ reloc_howto_type xcoff_howto_table[] =
 
   EMPTY_HOWTO (0xe),
 
-  /* Non-relocating reference.  */
+  /* Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
   HOWTO (R_REF,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* bitsize */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
@@ -1162,6 +1162,8 @@ _bfd_xcoff_reloc_type_lookup (abfd, code)
     case BFD_RELOC_32:
     case BFD_RELOC_CTOR:
       return &xcoff_howto_table[0];
+    case BFD_RELOC_NONE:
+      return &xcoff_howto_table[0xf];
     default:
       return NULL;
     }
index e2020707206f4b94ab554a53df1af5a971ad16de..8abec105b6323ecd9468754bd1bc9b3f465d065c 100644 (file)
@@ -1594,11 +1594,11 @@ reloc_howto_type xcoff64_howto_table[] =
 
   EMPTY_HOWTO (0xe),
 
-  /* Non-relocating reference. */
+  /* Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
   HOWTO (R_REF,                        /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
-        32,                    /* bitsize */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* bitsize */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
@@ -1882,6 +1882,8 @@ xcoff64_reloc_type_lookup (abfd, code)
       return &xcoff64_howto_table[0x1c];
     case BFD_RELOC_64:
       return &xcoff64_howto_table[0];
+    case BFD_RELOC_NONE:
+      return &xcoff64_howto_table[0xf];
     default:
       return NULL;
     }
index 9cd161b973881fa2eb83c6b61527111e782fa09a..b6f9e60a9185bbd1c1e4d4797e22f4616c051e5d 100644 (file)
@@ -1,3 +1,16 @@
+2010-01-30  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-27  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        Backport from trunk:
index 493bfe5546bd2a2b02663957955acd7ddfee0214..e81bb968ae431277bf25b2ce3ab9d29e7bff588c 100644 (file)
@@ -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 },
@@ -3552,6 +3554,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.  */
 
@@ -6025,6 +6079,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)
index 04ce4643b9a6cd55ceb10a8eed601d3847ae3423..2b174a900203a3c0174422fac421e32b624bd218 100644 (file)
 
 #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
index 5145c7052e9675e3f80a3fa4c4eed5589e146c43..417e4f362d3a11a754958afd4a0c0ecb5702abe1 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-30  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-29  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * gas/pe/section-align-1.d: Generalise to pass on more targets.
index bed4237f42a7ce798308b539bd229587cceaf43f..917f0d956788662786a4b3f9f5a645234725d18c 100644 (file)
@@ -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"
 }
index 8adb87b94a302c67d7874756e9688203289c70a0..4c63a2651c6c8bb20b72747693f078c48efa07f5 100644 (file)
@@ -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.  */
index d5fe6791d0b411d827a9f13bd84a9265d0190079..8303f1be98b6548e4e30a326f042f78e07aed7f5 100644 (file)
@@ -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);
index b5f291ba9ea542d15e740b6544f62159d2138fc7..5b05fada870ec0e3f86492d6728aeea2d1b106b7 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-30  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+       * 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.
+
 2009-10-19  Hans-Peter Nilsson  <hp@axis.com>
 
        * ld-cris/tls-e-20.d, ld-cris/tls-e-20a.d, ld-cris/tls-e-22.d,
index d608490259d54dd245b2bc36b68b97454e305fc1..2f00cff2c4897d9de032e6dad5c1a4da5538f973 100644 (file)
@@ -196,6 +196,11 @@ set aix52tests {
      "" {aix-rel-1.s}
      {{objdump -hr aix-rel-1.od}} "aix-rel-1.ro"}
 
+    {".ref test 1" "-efoo1"
+     "" {aix-ref-1.s}
+     {{objdump -dr aix-ref-1-SIZE.od}}
+     "aix-ref-1"}
+
     {"Weak test 1 (rel)" "-r"
      "" {aix-weak-1a.s aix-weak-1b.s}
      {{nm {} aix-weak-1-rel.nd} {objdump -h aix-weak-1-rel.hd}}