* elf32-sparc.c (_bfd_sparc_elf_howto_table): Remove support for
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Jul 2001 19:40:32 +0000 (19:40 +0000)
committerJakub Jelinek <jakub@redhat.com>
Wed, 11 Jul 2001 19:40:32 +0000 (19:40 +0000)
R_SPARC_UA64.
(elf32_sparc_check_relocs): Likewise.
Only create .rela section for alloced sections in shared libraries.
(elf32_sparc_relocate_section): Likewise.
Remove redundant check.
Optimize unaligned reloc usage.
* elf64-sparc.c (sparc64_elf_relocate_section): Remove redundant
check.

* testsuite/gas/sparc/unalign.s: Remove .uaxword test.
* testsuite/gas/sparc/unalign.d: Adjust accordingly.

bfd/ChangeLog
bfd/elf32-sparc.c
bfd/elf64-sparc.c
gas/ChangeLog
gas/testsuite/gas/sparc/unalign.d
gas/testsuite/gas/sparc/unalign.s

index c0e0704a7ec432ae1d15609d27f9231caa3f544f..6bc50e51192e06edeb9beff7efdf88eb9304ccf5 100644 (file)
@@ -1,3 +1,15 @@
+2001-07-11  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf32-sparc.c (_bfd_sparc_elf_howto_table): Remove support for
+       R_SPARC_UA64.
+       (elf32_sparc_check_relocs): Likewise.
+       Only create .rela section for alloced sections in shared libraries.
+       (elf32_sparc_relocate_section): Likewise.
+       Remove redundant check.
+       Optimize unaligned reloc usage.
+       * elf64-sparc.c (sparc64_elf_relocate_section): Remove redundant
+       check.
+
 2001-07-11  H.J. Lu  <hjl@gnu.org>
 
        * elf64-alpha.c (elf64_alpha_check_relocs): Only use the same
index 091cd3917f7a8a47148526b3eb5c90bd25eb4d0a..76d0324ee5fd2ba10d950d8ccd40128fb79ed0d3 100644 (file)
@@ -120,7 +120,7 @@ reloc_howto_type _bfd_sparc_elf_howto_table[] =
   HOWTO(R_SPARC_NONE,      0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    false,0,0x00000000,true),
   HOWTO(R_SPARC_NONE,      0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    false,0,0x00000000,true),
   HOWTO(R_SPARC_NONE,      0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    false,0,0x00000000,true),
-  HOWTO(R_SPARC_UA64,      0,4,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA64",    false,0,(~ (bfd_vma)0), true),
+  HOWTO(R_SPARC_UA64,      0,0, 0,false,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_UA64",    false,0,0x00000000,true),
   HOWTO(R_SPARC_UA16,      0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",    false,0,0x0000ffff,true),
   HOWTO(R_SPARC_REV32,     0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_REV32",   false,0,0xffffffff,true),
 };
@@ -554,11 +554,10 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
        case R_SPARC_LO10:
        case R_SPARC_UA16:
        case R_SPARC_UA32:
-       case R_SPARC_UA64:
          if (h != NULL)
            h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
 
-         if (info->shared)
+         if (info->shared && (sec->flags & SEC_ALLOC))
            {
              /* When creating a shared object, we must copy these
                  relocs into the output file.  We create a reloc
@@ -1223,7 +1222,6 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
                          || r_type == R_SPARC_LO10
                          || r_type == R_SPARC_UA16
                          || r_type == R_SPARC_UA32
-                         || r_type == R_SPARC_UA64
                          || ((r_type == R_SPARC_PC10
                               || r_type == R_SPARC_PC22)
                              && strcmp (h->root.root.string,
@@ -1412,8 +1410,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_SPARC_LO10:
        case R_SPARC_UA16:
        case R_SPARC_UA32:
-       case R_SPARC_UA64:
-         if (info->shared)
+         if (info->shared && (input_section->flags & SEC_ALLOC))
            {
              Elf_Internal_Rela outrel;
              boolean skip;
@@ -1463,6 +1460,28 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
+             /* Optimize unaligned reloc usage now that we know where
+                it finally resides.  */
+             switch (r_type)
+               {
+               case R_SPARC_16:
+                 if (outrel.r_offset & 1)
+                   r_type = R_SPARC_UA16;
+                 break;
+               case R_SPARC_UA16:
+                 if (!(outrel.r_offset & 1))
+                   r_type = R_SPARC_16;
+                 break;
+               case R_SPARC_32:
+                 if (outrel.r_offset & 3)
+                   r_type = R_SPARC_UA32;
+                 break;
+               case R_SPARC_UA32:
+                 if (!(outrel.r_offset & 3))
+                   r_type = R_SPARC_32;
+                 break;
+               }
+
              if (skip)
                memset (&outrel, 0, sizeof outrel);
              /* h->dynindx may be -1 if the symbol was marked to
@@ -1535,12 +1554,8 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
              ++sreloc->reloc_count;
 
              /* This reloc will be computed at runtime, so there's no
-                 need to do anything now, unless this is a RELATIVE
-                 reloc in an unallocated section.  */
-             if (skip
-                 || (input_section->flags & SEC_ALLOC) != 0
-                 || ELF32_R_TYPE (outrel.r_info) != R_SPARC_RELATIVE)
-               continue;
+                 need to do anything now.  */
+             continue;
            }
          break;
 
@@ -2024,7 +2039,7 @@ elf32_sparc_object_p (abfd)
     }
   else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
     return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
-                                      bfd_mach_sparc_sparclite_le);
+                                     bfd_mach_sparc_sparclite_le);
   else
     return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
 }
index bd32b6eb4fca3aab0a274e6a89f66de5436f453d..29effd1966d3c49bf28e2a8334f964ab4bbc46dc 100644 (file)
@@ -2283,12 +2283,8 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                ++sreloc->reloc_count;
 
                /* This reloc will be computed at runtime, so there's no
-                  need to do anything now, unless this is a RELATIVE
-                  reloc in an unallocated section.  */
-               if (skip
-                   || (input_section->flags & SEC_ALLOC) != 0
-                   || ELF64_R_TYPE_ID (outrel.r_info) != R_SPARC_RELATIVE)
-                 continue;
+                  need to do anything now.  */
+               continue;
              }
            break;
            }
index 4d4b854bc842144fb880a8b1d0a7776af43abec3..c9e6bd444425320e96ac0af70ae67c8b3f1fd9a8 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-11  Jakub Jelinek  <jakub@redhat.com>
+
+       * testsuite/gas/sparc/unalign.s: Remove .uaxword test.
+       * testsuite/gas/sparc/unalign.d: Adjust accordingly.
+
 2001-07-10  Mark Elbrecht  <snowball3@softhome.net>
 
        * config/obj-coff.c (coff_frob_symbol): Don't merge if the storage
index df335ef2135451c4d97a7c9705867f2f0f1c6b65..8227b509e45c2601f56e43cf01f0955e30ba141f 100644 (file)
@@ -12,7 +12,4 @@ Disassembly of section .data:
                        1: R_SPARC_UA32 fred
    4:  00 02 00 00     (unimp|illtrap)  0x20000
                        6: R_SPARC_UA16 jim
-   8:  03 00 00 00     sethi  %hi\(0\), %g1
-                       9: R_SPARC_UA64 harry
-   c:  00 00 00 00     (unimp|illtrap)  0
-  10:  00 04 05 06     (unimp|illtrap)  0x40506
+   8:  03 04 05 06     sethi  %hi\(0x10141800\), %g1
index 1de6b2b02ee2e598f01113dce1a4bc572f841418..b9e1108779ea4f54d25db0c3d8d9fc23f9ebe910 100644 (file)
@@ -7,9 +7,6 @@ foo:
        .byte 0x2
        .uahalf         jim
        .byte 0x3
-       .uaxword        harry
        .byte 0x4
        .byte 0x5
        .byte 0x6
-
-