[llvm] [X86][MC] Add R_X86_64_CODE_4_GOTTPOFF (PR #116633)
Feng Zou via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 18 23:16:08 PST 2024
https://github.com/fzou1 updated https://github.com/llvm/llvm-project/pull/116633
>From cbc4c61e9f53ac724f940c0a2ad3e86ca96ed446 Mon Sep 17 00:00:00 2001
From: Feng Zou <feng.zou at intel.com>
Date: Wed, 13 Nov 2024 10:43:33 +0800
Subject: [PATCH 1/2] [X86][MC] Add R_X86_64_CODE_4_GOTTPOFF
For
mov name at GOTTPOFF(%rip), %reg
add name at GOTTPOFF(%rip), %reg
add
`R_X86_64_CODE_4_GOTTPOFF` = 44
if the instruction starts at 4 bytes before the relocation offset. It's similar
to R_X86_64_GOTTPOFF.
Linker can treat `R_X86_64_CODE_4_GOTTPOFF` as `R_X86_64_GOTTPOFF` or
convert the instructions above to
mov $name at tpoff, %reg
add $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.
---
.../llvm/BinaryFormat/ELFRelocs/x86_64.def | 1 +
.../X86/MCTargetDesc/X86ELFObjectWriter.cpp | 3 ++
llvm/test/MC/X86/tls.s | 40 +++++++++++++++++++
3 files changed, 44 insertions(+)
create mode 100644 llvm/test/MC/X86/tls.s
diff --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
index 161b1969abfeb4..ff4516d1edf507 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
@@ -44,3 +44,4 @@ ELF_RELOC(R_X86_64_IRELATIVE, 37)
ELF_RELOC(R_X86_64_GOTPCRELX, 41)
ELF_RELOC(R_X86_64_REX_GOTPCRELX, 42)
ELF_RELOC(R_X86_64_REX2_GOTPCRELX, 43)
+ELF_RELOC(R_X86_64_CODE_4_GOTTPOFF, 44)
\ No newline at end of file
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
index 90222278d1ad6f..ab363e4eb8dce3 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
@@ -197,6 +197,9 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc,
return ELF::R_X86_64_TLSGD;
case MCSymbolRefExpr::VK_GOTTPOFF:
checkIs32(Ctx, Loc, Type);
+ if ((unsigned)Kind == X86::reloc_riprel_4byte_movq_load_rex2 ||
+ (unsigned)Kind == X86::reloc_riprel_4byte_relax_rex2)
+ return ELF::R_X86_64_CODE_4_GOTTPOFF;
return ELF::R_X86_64_GOTTPOFF;
case MCSymbolRefExpr::VK_TLSLD:
checkIs32(Ctx, Loc, Type);
diff --git a/llvm/test/MC/X86/tls.s b/llvm/test/MC/X86/tls.s
new file mode 100644
index 00000000000000..418ab692cac576
--- /dev/null
+++ b/llvm/test/MC/X86/tls.s
@@ -0,0 +1,40 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t
+// RUN: llvm-objdump -dr --no-print-imm-hex %t | FileCheck %s
+
+// CHECK: <_start>:
+// CHECK-NEXT: movq (%rip), %r16
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls0-0x4
+// CHECK-NEXT: movq (%rip), %r20
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls0-0x4
+// CHECK-NEXT: movq (%rip), %r16
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls1-0x4
+// CHECK-NEXT: addq (%rip), %r16
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls0-0x4
+// CHECK-NEXT: addq (%rip), %r28
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls0-0x4
+// CHECK-NEXT: addq (%rip), %r16
+// CHECK-NEXT: R_X86_64_CODE_4_GOTTPOFF tls1-0x4
+
+.type tls0, at object
+.section .tbss,"awT", at nobits
+.globl tls0
+.align 4
+tls0:
+.long 0
+.size tls0, 4
+.type tls1, at object
+.globl tls1
+.align 4
+tls1:
+.long 0
+.size tls1, 4
+.section .text
+.globl _start
+_start:
+ # EGPR
+ movq tls0 at GOTTPOFF(%rip), %r16
+ movq tls0 at GOTTPOFF(%rip), %r20
+ movq tls1 at GOTTPOFF(%rip), %r16
+ addq tls0 at GOTTPOFF(%rip), %r16
+ addq tls0 at GOTTPOFF(%rip), %r28
+ addq tls1 at GOTTPOFF(%rip), %r16
\ No newline at end of file
>From 1dd700dca81210e4269976d2f5edafafb10d7351 Mon Sep 17 00:00:00 2001
From: Feng Zou <feng.zou at intel.com>
Date: Tue, 19 Nov 2024 15:14:37 +0800
Subject: [PATCH 2/2] Removed .align and .size in test, and added trailing
'\n'.
---
llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def | 3 ++-
llvm/test/MC/X86/tls.s | 7 ++-----
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
index ff4516d1edf507..f3ce19e161fda3 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/x86_64.def
@@ -44,4 +44,5 @@ ELF_RELOC(R_X86_64_IRELATIVE, 37)
ELF_RELOC(R_X86_64_GOTPCRELX, 41)
ELF_RELOC(R_X86_64_REX_GOTPCRELX, 42)
ELF_RELOC(R_X86_64_REX2_GOTPCRELX, 43)
-ELF_RELOC(R_X86_64_CODE_4_GOTTPOFF, 44)
\ No newline at end of file
+ELF_RELOC(R_X86_64_CODE_4_GOTTPOFF, 44)
+
diff --git a/llvm/test/MC/X86/tls.s b/llvm/test/MC/X86/tls.s
index 418ab692cac576..2e3c16131a9836 100644
--- a/llvm/test/MC/X86/tls.s
+++ b/llvm/test/MC/X86/tls.s
@@ -18,16 +18,12 @@
.type tls0, at object
.section .tbss,"awT", at nobits
.globl tls0
-.align 4
tls0:
.long 0
-.size tls0, 4
.type tls1, at object
.globl tls1
-.align 4
tls1:
.long 0
-.size tls1, 4
.section .text
.globl _start
_start:
@@ -37,4 +33,5 @@ _start:
movq tls1 at GOTTPOFF(%rip), %r16
addq tls0 at GOTTPOFF(%rip), %r16
addq tls0 at GOTTPOFF(%rip), %r28
- addq tls1 at GOTTPOFF(%rip), %r16
\ No newline at end of file
+ addq tls1 at GOTTPOFF(%rip), %r16
+
More information about the llvm-commits
mailing list