[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