csky: Support PC relative diff relocation
authorLifang Xia <lifang_xia@c-sky.com>
Fri, 14 Sep 2018 13:02:51 +0000 (21:02 +0800)
committerLifang Xia <lifang_xia@c-sky.com>
Fri, 14 Sep 2018 13:04:47 +0000 (21:04 +0800)
Define DIFF_EXPR_OK to Support PC relative diff relocation,
and add CKCORE_PCREL32 relocation process

bfd/
        * elf32-csky.c (csky_elf_howto_table): Fill special_function of
        R_CKCORE_PCREL32.
        (csky_elf_relocate_section): Add R_CKCORE_PCREL32 process.
gas/
        * config/tc-csky.c (md_apply_fix): Transmit
        BFD_RELOC_32_PCREL to BFD_RELOC_CKCORE_PCREL32.
        (tc_gen_reloc): Trasmit BFD_RELOC_CKCORE_ADDR32 to
        BFD_RELOC_CKCORE_PCREL32 while pc-relative.
        * config/tc-csky.h (DIFF_EXPR_OK): Define to enable PC relative
        diff relocs.

bfd/ChangeLog
bfd/elf32-csky.c
gas/ChangeLog
gas/config/tc-csky.c
gas/config/tc-csky.h

index bbc8e9f352f9240f039fa780c1f95439538a5398..3ed368ca455663167e48a6fb0ef9ef5ce1043eed 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-14  Lifang Xia <lifang_xia@c-sky.com>
+
+       * elf32-csky.c (csky_elf_howto_table): Fill special_function of
+       R_CKCORE_PCREL32.
+       (csky_elf_relocate_section): Add R_CKCORE_PCREL32 process.
+
 2018-09-14  Alan Modra  <amodra@gmail.com>
 
        PR 23425
index d406b5a624a728bd266906fdd0ecf1bea4a6b752..926166efd0397b0a15c33a46e7f4d6c2515316dc 100644 (file)
@@ -150,7 +150,7 @@ static reloc_howto_type csky_elf_howto_table[] =
         TRUE,                        /* pc_relative */
         0,                           /* bitpos */
         complain_overflow_dont,      /* complain_on_overflow */
-        NULL,                        /* special_function */
+        bfd_elf_generic_reloc,       /* special_function */
         "R_CKCORE_PCREL32",          /* name */
         FALSE,                       /* partial_inplace */
         0x0,                         /* src_mask */
@@ -4307,6 +4307,10 @@ csky_elf_relocate_section (bfd *                  output_bfd,
          if (h == NULL && (addend & 0x80000000))
            addend &= 0xffffffff;
          break;
+
+       case R_CKCORE_PCREL32:
+         break;
+
        case R_CKCORE_GOT12:
        case R_CKCORE_PLT12:
        case R_CKCORE_GOT_HI16:
@@ -5027,6 +5031,7 @@ csky_elf_relocate_section (bfd *                  output_bfd,
 
       if (howto->size == 2
          && (howto->type == R_CKCORE_ADDR32
+             || howto->type == R_CKCORE_PCREL32
              || howto->type == R_CKCORE_GOT32
              || howto->type == R_CKCORE_GOTOFF
              || howto->type == R_CKCORE_GOTPC
index 6b4b84d291d73a431f4df6afd432b21928735b9e..37a864a52eb16620311417a10868d58284964958 100644 (file)
@@ -1,3 +1,12 @@
+2018-09-10  Lifang Xia <lifang_xia@c-sky.com>
+
+       * config/tc-csky.c (md_apply_fix): Transmit BFD_RELOC_32_PCREL to
+       BFD_RELOC_CKCORE_PCREL32.
+       (tc_gen_reloc): Trasmit BFD_RELOC_CKCORE_ADDR32 to
+       BFD_RELOC_CKCORE_PCREL32 while pc-relative.
+       * config/tc-csky.h (DIFF_EXPR_OK): Define to enable PC relative diff
+       relocs.
+
 2018-09-14  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (process_suffix): Simplify CRC32 special
index bd0672f77cdf7d9ca4b9ea6fbf56b087bd87ba44..1c4b44b209b4e6f5dfcaf917d8f61afd5f60d6f8 100644 (file)
@@ -4920,7 +4920,9 @@ md_apply_fix (fixS   *fixP,
   /* We can handle these relocs.  */
   switch (fixP->fx_r_type)
     {
+    case BFD_RELOC_32_PCREL:
     case BFD_RELOC_CKCORE_PCREL32:
+      fixP->fx_r_type = BFD_RELOC_CKCORE_PCREL32;
       break;
     case BFD_RELOC_VTABLE_INHERIT:
       fixP->fx_r_type = BFD_RELOC_CKCORE_GNU_VTINHERIT;
@@ -5133,6 +5135,10 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
 {
   arelent *rel;
 
+  if (fixP->fx_pcrel
+      && fixP->fx_r_type == BFD_RELOC_CKCORE_ADDR32)
+      fixP->fx_r_type = BFD_RELOC_CKCORE_PCREL32;
+
   rel = xmalloc (sizeof (arelent));
   rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
index 4ea0c033315860fbd94db7b9c89fbb137b491fc4..bb70ca2431d2cc0ecde040144d09ff3e0ecd7bcc 100644 (file)
@@ -62,6 +62,9 @@
 #define DWARF2_DEFAULT_RETURN_COLUMN 15
 #define DWARF2_CIE_DATA_ALIGNMENT (-4)
 
+/* .-foo gets turned into PC relative relocs.  */
+#define DIFF_EXPR_OK 1
+
 typedef enum
 {
   MAP_UNDEFINED = 0,