* MAINTAINERS: Change my e-mail address.
[deliverable/binutils-gdb.git] / bfd / elf32-v850.c
index 62bbbdacf21237b0ba80882279553c330c1bae95..0dc6542b2d64d3f674e203de5b4d33e8c6e7f1b5 100644 (file)
@@ -189,7 +189,7 @@ static reloc_howto_type v850_elf_howto_table[] =
         FALSE),                        /* pcrel_offset */
 
   /* Simple 32bit reloc.  */
-  HOWTO (R_V850_32,                    /* type */
+  HOWTO (R_V850_ABS32,                 /* type */
         0,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
@@ -197,7 +197,7 @@ static reloc_howto_type v850_elf_howto_table[] =
         0,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         v850_elf_reloc,                /* special_function */
-        "R_V850_32",                   /* name */
+        "R_V850_ABS32",                /* name */
         FALSE,                         /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
@@ -518,6 +518,21 @@ static reloc_howto_type v850_elf_howto_table[] =
        0,                     /* src_mask */
        0,                     /* dst_mask */
        TRUE),                 /* pcrel_offset */
+  
+  /* Simple pc-relative 32bit reloc.  */
+  HOWTO (R_V850_REL32,                 /* type */
+        0,                             /* rightshift */
+        2,                             /* size (0 = byte, 1 = short, 2 = long) */
+        32,                            /* bitsize */
+        TRUE,                          /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        v850_elf_reloc,                /* special_function */
+        "R_V850_REL32",                /* name */
+        FALSE,                         /* partial_inplace */
+        0xffffffff,                    /* src_mask */
+        0xffffffff,                    /* dst_mask */
+        FALSE),                        /* pcrel_offset */
 };
 
 /* Map BFD reloc types to V850 ELF reloc types.  */
@@ -538,7 +553,8 @@ static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
   { BFD_RELOC_HI16_S,                     R_V850_HI16_S                 },
   { BFD_RELOC_HI16,                       R_V850_HI16                   },
   { BFD_RELOC_LO16,                       R_V850_LO16                   },
-  { BFD_RELOC_32,                         R_V850_32                     },
+  { BFD_RELOC_32,                         R_V850_ABS32                  },
+  { BFD_RELOC_32_PCREL,                           R_V850_REL32                  },
   { BFD_RELOC_16,                         R_V850_16                     },
   { BFD_RELOC_8,                          R_V850_8                      },
   { BFD_RELOC_V850_SDA_16_16_OFFSET,       R_V850_SDA_16_16_OFFSET       },
@@ -636,7 +652,7 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
   int other = 0;
   const char *common = (const char *)0;
 
-  if (info->relocateable)
+  if (info->relocatable)
     return TRUE;
 
 #ifdef DEBUG
@@ -672,7 +688,8 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
        case R_V850_HI16_S:
        case R_V850_HI16:
        case R_V850_LO16:
-       case R_V850_32:
+       case R_V850_ABS32:
+       case R_V850_REL32:
        case R_V850_16:
        case R_V850_8:
        case R_V850_CALLT_6_7_OFFSET:
@@ -905,7 +922,8 @@ v850_elf_perform_relocation (abfd, r_type, addend, address)
       /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
       return bfd_reloc_notsupported;
 
-    case R_V850_32:
+    case R_V850_REL32:
+    case R_V850_ABS32:
       bfd_put_32 (abfd, addend, address);
       return bfd_reloc_ok;
 
@@ -1466,11 +1484,17 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
       value = SEXT24 (value);
       break;
 
+    case R_V850_REL32:
+      value -= (input_section->output_section->vma
+               + input_section->output_offset
+               + offset);
+      break;
+
     case R_V850_HI16_S:
     case R_V850_HI16:
     case R_V850_LO16:
     case R_V850_16:
-    case R_V850_32:
+    case R_V850_ABS32:
     case R_V850_8:
       break;
 
@@ -1608,7 +1632,7 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
   Elf_Internal_Rela *rel;
   Elf_Internal_Rela *relend;
 
-  if (info->relocateable)
+  if (info->relocatable)
     return TRUE;
 
   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
@@ -1853,6 +1877,9 @@ v850_elf_object_p (abfd)
     case E_V850E_ARCH:
       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
       break;
+    case E_V850E1_ARCH:
+      bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
+      break;
     }
   return TRUE;
 }
@@ -1871,6 +1898,7 @@ v850_elf_final_write_processing (abfd, linker)
     default:
     case bfd_mach_v850:  val = E_V850_ARCH; break;
     case bfd_mach_v850e: val = E_V850E_ARCH; break;
+    case bfd_mach_v850e1: val = E_V850E1_ARCH;  break;
     }
 
   elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
@@ -1936,8 +1964,24 @@ v850_elf_merge_private_bfd_data (ibfd, obfd)
 
   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
-    _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
-                       bfd_archive_filename (ibfd));
+    {
+      /* Allow v850e1 binaries to be linked with v850e binaries.
+        Set the output binary to v850e.  */
+      if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
+         && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
+       return TRUE;
+
+      if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
+         && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
+       {
+         elf_elfheader (obfd)->e_flags =
+           ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
+         return TRUE;
+       }
+
+      _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
+                         bfd_archive_filename (ibfd));
+    }
 
   return TRUE;
 }
@@ -1963,6 +2007,7 @@ v850_elf_print_private_bfd_data (abfd, ptr)
     default:
     case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
     case E_V850E_ARCH:  fprintf (file, _("v850e architecture")); break;
+    case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
     }
 
   fputc ('\n', file);
@@ -2496,7 +2541,7 @@ v850_elf_relax_section (abfd, sec, link_info, again)
 
   *again = FALSE;
 
-  if (link_info->relocateable
+  if (link_info->relocatable
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0)
     return TRUE;
@@ -3115,6 +3160,38 @@ v850_elf_relax_section (abfd, sec, link_info, again)
   result = FALSE;
   goto finish;
 }
+
+static struct bfd_elf_special_section const v850_elf_special_sections[]=
+{
+  { ".sdata",          0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_WRITE + SHF_V850_GPREL },
+  { ".rosdata",                0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_V850_GPREL },
+  { ".sbss",           0,      NULL,   0,
+    SHT_NOBITS,                SHF_ALLOC + SHF_WRITE + SHF_V850_GPREL },
+  { ".scommon",                0,      NULL,   0,
+    SHT_V850_SCOMMON,  SHF_ALLOC + SHF_WRITE + SHF_V850_GPREL },
+  { ".tdata",          0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_WRITE + SHF_V850_EPREL },
+  { ".tbss",           0,      NULL,   0,
+    SHT_NOBITS,                SHF_ALLOC + SHF_WRITE + SHF_V850_EPREL },
+  { ".tcommon",                0,      NULL,   0,
+    SHT_V850_TCOMMON,  SHF_ALLOC + SHF_WRITE + SHF_V850_R0REL },
+  { ".zdata",          0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_WRITE + SHF_V850_R0REL },
+  { ".rozdata",                0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_V850_R0REL },
+  { ".zbss",           0,      NULL,   0,
+    SHT_NOBITS,                SHF_ALLOC + SHF_WRITE + SHF_V850_R0REL },
+  { ".zcommon",                0,      NULL,   0,
+    SHT_V850_ZCOMMON,  SHF_ALLOC + SHF_WRITE + SHF_V850_R0REL },
+  { ".call_table_data",        0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_WRITE },
+  { ".call_table_text",        0,      NULL,   0,
+    SHT_PROGBITS,      SHF_ALLOC + SHF_WRITE + SHF_EXECINSTR },
+  { NULL,              0,      NULL,   0,
+    0,                 0 }
+};
 \f
 #define TARGET_LITTLE_SYM                      bfd_elf32_v850_vec
 #define TARGET_LITTLE_NAME                     "elf32-v850"
@@ -3138,6 +3215,7 @@ v850_elf_relax_section (abfd, sec, link_info, again)
 #define elf_backend_fake_sections              v850_elf_fake_sections
 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
 #define elf_backend_gc_sweep_hook               v850_elf_gc_sweep_hook
+#define elf_backend_special_sections           v850_elf_special_sections
 
 #define elf_backend_can_gc_sections 1
 #define elf_backend_rela_normal 1
This page took 0.025289 seconds and 4 git commands to generate.