summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-07-11 19:40:32 +0000
committerJakub Jelinek <jakub@redhat.com>2001-07-11 19:40:32 +0000
commit20278fa3263034d27f0b14ee22363b5fadc9d475 (patch)
treea3ff02a9958b7ae0fdd8bd3fc487b5b83e8179c8
parentcdbb0887ba21a8f7f079ec54224fde43a2b69f43 (diff)
downloadppe42-binutils-20278fa3263034d27f0b14ee22363b5fadc9d475.tar.gz
ppe42-binutils-20278fa3263034d27f0b14ee22363b5fadc9d475.zip
* 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. * testsuite/gas/sparc/unalign.s: Remove .uaxword test. * testsuite/gas/sparc/unalign.d: Adjust accordingly.
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf32-sparc.c41
-rw-r--r--bfd/elf64-sparc.c8
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/testsuite/gas/sparc/unalign.d5
-rw-r--r--gas/testsuite/gas/sparc/unalign.s3
6 files changed, 48 insertions, 26 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c0e0704a7e..6bc50e5119 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c
index 091cd3917f..76d0324ee5 100644
--- a/bfd/elf32-sparc.c
+++ b/bfd/elf32-sparc.c
@@ -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);
}
diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c
index bd32b6eb4f..29effd1966 100644
--- a/bfd/elf64-sparc.c
+++ b/bfd/elf64-sparc.c
@@ -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;
}
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 4d4b854bc8..c9e6bd4444 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/testsuite/gas/sparc/unalign.d b/gas/testsuite/gas/sparc/unalign.d
index df335ef213..8227b509e4 100644
--- a/gas/testsuite/gas/sparc/unalign.d
+++ b/gas/testsuite/gas/sparc/unalign.d
@@ -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
diff --git a/gas/testsuite/gas/sparc/unalign.s b/gas/testsuite/gas/sparc/unalign.s
index 1de6b2b02e..b9e1108779 100644
--- a/gas/testsuite/gas/sparc/unalign.s
+++ b/gas/testsuite/gas/sparc/unalign.s
@@ -7,9 +7,6 @@ foo:
.byte 0x2
.uahalf jim
.byte 0x3
- .uaxword harry
.byte 0x4
.byte 0x5
.byte 0x6
-
-
OpenPOWER on IntegriCloud