From: Mephi Date: Mon, 18 Jun 2018 11:56:44 +0000 (+0100) Subject: Add support for the TLV relocation generated by LLVM for x86_64 MACH-O targets. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ed1299fe460812ad4bbdc2192d0c0cbeba3d6b66;p=binutils-gdb.git Add support for the TLV relocation generated by LLVM for x86_64 MACH-O targets. 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b14eea6c6c0..356c7d2808d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2018-06-18 Mephi + + 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 * elfxx-mips.c (print_mips_ases): Add GINV extension. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 5ceb935d270..f53dbb5e8cb 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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, diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 12b1a965572..85f61b2ae20 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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", diff --git a/bfd/mach-o-x86-64.c b/bfd/mach-o-x86-64.c index 667c1d0f1ce..9ee93a4ffb9 100644 --- a/bfd/mach-o-x86-64.c +++ b/bfd/mach-o-x86-64.c @@ -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; } diff --git a/bfd/reloc.c b/bfd/reloc.c index 411f998f540..68bc8a85c3d 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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