2002-02-19 Martin Schwidefsky <schwidefsky@de.ibm.com>
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 19 Feb 2002 18:22:16 +0000 (18:22 +0000)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 19 Feb 2002 18:22:16 +0000 (18:22 +0000)
* archures.c (bfd_mach_s390_esa): Rename to bfd_mach_s390_31.
(bfd_mach_s390_esame): Rename to bfd_mach_s390_64.
* bfd-in2.h: Regenerate.
* cpu-s390.c (arch_info_struct): Use renamed architecture defines.
Replace architecture name "s390" with "s390:31-bit" and "s390:esame"
with "s390:64-bit".
* elf32-s390.c (elf_howto_table): Add 32 bit pc relative relocations.
(elf_s390_reloc_type_lookup): Likewise.
(elf_s390_check_relocs): Likewise.
(elf_s390_gc_sweep_hook): Likewise.
(elf_s390_relocate_section): Likewise.
(elf_s390_object_p): Use renamed architecture define.
* elf64-s390.c (elf_s390_object_p): Use renamed architecture define.

bfd/ChangeLog
bfd/archures.c
bfd/bfd-in2.h
bfd/cpu-s390.c
bfd/elf32-s390.c
bfd/elf64-s390.c

index bfd0a077cdc5bb57d96aa042be4ff5a40cb0ce79..4e343e3aeab13382613f9f31d35b24dfb625d868 100644 (file)
@@ -1,3 +1,19 @@
+2002-02-19  Martin Schwidefsky  <schwidefsky@de.ibm.com>
+
+       * archures.c (bfd_mach_s390_esa): Rename to bfd_mach_s390_31.
+       (bfd_mach_s390_esame): Rename to bfd_mach_s390_64.
+       * bfd-in2.h: Regenerate.
+       * cpu-s390.c (arch_info_struct): Use renamed architecture defines.
+       Replace architecture name "s390" with "s390:31-bit" and "s390:esame"
+       with "s390:64-bit".
+       * elf32-s390.c (elf_howto_table): Add 32 bit pc relative relocations.
+       (elf_s390_reloc_type_lookup): Likewise.
+       (elf_s390_check_relocs): Likewise.
+       (elf_s390_gc_sweep_hook): Likewise.
+       (elf_s390_relocate_section): Likewise.
+       (elf_s390_object_p): Use renamed architecture define.
+       * elf64-s390.c (elf_s390_object_p): Use renamed architecture define.
+
 2002-02-19  Frank Ch. Eigler  <fche@redhat.com>
 
        * syms.c (stt[]): Sorted.  Added .init/.fini -> "t" mapping.
index 1caac7ff1490aeed71e868e8c6eda776e14a8658..fb2ba9b79e29c0af0eff5148b8bb2e2bc6cf3ae5 100644 (file)
@@ -259,8 +259,8 @@ DESCRIPTION
 .#define bfd_mach_avr5         5
 .  bfd_arch_cris,      {* Axis CRIS *}
 .  bfd_arch_s390,      {* IBM s390 *}
-.#define bfd_mach_s390_esa      0
-.#define bfd_mach_s390_esame    1
+.#define bfd_mach_s390_31       0
+.#define bfd_mach_s390_64       1
 .  bfd_arch_openrisc,  {* OpenRISC *}
 .  bfd_arch_mmix,      {* Donald Knuth's educational processor.  *}
 .  bfd_arch_xstormy16,
index 83677e9d492f2f0e8bfe944a4a28059f18666518..a582806b8e75fff9dfebe4a8f6dbfe935ea266f3 100644 (file)
@@ -1638,8 +1638,8 @@ enum bfd_architecture
 #define bfd_mach_avr5          5
   bfd_arch_cris,      /* Axis CRIS */
   bfd_arch_s390,      /* IBM s390 */
-#define bfd_mach_s390_esa      0
-#define bfd_mach_s390_esame    1
+#define bfd_mach_s390_31       0
+#define bfd_mach_s390_64       1
   bfd_arch_openrisc,  /* OpenRISC */
   bfd_arch_mmix,      /* Donald Knuth's educational processor.  */
   bfd_arch_xstormy16,
index 09ec78d6c802dec364038cb091ff578f0a7898f4..d537e1257f9dd2fb238c8f14fe3fb4f2f48d3eb7 100644 (file)
 #include "sysdep.h"
 #include "libbfd.h"
 
-const bfd_arch_info_type bfd_s390_esame_arch =
+const bfd_arch_info_type bfd_s390_64_arch =
 {
     64,        /* bits in a word */
     64,        /* bits in an address */
     8, /* bits in a byte */
     bfd_arch_s390,
-    bfd_mach_s390_esame,
+    bfd_mach_s390_64,
     "s390",
-    "s390:esame",
+    "s390:64-bit",
     3, /* section alignment power */
     true, /* the default */
     bfd_default_compatible,
@@ -45,12 +45,12 @@ const bfd_arch_info_type bfd_s390_arch =
     32,        /* bits in an address */
     8, /* bits in a byte */
     bfd_arch_s390,
-    bfd_mach_s390_esa,
+    bfd_mach_s390_31,
     "s390",
-    "s390:390",
+    "s390:31-bit",
     3, /* section alignment power */
     true, /* the default */
     bfd_default_compatible,
     bfd_default_scan,
-    &bfd_s390_esame_arch
+    &bfd_s390_64_arch
 };
index 01ce47c3056e31e60aef9db426516a46f6b4ca5b..1f197b5a49c9e7586f9705b536f288dd32eb7f69 100644 (file)
@@ -111,6 +111,10 @@ static reloc_howto_type elf_howto_table[] =
   HOWTO(R_390_PC16,      0, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16",    false, 0,0x0000ffff,  true),
   HOWTO(R_390_PC16DBL,   1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff,  true),
   HOWTO(R_390_PLT16DBL,  1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff,  true),
+  HOWTO(R_390_PC32DBL,  1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff,  true),
+  HOWTO(R_390_PLT32DBL,         1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff,  true),
+  HOWTO(R_390_GOTPCDBL,  1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,0xffffffff,  true),
+  HOWTO(R_390_GOTENT,   1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT",   false, 0,0xffffffff,  true),
 };
 
 /* GNU extension to record C++ vtable hierarchy.  */
@@ -166,6 +170,14 @@ elf_s390_reloc_type_lookup (abfd, code)
       return &elf_howto_table[(int) R_390_PC16DBL];
     case BFD_RELOC_390_PLT16DBL:
       return &elf_howto_table[(int) R_390_PLT16DBL];
+    case BFD_RELOC_390_PC32DBL:
+      return &elf_howto_table[(int) R_390_PC32DBL];
+    case BFD_RELOC_390_PLT32DBL:
+      return &elf_howto_table[(int) R_390_PLT32DBL];
+    case BFD_RELOC_390_GOTPCDBL:
+      return &elf_howto_table[(int) R_390_GOTPCDBL];
+    case BFD_RELOC_390_GOTENT:
+      return &elf_howto_table[(int) R_390_GOTENT];
     case BFD_RELOC_VTABLE_INHERIT:
       return &elf32_s390_vtinherit_howto;
     case BFD_RELOC_VTABLE_ENTRY:
@@ -650,6 +662,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
        case R_390_GOT12:
         case R_390_GOT16:
        case R_390_GOT32:
+       case R_390_GOTENT:
          /* This symbol requires a global offset table entry.  */
          if (h != NULL)
            {
@@ -679,6 +692,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
 
        case R_390_GOTOFF:
        case R_390_GOTPC:
+       case R_390_GOTPCDBL:
          if (htab->sgot == NULL)
            {
              if (htab->elf.dynobj == NULL)
@@ -689,6 +703,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
          break;
 
         case R_390_PLT16DBL:
+        case R_390_PLT32DBL:
        case R_390_PLT32:
          /* This symbol requires a procedure linkage table entry.  We
              actually build the entry in adjust_dynamic_symbol,
@@ -711,6 +726,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
        case R_390_32:
         case R_390_PC16:
         case R_390_PC16DBL:
+       case R_390_PC32DBL:
        case R_390_PC32:
          if (h != NULL && !info->shared)
            {
@@ -752,6 +768,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
               && (sec->flags & SEC_ALLOC) != 0
               && ((ELF32_R_TYPE (rel->r_info) != R_390_PC16
                    && ELF32_R_TYPE (rel->r_info) != R_390_PC16DBL
+                   && ELF32_R_TYPE (rel->r_info) != R_390_PC32DBL
                    && ELF32_R_TYPE (rel->r_info) != R_390_PC32)
                   || (h != NULL
                       && (! info->symbolic
@@ -854,6 +871,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
              p->count += 1;
              if (ELF32_R_TYPE (rel->r_info) == R_390_PC16
                  || ELF32_R_TYPE (rel->r_info) == R_390_PC16DBL
+                 || ELF32_R_TYPE (rel->r_info) == R_390_PC32DBL
                  || ELF32_R_TYPE (rel->r_info) == R_390_PC32)
                p->pc_count += 1;
            }
@@ -954,6 +972,8 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
       case R_390_GOT32:
       case R_390_GOTOFF:
       case R_390_GOTPC:
+      case R_390_GOTPCDBL:
+      case R_390_GOTENT:
        r_symndx = ELF32_R_SYM (rel->r_info);
        if (r_symndx >= symtab_hdr->sh_info)
          {
@@ -974,6 +994,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
       case R_390_32:
       case R_390_PC16:
       case R_390_PC16DBL:
+      case R_390_PC32DBL:
       case R_390_PC32:
        r_symndx = ELF32_R_SYM (rel->r_info);
        if (r_symndx >= symtab_hdr->sh_info)
@@ -994,6 +1015,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
                {
                  if (ELF32_R_TYPE (rel->r_info) == R_390_PC16
                      || ELF32_R_TYPE (rel->r_info) == R_390_PC16DBL
+                     || ELF32_R_TYPE (rel->r_info) == R_390_PC32DBL
                      || ELF32_R_TYPE (rel->r_info) == R_390_PC32)
                    p->pc_count -= 1;
                  p->count -= 1;
@@ -1005,6 +1027,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
        break;
 
       case R_390_PLT16DBL:
+      case R_390_PLT32DBL:
       case R_390_PLT32:
        r_symndx = ELF32_R_SYM (rel->r_info);
        if (r_symndx >= symtab_hdr->sh_info)
@@ -1716,6 +1739,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
         case R_390_GOT12:
         case R_390_GOT16:
         case R_390_GOT32:
+       case R_390_GOTENT:
           /* Relocation is to the entry for this symbol in the global
              offset table.  */
          if (htab->sgot == NULL)
@@ -1803,6 +1827,16 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
            abort ();
 
          relocation = htab->sgot->output_offset + off;
+
+         /*
+          * For @GOTENT the relocation is against the offset between
+          * the instruction and the symbols entry in the GOT and not
+          * between the start of the GOT and the symbols entry. We
+          * add the vma of the GOT to get the correct value.
+          */
+         if (r_type == R_390_GOTENT)
+           relocation += htab->sgot->output_section->vma;
+
           break;
 
         case R_390_GOTOFF:
@@ -1818,12 +1852,14 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
           break;
 
         case R_390_GOTPC:
+       case R_390_GOTPCDBL:
           /* Use global offset table as symbol value.  */
           relocation = htab->sgot->output_section->vma;
          unresolved_reloc = false;
           break;
 
         case R_390_PLT16DBL:
+        case R_390_PLT32DBL:
         case R_390_PLT32:
           /* Relocation is to the entry for this symbol in the
              procedure linkage table.  */
@@ -1853,6 +1889,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
         case R_390_32:
         case R_390_PC16:
         case R_390_PC16DBL:
+        case R_390_PC32DBL:
         case R_390_PC32:
          /* r_symndx will be zero only for relocs against symbols
             from removed linkonce sections, or sections discarded by
@@ -1864,6 +1901,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
           if ((info->shared
               && ((r_type != R_390_PC16
                    && r_type != R_390_PC16DBL
+                   && r_type != R_390_PC32DBL
                    && r_type != R_390_PC32)
                   || (h != NULL
                       && h->dynindx != -1
@@ -1909,6 +1947,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
                       && h->dynindx != -1
                       && (r_type == R_390_PC16
                           || r_type == R_390_PC16DBL
+                          || r_type == R_390_PC32DBL
                           || r_type == R_390_PC32
                           || !info->shared
                           || !info->symbolic
@@ -2375,7 +2414,7 @@ static boolean
 elf_s390_object_p (abfd)
      bfd *abfd;
 {
-  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esa);
+  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_31);
 }
 
 static boolean
index f296c3e91314cbbd332af10507b5ed2090e1dead..5be792881c5f3d2691c166dca5893f4c4cd0acf3 100644 (file)
@@ -2325,7 +2325,7 @@ static boolean
 elf_s390_object_p (abfd)
      bfd *abfd;
 {
-  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esame);
+  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
 }
 
 /*