[lld] d624134 - [lld][X86] Restore gotEntrySize.
Harald van Dijk via llvm-commits
llvm-commits at lists.llvm.org
Sun May 16 16:13:18 PDT 2021
Author: Harald van Dijk
Date: 2021-05-17T00:13:00+01:00
New Revision: d62413452fc632023c531d4336254f7b3a54a600
URL: https://github.com/llvm/llvm-project/commit/d62413452fc632023c531d4336254f7b3a54a600
DIFF: https://github.com/llvm/llvm-project/commit/d62413452fc632023c531d4336254f7b3a54a600.diff
LOG: [lld][X86] Restore gotEntrySize.
D62727 removed GotEntrySize and GotPltEntrySize with a comment that they
are always equal to wordsize(), but that is not entirely true: X32 has a
word size of 4, but needs 8-byte GOT entries. This restores gotEntrySize
for both, adjusted for current naming conventions, but defaults it to
config->wordsize to keep things simple for architectures other than
x86_64.
This partially reverts D62727.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D102509
Added:
lld/test/ELF/x86-x32-plt.s
Modified:
lld/ELF/Arch/X86_64.cpp
lld/ELF/Symbols.cpp
lld/ELF/SyntheticSections.cpp
lld/ELF/Target.h
Removed:
################################################################################
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp
index 18857f66e6719..b3fe26f5c9f3a 100644
--- a/lld/ELF/Arch/X86_64.cpp
+++ b/lld/ELF/Arch/X86_64.cpp
@@ -85,6 +85,7 @@ X86_64::X86_64() {
tlsGotRel = R_X86_64_TPOFF64;
tlsModuleIndexRel = R_X86_64_DTPMOD64;
tlsOffsetRel = R_X86_64_DTPOFF64;
+ gotEntrySize = 8;
pltHeaderSize = 16;
pltEntrySize = 16;
ipltEntrySize = 16;
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 3ce6a98991436..39ff36af86663 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -160,7 +160,9 @@ uint64_t Symbol::getGotVA() const {
return in.got->getVA() + getGotOffset();
}
-uint64_t Symbol::getGotOffset() const { return gotIndex * config->wordsize; }
+uint64_t Symbol::getGotOffset() const {
+ return gotIndex * target->gotEntrySize;
+}
uint64_t Symbol::getGotPltVA() const {
if (isInIplt)
@@ -170,8 +172,8 @@ uint64_t Symbol::getGotPltVA() const {
uint64_t Symbol::getGotPltOffset() const {
if (isInIplt)
- return pltIndex * config->wordsize;
- return (pltIndex + target->gotPltHeaderEntriesNum) * config->wordsize;
+ return pltIndex * target->gotEntrySize;
+ return (pltIndex + target->gotPltHeaderEntriesNum) * target->gotEntrySize;
}
uint64_t Symbol::getPltVA() const {
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 9c80edf5c93e7..c76b449491a3d 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -644,8 +644,8 @@ void EhFrameSection::writeTo(uint8_t *buf) {
}
GotSection::GotSection()
- : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, config->wordsize,
- ".got") {
+ : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS,
+ target->gotEntrySize, ".got") {
numEntries = target->gotHeaderEntriesNum;
}
@@ -1145,15 +1145,16 @@ void GotPltSection::addEntry(Symbol &sym) {
}
size_t GotPltSection::getSize() const {
- return (target->gotPltHeaderEntriesNum + entries.size()) * config->wordsize;
+ return (target->gotPltHeaderEntriesNum + entries.size()) *
+ target->gotEntrySize;
}
void GotPltSection::writeTo(uint8_t *buf) {
target->writeGotPltHeader(buf);
- buf += target->gotPltHeaderEntriesNum * config->wordsize;
+ buf += target->gotPltHeaderEntriesNum * target->gotEntrySize;
for (const Symbol *b : entries) {
target->writeGotPlt(buf, *b);
- buf += config->wordsize;
+ buf += target->gotEntrySize;
}
}
@@ -1181,7 +1182,7 @@ static StringRef getIgotPltName() {
IgotPltSection::IgotPltSection()
: SyntheticSection(SHF_ALLOC | SHF_WRITE,
config->emachine == EM_PPC64 ? SHT_NOBITS : SHT_PROGBITS,
- config->wordsize, getIgotPltName()) {}
+ target->gotEntrySize, getIgotPltName()) {}
void IgotPltSection::addEntry(Symbol &sym) {
assert(sym.pltIndex == entries.size());
@@ -1189,13 +1190,13 @@ void IgotPltSection::addEntry(Symbol &sym) {
}
size_t IgotPltSection::getSize() const {
- return entries.size() * config->wordsize;
+ return entries.size() * target->gotEntrySize;
}
void IgotPltSection::writeTo(uint8_t *buf) {
for (const Symbol *b : entries) {
target->writeIgotPlt(buf, *b);
- buf += config->wordsize;
+ buf += target->gotEntrySize;
}
}
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 68b6c5d2ca351..1fe3217c6d1dc 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -122,6 +122,7 @@ class TargetInfo {
RelType tlsGotRel;
RelType tlsModuleIndexRel;
RelType tlsOffsetRel;
+ unsigned gotEntrySize = config->wordsize;
unsigned pltEntrySize;
unsigned pltHeaderSize;
unsigned ipltEntrySize;
diff --git a/lld/test/ELF/x86-x32-plt.s b/lld/test/ELF/x86-x32-plt.s
new file mode 100644
index 0000000000000..145c15dfe164e
--- /dev/null
+++ b/lld/test/ELF/x86-x32-plt.s
@@ -0,0 +1,52 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-gnux32 %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-gnux32 %p/Inputs/shared.s -o %t2.o
+# RUN: ld.lld -shared -soname=t2 %t2.o -o %t2.so
+
+# RUN: ld.lld %t.o %t2.so -o %t
+# RUN: llvm-readelf -S -r %t | FileCheck %s
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=DISASM
+
+# CHECK: Name Type Address Off Size ES Flg Lk Inf Al
+# CHECK: .plt PROGBITS 002011e0 0001e0 000030 00 AX 0 0 16
+# CHECK: .got.plt PROGBITS 00203278 000278 000028 00 WA 0 0 8
+# CHECK: Relocation section '.rela.plt' at offset {{.*}} contains 2 entries:
+# CHECK: 00203290 {{.*}} R_X86_64_JUMP_SLOT 00000000 bar + 0
+# CHECK-NEXT: 00203298 {{.*}} R_X86_64_JUMP_SLOT 00000000 weak + 0
+
+# DISASM: <_start>:
+# DISASM-NEXT: callq {{.*}} <local>
+# DISASM-NEXT: callq {{.*}} <bar at plt>
+# DISASM-NEXT: jmp {{.*}} <bar at plt>
+# DISASM-NEXT: jmp {{.*}} <weak at plt>
+
+# DISASM: Disassembly of section .plt:
+# DISASM-EMPTY:
+# DISASM-NEXT: <.plt>:
+# DISASM-NEXT: 2011e0: pushq 8346(%rip) # 203280
+# DISASM-NEXT: jmpq *8348(%rip) # 203288
+# DISASM-NEXT: nopl (%rax)
+# DISASM-EMPTY:
+# DISASM-NEXT: <bar at plt>:
+# DISASM-NEXT: 2011f0: jmpq *8346(%rip) # 203290
+# DISASM-NEXT: pushq $0
+# DISASM-NEXT: jmp 0x2011e0 <.plt>
+# DISASM-EMPTY:
+# DISASM-NEXT: <weak at plt>:
+# DISASM-NEXT: 201200: jmpq *8338(%rip) # 203298
+# DISASM-NEXT: pushq $1
+# DISASM-NEXT: jmp 0x2011e0 <.plt>
+# DISASM-NOT: {{.}}
+
+.global _start
+.weak weak
+
+_start:
+ call local
+ call bar
+ jmp bar at plt
+ jmp weak
+
+## foo is local and non-preemptale, no PLT is generated.
+local:
+ ret
More information about the llvm-commits
mailing list