[lld] 818b508 - [ELF] Simplify the condition adding .got header
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 30 17:19:50 PDT 2021
Author: Fangrui Song
Date: 2021-04-30T17:19:45-07:00
New Revision: 818b508953c7684a6c104b89c6f6ce84e961d82e
URL: https://github.com/llvm/llvm-project/commit/818b508953c7684a6c104b89c6f6ce84e961d82e
DIFF: https://github.com/llvm/llvm-project/commit/818b508953c7684a6c104b89c6f6ce84e961d82e.diff
LOG: [ELF] Simplify the condition adding .got header
Adopt my suggestion in https://reviews.llvm.org/D91426#2653926 ,
generalizing the ppc64 specific code.
GNU ld and glibc ld.so has a contract about the first few entries of .got .
There are somewhat complex conditions when the header is needed. This patch
switches to a simpler approach: add a header unconditionally if
_GLOBAL_OFFSET_TABLE_ is used or the number of entries is more than just the
header.
Added:
Modified:
lld/ELF/SyntheticSections.cpp
lld/test/ELF/ppc32-tls-gd.s
lld/test/ELF/ppc32-tls-ie.s
lld/test/ELF/ppc32-tls-ld.s
lld/test/ELF/riscv-tls-gd.s
lld/test/ELF/riscv-tls-ie.s
Removed:
################################################################################
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 76f6d37b00d82..9c80edf5c93e7 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -646,13 +646,7 @@ void EhFrameSection::writeTo(uint8_t *buf) {
GotSection::GotSection()
: SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, config->wordsize,
".got") {
- // If ElfSym::globalOffsetTable is relative to .got and is referenced,
- // increase numEntries by the number of entries used to emit
- // ElfSym::globalOffsetTable.
- // On PP64 we always add the header at the start.
- if ((ElfSym::globalOffsetTable && !target->gotBaseSymInGotPlt) ||
- config->emachine == EM_PPC64)
- numEntries += target->gotHeaderEntriesNum;
+ numEntries = target->gotHeaderEntriesNum;
}
void GotSection::addEntry(Symbol &sym) {
@@ -696,16 +690,9 @@ void GotSection::finalizeContents() {
}
bool GotSection::isNeeded() const {
- // We need to emit a GOT even if it's empty if there's a relocation that is
- // relative to GOT(such as GOTOFFREL).
-
- // On PPC64 we need to check that the number of entries is more than just the
- // size of the header since the header is always added. A GOT with just the
- // header may not actually be needed.
- if (config->emachine == EM_PPC64)
- return numEntries > target->gotHeaderEntriesNum || hasGotOffRel;
-
- return numEntries || hasGotOffRel;
+ // Needed if the GOT symbol is used or the number of entries is more than just
+ // the header. A GOT with just the header may not be needed.
+ return hasGotOffRel || numEntries > target->gotHeaderEntriesNum;
}
void GotSection::writeTo(uint8_t *buf) {
diff --git a/lld/test/ELF/ppc32-tls-gd.s b/lld/test/ELF/ppc32-tls-gd.s
index c3a1ffd367049..dfff837464394 100644
--- a/lld/test/ELF/ppc32-tls-gd.s
+++ b/lld/test/ELF/ppc32-tls-gd.s
@@ -21,26 +21,26 @@
# GD-DYN: PPC_GOT 0x20358
# GD-REL: .rela.dyn {
-# GD-REL-NEXT: 0x20358 R_PPC_DTPMOD32 a 0x0
-# GD-REL-NEXT: 0x2035C R_PPC_DTPREL32 a 0x0
-# GD-REL-NEXT: 0x20360 R_PPC_DTPMOD32 b 0x0
-# GD-REL-NEXT: 0x20364 R_PPC_DTPREL32 b 0x0
-# GD-REL-NEXT: 0x20368 R_PPC_DTPMOD32 c 0x0
-# GD-REL-NEXT: 0x2036C R_PPC_DTPREL32 c 0x0
+# GD-REL-NEXT: 0x20364 R_PPC_DTPMOD32 a 0x0
+# GD-REL-NEXT: 0x20368 R_PPC_DTPREL32 a 0x0
+# GD-REL-NEXT: 0x2036C R_PPC_DTPMOD32 b 0x0
+# GD-REL-NEXT: 0x20370 R_PPC_DTPREL32 b 0x0
+# GD-REL-NEXT: 0x20374 R_PPC_DTPMOD32 c 0x0
+# GD-REL-NEXT: 0x20378 R_PPC_DTPREL32 c 0x0
# GD-REL-NEXT: }
-## &DTPMOD(a) - _GLOBAL_OFFSET_TABLE_ = 0x20078 - 0x20078 = 0
-# GD: addi 3, 31, 0
+## &DTPMOD(a) - _GLOBAL_OFFSET_TABLE_ = 12
+# GD: addi 3, 31, 12
# GD-NEXT: bl 0x1028c
# GD-NEXT: lwz 3, 0(3)
-## &DTPMOD(b) - _GLOBAL_OFFSET_TABLE_ = 0x20080 - 0x20078 = 8
-# GD-NEXT: addi 3, 31, 8
+## &DTPMOD(b) - _GLOBAL_OFFSET_TABLE_ = 20
+# GD-NEXT: addi 3, 31, 20
# GD-NEXT: bl 0x1028c
# GD-NEXT: lwz 3, 0(3)
-## &DTPMOD(c) - _GLOBAL_OFFSET_TABLE_ = 0x20088 - 0x20078 = 16
-# GD-NEXT: addi 3, 9, 16
+## &DTPMOD(c) - _GLOBAL_OFFSET_TABLE_ = 28
+# GD-NEXT: addi 3, 9, 28
# GD-NEXT: bl 0x1028c
# GD-NEXT: lwz 3, 0(3)
@@ -60,8 +60,8 @@
# LE-NEXT: lwz 3, 0(3)
# IE-REL: .rela.dyn {
-# IE-REL-NEXT: 0x10020274 R_PPC_TPREL32 b 0x0
-# IE-REL-NEXT: 0x10020278 R_PPC_TPREL32 c 0x0
+# IE-REL-NEXT: 0x10020280 R_PPC_TPREL32 b 0x0
+# IE-REL-NEXT: 0x10020284 R_PPC_TPREL32 c 0x0
# IE-REL-NEXT: }
## a is relaxed to use LE.
@@ -69,12 +69,12 @@
# IE: addis 3, 2, 0
# IE-NEXT: addi 3, 3, -28664
# IE-NEXT: lwz 3, 0(3)
-## &.got[0] - _GLOBAL_OFFSET_TABLE_ = 0
-# IE-NEXT: lwz 3, 0(31)
+## &.got[3] - _GLOBAL_OFFSET_TABLE_ = 12
+# IE-NEXT: lwz 3, 12(31)
# IE-NEXT: add 3, 3, 2
# IE-NEXT: lwz 3, 0(3)
-## &.got[1] - _GLOBAL_OFFSET_TABLE_ = 4
-# IE-NEXT: lwz 3, 4(9)
+## &.got[4] - _GLOBAL_OFFSET_TABLE_ = 16
+# IE-NEXT: lwz 3, 16(9)
# IE-NEXT: add 3, 3, 2
# IE-NEXT: lwz 3, 0(3)
diff --git a/lld/test/ELF/ppc32-tls-ie.s b/lld/test/ELF/ppc32-tls-ie.s
index 9bc8ffc6e39da..91571294fc517 100644
--- a/lld/test/ELF/ppc32-tls-ie.s
+++ b/lld/test/ELF/ppc32-tls-ie.s
@@ -11,15 +11,15 @@
## A non-preemptable symbol (b) has 0 st_shndx.
# IE-REL: .rela.dyn {
-# IE-REL-NEXT: 0x20224 R_PPC_TPREL32 - 0xC
-# IE-REL-NEXT: 0x20220 R_PPC_TPREL32 a 0x0
+# IE-REL-NEXT: 0x20230 R_PPC_TPREL32 - 0xC
+# IE-REL-NEXT: 0x2022C R_PPC_TPREL32 a 0x0
# IE-REL-NEXT: }
-## &.got[0] - _GLOBAL_OFFSET_TABLE_ = 0
-# IE: lwz 10, 0(9)
+## &.got[3] - _GLOBAL_OFFSET_TABLE_ = 12
+# IE: lwz 10, 12(9)
# IE-NEXT: add 10, 10, 2
-## &.got[1] - _GLOBAL_OFFSET_TABLE_ = 4
-# IE-NEXT: lwz 8, 4(7)
+## &.got[4] - _GLOBAL_OFFSET_TABLE_ = 16
+# IE-NEXT: lwz 8, 16(7)
# IE-NEXT: lbzx 10, 8, 2
# NOREL: no relocations
diff --git a/lld/test/ELF/ppc32-tls-ld.s b/lld/test/ELF/ppc32-tls-ld.s
index 0eda8e95ff208..d70a52affc002 100644
--- a/lld/test/ELF/ppc32-tls-ld.s
+++ b/lld/test/ELF/ppc32-tls-ld.s
@@ -11,11 +11,11 @@
# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=LE %s
# LD-REL: .rela.dyn {
-# LD-REL-NEXT: 0x202C4 R_PPC_DTPMOD32 - 0x0
+# LD-REL-NEXT: 0x202D0 R_PPC_DTPMOD32 - 0x0
# LD-REL-NEXT: }
-## .got - _GLOBAL_OFFSET_TABLE_ = 0
-# LD: addi 3, 30, 0
+## &.got[3] - _GLOBAL_OFFSET_TABLE_ = 12
+# LD: addi 3, 30, 12
# LD-NEXT: bl 0x101f8
## a at dtprel = st_value(a)-0x8000 = 65540-0x8000 = 65536*1-32764
## b at dtprel = st_value(a)-0x8000 = 131080-0x8000 = 65536*2-32760
@@ -28,8 +28,8 @@
## Check that b at got@tlsld does not allocate another GOT entry.
## It shares In.Got->TlsIndexOff allocated when processing a at got@tlsld.
-## .got - _GLOBAL_OFFSET_TABLE_ = 0
-# LD-NEXT: addi 3, 9, 0
+## &.got[3] - _GLOBAL_OFFSET_TABLE_ = 12
+# LD-NEXT: addi 3, 9, 12
# LD-NEXT: bl 0x101f8
## b at dtprel = st_value(a)-0x8000 = 131080-0x8000 = 65536*2-32760
# LD-NEXT: addis 29, 3, 2
diff --git a/lld/test/ELF/riscv-tls-gd.s b/lld/test/ELF/riscv-tls-gd.s
index 078199438ef96..21a9d4261a16d 100644
--- a/lld/test/ELF/riscv-tls-gd.s
+++ b/lld/test/ELF/riscv-tls-gd.s
@@ -46,40 +46,40 @@
# RUN: llvm-readelf -x .got %t.64 | FileCheck --check-prefix=IE64-GOT %s
# GD32-REL: .rela.dyn {
-# GD32-REL-NEXT: 0x2310 R_RISCV_TLS_DTPMOD32 a 0x0
-# GD32-REL-NEXT: 0x2314 R_RISCV_TLS_DTPREL32 a 0x0
-# GD32-REL-NEXT: 0x2318 R_RISCV_TLS_DTPMOD32 b 0x0
-# GD32-REL-NEXT: 0x231C R_RISCV_TLS_DTPREL32 b 0x0
+# GD32-REL-NEXT: 0x2314 R_RISCV_TLS_DTPMOD32 a 0x0
+# GD32-REL-NEXT: 0x2318 R_RISCV_TLS_DTPREL32 a 0x0
+# GD32-REL-NEXT: 0x231C R_RISCV_TLS_DTPMOD32 b 0x0
+# GD32-REL-NEXT: 0x2320 R_RISCV_TLS_DTPREL32 b 0x0
# GD32-REL-NEXT: }
-## &DTPMOD(a) - . = 0x2310 - 0x1250 = 4096*1+192
+## &DTPMOD(a) - . = 0x2314 - 0x1250 = 4096*1+196
# GD32: 1250: auipc a0, 1
-# GD32-NEXT: addi a0, a0, 192
+# GD32-NEXT: addi a0, a0, 196
# GD32-NEXT: auipc ra, 0
# GD32-NEXT: jalr 56(ra)
-## &DTPMOD(b) - . = 0x2318 - 0x1260 = 4096*1+184
+## &DTPMOD(b) - . = 0x231C - 0x1260 = 4096*1+188
# GD32: 1260: auipc a0, 1
-# GD32-NEXT: addi a0, a0, 184
+# GD32-NEXT: addi a0, a0, 188
# GD32-NEXT: auipc ra, 0
# GD32-NEXT: jalr 40(ra)
# GD64-REL: .rela.dyn {
-# GD64-REL-NEXT: 0x24D0 R_RISCV_TLS_DTPMOD64 a 0x0
-# GD64-REL-NEXT: 0x24D8 R_RISCV_TLS_DTPREL64 a 0x0
-# GD64-REL-NEXT: 0x24E0 R_RISCV_TLS_DTPMOD64 b 0x0
-# GD64-REL-NEXT: 0x24E8 R_RISCV_TLS_DTPREL64 b 0x0
+# GD64-REL-NEXT: 0x24D8 R_RISCV_TLS_DTPMOD64 a 0x0
+# GD64-REL-NEXT: 0x24E0 R_RISCV_TLS_DTPREL64 a 0x0
+# GD64-REL-NEXT: 0x24E8 R_RISCV_TLS_DTPMOD64 b 0x0
+# GD64-REL-NEXT: 0x24F0 R_RISCV_TLS_DTPREL64 b 0x0
# GD64-REL-NEXT: }
-## &DTPMOD(a) - . = 0x24d0 - 0x1398 = 4096*1+312
+## &DTPMOD(a) - . = 0x24d8 - 0x1398 = 4096*1+320
# GD64: 1398: auipc a0, 1
-# GD64-NEXT: addi a0, a0, 312
+# GD64-NEXT: addi a0, a0, 320
# GD64-NEXT: auipc ra, 0
# GD64-NEXT: jalr 64(ra)
-## &DTPMOD(b) - . = 0x24e0 - 0x13a8 = 4096*1+312
+## &DTPMOD(b) - . = 0x24e8 - 0x13a8 = 4096*1+320
# GD64: 13a8: auipc a0, 1
-# GD64-NEXT: addi a0, a0, 312
+# GD64-NEXT: addi a0, a0, 320
# GD64-NEXT: auipc ra, 0
# GD64-NEXT: jalr 48(ra)
@@ -89,27 +89,31 @@
## a at dtprel = st_value(a)-0x800 = 0xfffff808
## b at dtprel = st_value(b)-0x800 = 0xfffff80c
# LE32-GOT: section '.got':
-# LE32-GOT-NEXT: 0x{{[0-9a-f]+}} 01000000 08f8ffff 01000000 0cf8ffff
+# LE32-GOT-NEXT: 0x[[#%x,A:]] [[#%x,GOT:]] 01000000 08f8ffff 01000000
+# LE32-GOT-NEXT: 0x[[#%x,A:]] 0cf8ffff
# LE64-GOT: section '.got':
-# LE64-GOT-NEXT: 0x{{[0-9a-f]+}} 01000000 00000000 08f8ffff ffffffff
-# LE64-GOT-NEXT: 0x{{[0-9a-f]+}} 01000000 00000000 0cf8ffff ffffffff
+# LE64-GOT-NEXT: 0x[[#%x,A:]] [[#%x,GOT:]] [[#%x,GOT:]] 01000000 00000000
+# LE64-GOT-NEXT: 0x[[#%x,A:]] 08f8ffff ffffffff 01000000 00000000
+# LE64-GOT-NEXT: 0x[[#%x,A:]] 0cf8ffff ffffffff
## a is local - relaxed to LE - its DTPMOD/DTPREL slots are link-time constants.
## b is external - DTPMOD/DTPREL dynamic relocations are required.
# IE32-REL: .rela.dyn {
-# IE32-REL-NEXT: 0x12230 R_RISCV_TLS_DTPMOD32 b 0x0
-# IE32-REL-NEXT: 0x12234 R_RISCV_TLS_DTPREL32 b 0x0
+# IE32-REL-NEXT: 0x12234 R_RISCV_TLS_DTPMOD32 b 0x0
+# IE32-REL-NEXT: 0x12238 R_RISCV_TLS_DTPREL32 b 0x0
# IE32-REL-NEXT: }
# IE32-GOT: section '.got':
-# IE32-GOT-NEXT: 0x00012228 01000000 08f8ffff 00000000 00000000
+# IE32-GOT-NEXT: 0x00012228 c8210100 01000000 08f8ffff 00000000
+# IE32-GOT-NEXT: 0x00012238 00000000
# IE64-REL: .rela.dyn {
-# IE64-REL-NEXT: 0x12390 R_RISCV_TLS_DTPMOD64 b 0x0
-# IE64-REL-NEXT: 0x12398 R_RISCV_TLS_DTPREL64 b 0x0
+# IE64-REL-NEXT: 0x12398 R_RISCV_TLS_DTPMOD64 b 0x0
+# IE64-REL-NEXT: 0x123A0 R_RISCV_TLS_DTPREL64 b 0x0
# IE64-REL-NEXT: }
# IE64-GOT: section '.got':
-# IE64-GOT-NEXT: 0x00012380 01000000 00000000 08f8ffff ffffffff
-# IE64-GOT-NEXT: 0x00012390 00000000 00000000 00000000 00000000
+# IE64-GOT-NEXT: 0x00012380 c0220100 00000000 01000000 00000000
+# IE64-GOT-NEXT: 0x00012390 08f8ffff ffffffff 00000000 00000000
+# IE64-GOT-NEXT: 0x000123a0 00000000 00000000
la.tls.gd a0,a
call __tls_get_addr at plt
diff --git a/lld/test/ELF/riscv-tls-ie.s b/lld/test/ELF/riscv-tls-ie.s
index 424edb9f690ad..6d58c992529d1 100644
--- a/lld/test/ELF/riscv-tls-ie.s
+++ b/lld/test/ELF/riscv-tls-ie.s
@@ -24,27 +24,27 @@
# IE32-REL: FLAGS STATIC_TLS
# IE32-REL: .rela.dyn {
-# IE32-REL-NEXT: 0x2218 R_RISCV_TLS_TPREL32 - 0xC
-# IE32-REL-NEXT: 0x2214 R_RISCV_TLS_TPREL32 a 0x0
+# IE32-REL-NEXT: 0x221C R_RISCV_TLS_TPREL32 - 0xC
+# IE32-REL-NEXT: 0x2218 R_RISCV_TLS_TPREL32 a 0x0
# IE32-REL-NEXT: }
# IE64-REL: FLAGS STATIC_TLS
# IE64-REL: .rela.dyn {
-# IE64-REL-NEXT: 0x2370 R_RISCV_TLS_TPREL64 - 0xC
-# IE64-REL-NEXT: 0x2368 R_RISCV_TLS_TPREL64 a 0x0
+# IE64-REL-NEXT: 0x2378 R_RISCV_TLS_TPREL64 - 0xC
+# IE64-REL-NEXT: 0x2370 R_RISCV_TLS_TPREL64 a 0x0
# IE64-REL-NEXT: }
-## rv32: &.got[0] - . = 0x2214 - . = 4096*1+112
-## rv64: &.got[0] - . = 0x2368 - . = 4096*1+200
+## rv32: &.got[0] - . = 0x2218 - . = 4096*1+116
+## rv64: &.got[0] - . = 0x2378 - . = 4096*1+208
# IE: auipc a4, 1
-# IE32-NEXT: lw a4, 112(a4)
-# IE64-NEXT: ld a4, 200(a4)
+# IE32-NEXT: lw a4, 116(a4)
+# IE64-NEXT: ld a4, 208(a4)
# IE-NEXT: add a4, a4, tp
-## rv32: &.got[1] - . = 0x2218 - . = 4096*1+104
-## rv64: &.got[1] - . = 0x2370 - . = 4096*1+196
+## rv32: &.got[1] - . = 0x221c - . = 4096*1+108
+## rv64: &.got[1] - . = 0x2378 - . = 4096*1+204
# IE: auipc a5, 1
-# IE32-NEXT: lw a5, 104(a5)
-# IE64-NEXT: ld a5, 196(a5)
+# IE32-NEXT: lw a5, 108(a5)
+# IE64-NEXT: ld a5, 204(a5)
# IE-NEXT: add a5, a5, tp
# NOREL: no relocations
@@ -52,23 +52,24 @@
# a at tprel = st_value(a) = 0x8
# b at tprel = st_value(a) = 0xc
# LE32-GOT: section '.got':
-# LE32-GOT-NEXT: 0x0001212c 08000000 0c000000
+# LE32-GOT-NEXT: 0x0001212c 00000000 08000000 0c000000
# LE64-GOT: section '.got':
-# LE64-GOT-NEXT: 0x000121e0 08000000 00000000 0c000000 00000000
+# LE64-GOT-NEXT: 0x000121e0 00000000 00000000 08000000 00000000
+# LE64-GOT-NEXT: 0x000121f0 0c000000 00000000
-## rv32: &.got[0] - . = 0x1212c - 0x11114 = 4096*1+24
-## rv64: &.got[0] - . = 0x121e0 - 0x111c8 = 4096*1+24
+## rv32: &.got[0] - . = 0x12130 - 0x11114 = 4096*1+28
+## rv64: &.got[0] - . = 0x121e8 - 0x111c8 = 4096*1+32
# LE32: 11114: auipc a4, 1
-# LE32-NEXT: lw a4, 24(a4)
+# LE32-NEXT: lw a4, 28(a4)
# LE64: 111c8: auipc a4, 1
-# LE64-NEXT: ld a4, 24(a4)
+# LE64-NEXT: ld a4, 32(a4)
# LE-NEXT: add a4, a4, tp
-## rv32: &.got[1] - . = 0x12130 - 0x11120 = 4096*1+16
-## rv64: &.got[1] - . = 0x121e8 - 0x111d4 = 4096*1+20
+## rv32: &.got[1] - . = 0x12134 - 0x11120 = 4096*1+20
+## rv64: &.got[1] - . = 0x121f0 - 0x111d4 = 4096*1+28
# LE32: 11120: auipc a5, 1
-# LE32-NEXT: lw a5, 16(a5)
+# LE32-NEXT: lw a5, 20(a5)
# LE64: 111d4: auipc a5, 1
-# LE64-NEXT: ld a5, 20(a5)
+# LE64-NEXT: ld a5, 28(a5)
# LE-NEXT: add a5, a5, tp
la.tls.ie a4,a
More information about the llvm-commits
mailing list