-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[X86][MC] Add R_X86_64_CODE_4_GOTTPOFF #116633
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-backend-x86 @llvm/pr-subscribers-llvm-binary-utilities Author: Feng Zou (fzou1) ChangesFor mov name@GOTTPOFF(%rip), %reg add
if the instruction starts at 4 bytes before the relocation offset. It's similar to R_X86_64_GOTTPOFF. Linker can treat mov $name@tpoff, %reg if the first byte of the instruction at the relocation Full diff: https://github.com/llvm/llvm-project/pull/116633.diff 3 Files Affected:
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,@object
+.section .tbss,"awT",@nobits
+.globl tls0
+.align 4
+tls0:
+.long 0
+.size tls0, 4
+.type tls1,@object
+.globl tls1
+.align 4
+tls1:
+.long 0
+.size tls1, 4
+.section .text
+.globl _start
+_start:
+ # EGPR
+ movq tls0@GOTTPOFF(%rip), %r16
+ movq tls0@GOTTPOFF(%rip), %r20
+ movq tls1@GOTTPOFF(%rip), %r16
+ addq tls0@GOTTPOFF(%rip), %r16
+ addq tls0@GOTTPOFF(%rip), %r28
+ addq tls1@GOTTPOFF(%rip), %r16
\ No newline at end of file
|
For mov name@GOTTPOFF(%rip), %reg add name@GOTTPOFF(%rip), %reg add `R_X86_64_CODE_4_GOTTPOFF` = 44 in llvm#116633. Linker can treat `R_X86_64_CODE_4_GOTTPOFF` as `R_X86_64_GOTTPOFF` or convert the instructions above to mov $name, %reg add $name, %reg if the first byte of the instruction at the relocation `offset - 4` is `0xd5` (namely, encoded w/REX2 prefix) when possible.
@@ -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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing trailing \n
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Thanks.
llvm/test/MC/X86/tls.s
Outdated
|
||
.type tls0,@object | ||
.section .tbss,"awT",@nobits | ||
.globl tls0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
drop .align
and .size
, unneeded by this test
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
llvm/test/MC/X86/tls.s
Outdated
movq tls1@GOTTPOFF(%rip), %r16 | ||
addq tls0@GOTTPOFF(%rip), %r16 | ||
addq tls0@GOTTPOFF(%rip), %r28 | ||
addq tls1@GOTTPOFF(%rip), %r16 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missing trailing \n
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
llvm/test/MC/X86/tls.s
Outdated
// RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t | ||
// RUN: llvm-objdump -dr --no-print-imm-hex %t | FileCheck %s | ||
|
||
// CHECK: <_start>: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not use the existing test file llvm/test/MC/ELF/relocation.s?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There were no checks for both instructions and relocation types emitted by llvm-mc, so I added new test file for this R_X86_64_CODE_4_GOTTPOFF type and other relocation types to be added.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we need to check the instructions? There should be existing encoding/decoding tests there.
IMHO, checking the similar relocation types in a single file can help us not miss some checks?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's not to check encoding/decoding. It showed the map of instruction and relocation information (type, symbol and offset), and that's the output what users got from llvm-mc/llvm. Some tests in llvm/test/MC folder did same thing.
I'm okay with adding the check of relocation information in relocation.s and not adding this test file, if you insist.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've removed the test file newly added and add the check in relocation.s.
For mov name@GOTTPOFF(%rip), %reg add name@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@tpoff, %reg add $name@tpoff, %reg if the first byte of the instruction at the relocation `offset - 4` is `0xd5` (namely, encoded w/REX2 prefix) when possible.
1dd700d
to
2031939
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@MaskRay, any comments? If no objection, @KanRobert /@MaskRay, please help merge this PR. I don't have commit access. Thanks. |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/30/builds/10712 Here is the relevant piece of the build log for the reference
|
For mov name@GOTTPOFF(%rip), %reg add name@GOTTPOFF(%rip), %reg add `R_X86_64_CODE_4_GOTTPOFF` = 44 in llvm#116633. Linker can treat `R_X86_64_CODE_4_GOTTPOFF` as `R_X86_64_GOTTPOFF` or convert the instructions above to mov $name, %reg add $name, %reg if the first byte of the instruction at the relocation `offset - 4` is `0xd5` (namely, encoded w/REX2 prefix) when possible.
For mov name@GOTTPOFF(%rip), %reg add name@GOTTPOFF(%rip), %reg add `R_X86_64_CODE_4_GOTTPOFF` = 44 in #116633. Linker can treat `R_X86_64_CODE_4_GOTTPOFF` as `R_X86_64_GOTTPOFF` or convert the instructions above to mov $name, %reg add $name, %reg if the first byte of the instruction at the relocation `offset - 4` is `0xd5` (namely, encoded w/REX2 prefix) when possible. Binutils patch: bminor/binutils-gdb@a533c8d 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
For
mov name@GOTTPOFF(%rip), %reg
add name@GOTTPOFF(%rip), %reg
add
R_X86_64_CODE_4_GOTTPOFF
= 44if 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
asR_X86_64_GOTTPOFF
or convert the instructions above tomov $name@tpoff, %reg
add $name@tpoff, %reg
if the first byte of the instruction at the relocation
offset - 4
is0xd5
(namely, encoded w/REX2 prefix) when possible.Binutils patch: bminor/binutils-gdb@a533c8d
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