[llvm] 8223982 - [X86][MC] Support R_X86_64_CODE_4_GOTPC32_TLSDESC (#116908)

via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 21 17:25:23 PST 2024


Author: Feng Zou
Date: 2024-11-22T09:25:19+08:00
New Revision: 8223982eba22323f7a737a62259d6d6048504107

URL: https://github.com/llvm/llvm-project/commit/8223982eba22323f7a737a62259d6d6048504107
DIFF: https://github.com/llvm/llvm-project/commit/8223982eba22323f7a737a62259d6d6048504107.diff

LOG: [X86][MC] Support R_X86_64_CODE_4_GOTPC32_TLSDESC (#116908)

For

  lea name at tlsdesc(%rip), %reg

add

  R_X86_64_CODE_4_GOTPC32_TLSDESC = 45

if the instruction starts at 4 bytes before the relocation offset. This
should be used if reg is one of the additional general-purpose
registers, r16-r31, in Intel APX. It is similar to
R_X86_64_GOTPC32_TLSDESC and linker optimization must take the different
instruction encoding into account.

Linker can convert the instructions with R_X86_64_CODE_4_GOTPC32_TLSDESC
to

  mov $name at tpoff, %reg

if the first byte of the instruction at the relocation offset - 4 is
0xd5 (namely, encoded w/REX2 prefix) when possible.

Binutils patch:
https://github.com/bminor/binutils-gdb/commit/a533c8df598b5ef99c54a13e2b137c98b34b043c
Binutils mailthread:
https://sourceware.org/pipermail/binutils/2023-December/131463.html
ABI discussion:
https://groups.google.com/g/x86-64-abi/c/ACwD-UQXVDs/m/vrgTenKyFwAJ
Blog: https://kanrobert.github.io/rfc/All-about-APX-relocation

Added: 
    

Modified: 
    llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
    llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
    llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
    llvm/test/MC/X86/tlsdesc-64.s

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
index 94b1ad9c1f9464..0c026cf443361a 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
@@ -45,3 +45,4 @@ ELF_RELOC(R_X86_64_GOTPCRELX,   41)
 ELF_RELOC(R_X86_64_REX_GOTPCRELX,    42)
 ELF_RELOC(R_X86_64_CODE_4_GOTPCRELX,    43)
 ELF_RELOC(R_X86_64_CODE_4_GOTTPOFF,    44)
+ELF_RELOC(R_X86_64_CODE_4_GOTPC32_TLSDESC,    45)

diff  --git a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
index aa02934cc99963..349cd011eff303 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
@@ -191,7 +191,9 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc,
   case MCSymbolRefExpr::VK_TLSCALL:
     return ELF::R_X86_64_TLSDESC_CALL;
   case MCSymbolRefExpr::VK_TLSDESC:
-    return ELF::R_X86_64_GOTPC32_TLSDESC;
+    return ((unsigned)Kind == X86::reloc_riprel_4byte_relax_rex2)
+               ? ELF::R_X86_64_CODE_4_GOTPC32_TLSDESC
+               : ELF::R_X86_64_GOTPC32_TLSDESC;
   case MCSymbolRefExpr::VK_TLSGD:
     checkIs32(Ctx, Loc, Type);
     return ELF::R_X86_64_TLSGD;

diff  --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
index f9916fa82b1ffd..f12275ffaba8bb 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
@@ -666,6 +666,7 @@ void X86MCCodeEmitter::emitMemModRMByte(
       case X86::SBB64rm:
       case X86::SUB64rm:
       case X86::XOR64rm:
+      case X86::LEA64r:
         return Kind == REX2  ? X86::reloc_riprel_4byte_relax_rex2
                : Kind == REX ? X86::reloc_riprel_4byte_relax_rex
                              : X86::reloc_riprel_4byte_relax;

diff  --git a/llvm/test/MC/X86/tlsdesc-64.s b/llvm/test/MC/X86/tlsdesc-64.s
index ebe1710c3e869b..d1d33817510904 100644
--- a/llvm/test/MC/X86/tlsdesc-64.s
+++ b/llvm/test/MC/X86/tlsdesc-64.s
@@ -17,3 +17,15 @@
 leaq a at tlsdesc(%rip), %rax
 call *a at tlscall(%rax)
 addq %fs:0, %rax
+
+# PRINT:      leaq a at tlsdesc(%rip), %r16
+# PRINT-NEXT: callq *a at tlscall(%r16)
+
+# CHECK:      12: leaq (%rip), %r16  # 0x1a <{{.*}}>
+# CHECK-NEXT:   0000000000000016: R_X86_64_CODE_4_GOTPC32_TLSDESC a-0x4
+# CHECK-NEXT: 1a: callq *(%r16)
+# CHECK-NEXT:   000000000000001a: R_X86_64_TLSDESC_CALL a
+
+leaq a at tlsdesc(%rip), %r16
+call *a at tlscall(%r16)
+addq %fs:0, %r16


        


More information about the llvm-commits mailing list