OSDN Git Service

Add support for a 32bit PC relative reloc
authorNick Clifton <nickc@redhat.com>
Wed, 20 Jul 2005 11:35:03 +0000 (11:35 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 20 Jul 2005 11:35:03 +0000 (11:35 +0000)
bfd/ChangeLog
bfd/elf32-m32r.c
include/elf/ChangeLog
include/elf/m32r.h

index 439a8ea..b7397de 100644 (file)
@@ -1,3 +1,11 @@
+2005-07-20  Kazuhiro Inaoka  <inaoka.kazuhiro@renesas.com>
+
+       * elf32-m32r.c (m32r_elf_howto_table): Support R_M32R_REL32.
+       (m32r_reloc_map): Likewise.
+       (m32r_elf_relocate_section): Likewise.
+       (m32r_elf_gc_sweep_hook): Likewise.
+       (m32r_elf_check_relocs): Likewise.
+
 2005-07-18  Nick Clifton  <nickc@redhat.com>
 
        * reloc.c: Add M32C and MS1 relocs.
index 16e507c..23075d6 100644 (file)
@@ -877,7 +877,21 @@ static reloc_howto_type m32r_elf_howto_table[] =
          0,                     /* dst_mask */
          FALSE),                /* pcrel_offset */
 
-  EMPTY_HOWTO (45),
+  /* A 32 bit PC relative relocation.  */
+  HOWTO (R_M32R_REL32,         /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc,/* special_function */
+        "R_M32R_REL32",                /* name */
+        FALSE,                 /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
   EMPTY_HOWTO (46),
   EMPTY_HOWTO (47),
 
@@ -1193,6 +1207,7 @@ static const struct m32r_reloc_map m32r_reloc_map[] =
   { BFD_RELOC_M32R_SDA16, R_M32R_SDA16_RELA },
   { BFD_RELOC_VTABLE_INHERIT, R_M32R_RELA_GNU_VTINHERIT },
   { BFD_RELOC_VTABLE_ENTRY, R_M32R_RELA_GNU_VTENTRY },
+  { BFD_RELOC_32_PCREL, R_M32R_REL32 },
 
   { BFD_RELOC_M32R_GOT24, R_M32R_GOT24 },
   { BFD_RELOC_M32R_26_PLTREL, R_M32R_26_PLTREL },
@@ -2611,6 +2626,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                               || r_type == R_M32R_HI16_SLO_RELA
                               || r_type == R_M32R_LO16_RELA)
                                  && !h->forced_local)
+                              || r_type == R_M32R_REL32
                               || r_type == R_M32R_10_PCREL_RELA
                               || r_type == R_M32R_18_PCREL_RELA
                               || r_type == R_M32R_26_PCREL_RELA)
@@ -2854,6 +2870,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
             case R_M32R_16_RELA:
             case R_M32R_24_RELA:
             case R_M32R_32_RELA:
+            case R_M32R_REL32:
             case R_M32R_18_PCREL_RELA:
             case R_M32R_26_PCREL_RELA:
             case R_M32R_HI16_ULO_RELA:
@@ -2862,7 +2879,8 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                   && r_symndx != 0
                   && (input_section->flags & SEC_ALLOC) != 0
                   && ((r_type != R_M32R_18_PCREL_RELA
-                       && r_type != R_M32R_26_PCREL_RELA)
+                       && r_type != R_M32R_26_PCREL_RELA
+                       && r_type != R_M32R_REL32)
                       || (h != NULL
                           && h->dynindx != -1
                           && (! info->symbolic
@@ -2912,7 +2930,8 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                   if (skip)
                     memset (&outrel, 0, sizeof outrel);
                   else if (r_type == R_M32R_18_PCREL_RELA
-                           || r_type == R_M32R_26_PCREL_RELA)
+                           || r_type == R_M32R_26_PCREL_RELA
+                           || r_type == R_M32R_REL32)
                     {
                       BFD_ASSERT (h != NULL && h->dynindx != -1);
                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
@@ -3683,6 +3702,7 @@ m32r_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
        case R_M32R_16_RELA:
        case R_M32R_24_RELA:
        case R_M32R_32_RELA:
+       case R_M32R_REL32:
        case R_M32R_HI16_ULO_RELA:
        case R_M32R_HI16_SLO_RELA:
        case R_M32R_LO16_RELA:
@@ -3704,7 +3724,8 @@ m32r_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
                if (p->sec == sec)
                  {
                    if (ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
-                       || ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA)
+                       || ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
+                       || ELF32_R_TYPE (rel->r_info) == R_M32R_REL32)
                      p->pc_count -= 1;
                    p->count -= 1;
                    if (p->count == 0)
@@ -3864,6 +3885,7 @@ m32r_elf_check_relocs (bfd *abfd,
         case R_M32R_16_RELA:
         case R_M32R_24_RELA:
         case R_M32R_32_RELA:
+        case R_M32R_REL32:
         case R_M32R_HI16_ULO_RELA:
         case R_M32R_HI16_SLO_RELA:
         case R_M32R_LO16_RELA:
@@ -3899,7 +3921,8 @@ m32r_elf_check_relocs (bfd *abfd,
           if ((info->shared
                && (sec->flags & SEC_ALLOC) != 0
               && ((r_type != R_M32R_26_PCREL_RELA
-                    && r_type != R_M32R_18_PCREL_RELA)
+                    && r_type != R_M32R_18_PCREL_RELA
+                    && r_type != R_M32R_REL32)
                   || (h != NULL
                       && (! info->symbolic
                           || h->root.type == bfd_link_hash_defweak
index 5b8c3eb..1822b40 100644 (file)
@@ -1,3 +1,7 @@
+2005-07-20  Kazuhiro Inaoka  <inaoka.kazuhiro@renesas.com>
+
+       * m32r.h (R_M32R_REL32): Added.
+
 2005-07-18  Ben Elliston  <bje@au.ibm.com>
 
        * dwarf2.h (enum dwarf_type): Remove DW_AT_GNU_decimal_float.
index b82377a..d648df9 100644 (file)
@@ -52,6 +52,8 @@ START_RELOC_NUMBERS (elf_m32r_reloc_type)
   RELOC_NUMBER (R_M32R_SDA16_RELA, 42)
   RELOC_NUMBER (R_M32R_RELA_GNU_VTINHERIT, 43)
   RELOC_NUMBER (R_M32R_RELA_GNU_VTENTRY, 44)
+
+  RELOC_NUMBER (R_M32R_REL32, 45)
                                                                                 
   RELOC_NUMBER (R_M32R_GOT24, 48)
   RELOC_NUMBER (R_M32R_26_PLTREL, 49)
@@ -70,6 +72,7 @@ START_RELOC_NUMBERS (elf_m32r_reloc_type)
   RELOC_NUMBER (R_M32R_GOTOFF_HI_ULO, 62)
   RELOC_NUMBER (R_M32R_GOTOFF_HI_SLO, 63)
   RELOC_NUMBER (R_M32R_GOTOFF_LO, 64)
+
 END_RELOC_NUMBERS (R_M32R_max)
 
 /* Processor specific section indices.  These sections do not actually