Add support for the TLV relocation generated by LLVM for x86_64 MACH-O targets.
authorMephi <mephi42@gmail.com>
Mon, 18 Jun 2018 11:56:44 +0000 (12:56 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 18 Jun 2018 11:56:44 +0000 (12:56 +0100)
PR 23297
* mach-o-x86-64.c (x86_64_howto_table): Add entry for
BFD_RELOC_MACH_O_X86_64_RELOC_TLV.
(bfd_mach_o_x86_64_canonicalize_one_reloc): Handle the new reloc.
(bfd_mach_o_x86_64_swap_reloc_out): Likewise.
* reloc.c (BFD_RELOC_MACH_O_X86_64_TV): New entry.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/libbfd.h
bfd/mach-o-x86-64.c
bfd/reloc.c

index b14eea6c6c0b9435ddf28a66a17f1da52dee8904..356c7d2808dca44a5ab983ae09e3e626725a5cff 100644 (file)
@@ -1,3 +1,14 @@
+2018-06-18  Mephi  <mephi42@gmail.com>
+
+       PR 23297
+       * mach-o-x86-64.c (x86_64_howto_table): Add entry for
+       BFD_RELOC_MACH_O_X86_64_RELOC_TLV.
+       (bfd_mach_o_x86_64_canonicalize_one_reloc): Handle the new reloc.
+       (bfd_mach_o_x86_64_swap_reloc_out): Likewise.
+       * reloc.c (BFD_RELOC_MACH_O_X86_64_TV): New entry.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+
 2018-06-14  Faraz Shahbazker  <Faraz.Shahbazker@mips.com>
 
        * elfxx-mips.c (print_mips_ases): Add GINV extension.
index 5ceb935d2701f52624b623f2055d0eddc89b60fd..f53dbb5e8cb3619839019686b11d75747c723583 100644 (file)
@@ -5755,6 +5755,9 @@ the linker could optimize the movq to a leaq if possible.  */
 /* Same as BFD_RELOC_32_PCREL but with an implicit -4 addend.  */
   BFD_RELOC_MACH_O_X86_64_PCREL32_4,
 
+/* Used when referencing a TLV entry.  */
+  BFD_RELOC_MACH_O_X86_64_TLV,
+
 /* Addend for PAGE or PAGEOFF.  */
   BFD_RELOC_MACH_O_ARM64_ADDEND,
 
index 12b1a96557239f8a3b6ce5b455a9e515dfcd0c56..85f61b2ae2094a994a78d827f46cf8b5a8269e5a 100644 (file)
@@ -2852,6 +2852,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_MACH_O_X86_64_PCREL32_1",
   "BFD_RELOC_MACH_O_X86_64_PCREL32_2",
   "BFD_RELOC_MACH_O_X86_64_PCREL32_4",
+  "BFD_RELOC_MACH_O_X86_64_TLV",
   "BFD_RELOC_MACH_O_ARM64_ADDEND",
   "BFD_RELOC_MACH_O_ARM64_GOT_LOAD_PAGE21",
   "BFD_RELOC_MACH_O_ARM64_GOT_LOAD_PAGEOFF12",
index 667c1d0f1ce38228bba15575649cb539ba78a411..9ee93a4ffb970eff25478897dd8d53a5a9aed819 100644 (file)
@@ -117,6 +117,11 @@ static reloc_howto_type x86_64_howto_table[]=
        complain_overflow_bitfield,
        NULL, "BRANCH8",
        FALSE, 0xff, 0xff, TRUE),
+  /* 12 */
+  HOWTO(BFD_RELOC_MACH_O_X86_64_TLV, 0, 2, 32, TRUE, 0,
+       complain_overflow_bitfield,
+       NULL, "TLV",
+       FALSE, 0xffffffff, 0xffffffff, TRUE),
 };
 
 static bfd_boolean
@@ -220,6 +225,13 @@ bfd_mach_o_x86_64_canonicalize_one_reloc (bfd *       abfd,
          return TRUE;
        }
       break;
+    case BFD_MACH_O_X86_64_RELOC_TLV:
+      if (reloc.r_length == 2 && reloc.r_pcrel && reloc.r_extern)
+       {
+         res->howto = &x86_64_howto_table[12];
+         return TRUE;
+       }
+      break;
     default:
       return FALSE;
     }
@@ -288,6 +300,11 @@ bfd_mach_o_x86_64_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo)
       rinfo->r_pcrel = 1;
       rinfo->r_length = 2;
       break;
+    case BFD_RELOC_MACH_O_X86_64_TLV:
+      rinfo->r_type = BFD_MACH_O_X86_64_RELOC_TLV;
+      rinfo->r_pcrel = 1;
+      rinfo->r_length = 2;
+      break;
     default:
       return FALSE;
     }
index 411f998f54092df9a16b28192bf3f170db244344..68bc8a85c3d84c3b7ca63ad1766a274c493d63dc 100644 (file)
@@ -6816,6 +6816,10 @@ ENUM
   BFD_RELOC_MACH_O_X86_64_PCREL32_4
 ENUMDOC
   Same as BFD_RELOC_32_PCREL but with an implicit -4 addend.
+ENUM
+  BFD_RELOC_MACH_O_X86_64_TLV
+ENUMDOC
+  Used when referencing a TLV entry.
 
 
 ENUM