[PATCH] D86641: [lld-macho] Implement GOT_LOAD relaxation
Jez Ng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 27 17:44:53 PDT 2020
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG7083363c05ab: [lld-macho] Implement GOT_LOAD relaxation (authored by int3).
Changed prior to commit:
https://reviews.llvm.org/D86641?vs=288021&id=288491#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D86641/new/
https://reviews.llvm.org/D86641
Files:
lld/MachO/Arch/X86_64.cpp
lld/test/MachO/local-got.s
lld/test/MachO/x86-64-reloc-got-load.s
Index: lld/test/MachO/x86-64-reloc-got-load.s
===================================================================
--- /dev/null
+++ lld/test/MachO/x86-64-reloc-got-load.s
@@ -0,0 +1,18 @@
+# REQUIRES: x86
+
+## Check that we perform relaxation for GOT_LOAD relocations to defined symbols.
+## Note: GOT_LOAD relocations to dylib symbols are already tested in dylink.s.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+# RUN: lld -flavor darwinnew -o %t %t.o
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
+# CHECK: leaq [[#]](%rip), %rax # {{.*}} <_foo>
+
+.globl _main, _foo
+
+_main:
+ movq _foo at GOTPCREL(%rip), %rax
+ ret
+
+_foo:
+ .space 0
Index: lld/test/MachO/local-got.s
===================================================================
--- lld/test/MachO/local-got.s
+++ lld/test/MachO/local-got.s
@@ -37,13 +37,16 @@
movl $0x2000004, %eax # write() syscall
mov $1, %rdi # stdout
- movq _hello_world at GOTPCREL(%rip), %rsi
+## We use pushq/popq here instead of movq in order to avoid relaxation.
+ pushq _hello_world at GOTPCREL(%rip)
+ popq %rsi
mov $13, %rdx # length of str
syscall
movl $0x2000004, %eax # write() syscall
mov $1, %rdi # stdout
- movq _goodbye_world at GOTPCREL(%rip), %rsi
+ pushq _goodbye_world at GOTPCREL(%rip)
+ popq %rsi
mov $15, %rdx # length of str
syscall
Index: lld/MachO/Arch/X86_64.cpp
===================================================================
--- lld/MachO/Arch/X86_64.cpp
+++ lld/MachO/Arch/X86_64.cpp
@@ -220,8 +220,15 @@
void X86_64::prepareSymbolRelocation(lld::macho::Symbol *sym,
const InputSection *isec, const Reloc &r) {
switch (r.type) {
- case X86_64_RELOC_GOT_LOAD:
- // TODO: implement mov -> lea relaxation for non-dynamic symbols
+ case X86_64_RELOC_GOT_LOAD: {
+ if (sym->isWeakDef() || isa<DylibSymbol>(sym))
+ in.got->addEntry(sym);
+
+ if (sym->isTlv())
+ error("found GOT relocation referencing thread-local variable in " +
+ toString(isec));
+ break;
+ }
case X86_64_RELOC_GOT: {
in.got->addEntry(sym);
@@ -288,7 +295,15 @@
uint64_t X86_64::resolveSymbolVA(uint8_t *buf, const lld::macho::Symbol &sym,
uint8_t type) const {
switch (type) {
- case X86_64_RELOC_GOT_LOAD:
+ case X86_64_RELOC_GOT_LOAD: {
+ if (!sym.isInGot()) {
+ if (buf[-2] != 0x8b)
+ error("X86_64_RELOC_GOT_LOAD must be used with movq instructions");
+ buf[-2] = 0x8d;
+ return sym.getVA();
+ }
+ LLVM_FALLTHROUGH;
+ }
case X86_64_RELOC_GOT:
return in.got->addr + sym.gotIndex * WordSize;
case X86_64_RELOC_BRANCH: {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86641.288491.patch
Type: text/x-patch
Size: 2696 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200828/8b451031/attachment.bin>
More information about the llvm-commits
mailing list