[PATCH] C6X PREL31 relocation

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] C6X PREL31 relocation

Paul Brook
The attached patch implements BFD linker support the R_C6000_PREL31
relocation.  Unlike R_ARM_PREL31 the value is a scaled offset (i.e. the high
bits of the offset) rather than a byte offset.

Tested on c6x-elf

Ok?

2011-03-22  Paul Brook  <[hidden email]>
 
        bfd/
        * elf32-tic6x.c (elf32_tic6x_howto_table): R_C6000_PREL31 is
        pc-relative.
        (elf32_tic6x_howto_table_rel): Ditto.
        (elf32_tic6x_relocate_section): Implement R_C6000_PREL31.
        (elf32_tic6x_check_relocs): Ditto.

diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index 1adb11b..b165346 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -433,7 +433,7 @@ static reloc_howto_type elf32_tic6x_howto_table[] =
  1, /* rightshift */
  2, /* size (0 = byte, 1 = short, 2 = long) */
  31, /* bitsize */
- FALSE, /* pc_relative */
+ TRUE, /* pc_relative */
  0, /* bitpos */
  complain_overflow_dont,/* complain_on_overflow */
  bfd_elf_generic_reloc, /* special_function */
@@ -441,7 +441,7 @@ static reloc_howto_type elf32_tic6x_howto_table[] =
  FALSE, /* partial_inplace */
  0, /* src_mask */
  0x7fffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ TRUE), /* pcrel_offset */
   HOWTO (R_C6000_COPY, /* type */
  0, /* rightshift */
  2, /* size (0 = byte, 1 = short, 2 = long) */
@@ -1005,7 +1005,7 @@ static reloc_howto_type elf32_tic6x_howto_table_rel[] =
  1, /* rightshift */
  2, /* size (0 = byte, 1 = short, 2 = long) */
  31, /* bitsize */
- FALSE, /* pc_relative */
+ TRUE, /* pc_relative */
  0, /* bitpos */
  complain_overflow_dont,/* complain_on_overflow */
  bfd_elf_generic_reloc, /* special_function */
@@ -1013,7 +1013,7 @@ static reloc_howto_type elf32_tic6x_howto_table_rel[] =
  TRUE, /* partial_inplace */
  0, /* src_mask */
  0x7fffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ TRUE), /* pcrel_offset */
   HOWTO (R_C6000_COPY, /* type */
  0, /* rightshift */
  2, /* size (0 = byte, 1 = short, 2 = long) */
@@ -2425,12 +2425,15 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
   break;
 
  case R_C6000_PREL31:
-  /* Shared libraries and exception handling support not
-     implemented.  */
-  (*_bfd_error_handler) (_("%B: relocation type %d not implemented"),
- input_bfd, r_type);
-  ok = FALSE;
-  continue;
+  if (h != NULL
+      && h->plt.offset != (bfd_vma) -1
+      && htab->elf.splt != NULL)
+    {
+      relocation = (htab->elf.splt->output_section->vma
+    + htab->elf.splt->output_offset
+    + h->plt.offset);
+    }
+  break;
 
  case R_C6000_COPY:
   /* Invalid in relocatable object.  */
@@ -2608,6 +2611,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
       switch (r_type)
  {
  case R_C6000_PCR_S21:
+ case R_C6000_PREL31:
   /* This symbol requires a procedure linkage table entry.  We
      actually build the entry in adjust_dynamic_symbol,
      because this might be a case of linking PIC code which is
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] C6X PREL31 relocation

Joseph Myers
On Tue, 22 Mar 2011, Paul Brook wrote:

> The attached patch implements BFD linker support the R_C6000_PREL31
> relocation.  Unlike R_ARM_PREL31 the value is a scaled offset (i.e. the high
> bits of the offset) rather than a byte offset.
>
> Tested on c6x-elf
>
> Ok?

OK, presuming that testcases verifying the operation of this relocation
for both REL and RELA will be included in a patch to be posted that has
the main substance of assembler and linker support for the C6X EH model.

--
Joseph S. Myers
[hidden email]