summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-04-11 19:14:59 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-04-11 19:14:59 +0000
commit03ef404e97897761742b6e9681588a267f4e40e1 (patch)
treefa0dd94c5462daaf93f42288436e10a0621d7120
parent7469644259dab9fa820db2da6a15a6fed0530806 (diff)
downloadbcm5719-llvm-03ef404e97897761742b6e9681588a267f4e40e1.tar.gz
bcm5719-llvm-03ef404e97897761742b6e9681588a267f4e40e1.zip
Simplify the creation of __rel[a]_iplt_{start,end}.
They can be regular DefinedSynthetic. llvm-svn: 265981
-rw-r--r--lld/ELF/Symbols.h8
-rw-r--r--lld/ELF/Writer.cpp18
-rw-r--r--lld/test/ELF/aarch64-gnu-ifunc.s4
-rw-r--r--lld/test/ELF/gnu-ifunc-i386.s4
-rw-r--r--lld/test/ELF/gnu-ifunc.s4
5 files changed, 16 insertions, 22 deletions
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index c3d5635a3bd..6e22131c462 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -407,8 +407,8 @@ template <class ELFT> struct ElfSym {
// __rel_iplt_start/__rel_iplt_end for signaling
// where R_[*]_IRELATIVE relocations do live.
- static DefinedRegular<ELFT> *RelaIpltStart;
- static DefinedRegular<ELFT> *RelaIpltEnd;
+ static SymbolBody *RelaIpltStart;
+ static SymbolBody *RelaIpltEnd;
};
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Etext;
@@ -418,8 +418,8 @@ template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::Edata2;
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End;
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::End2;
template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::MipsGp;
-template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::RelaIpltStart;
-template <class ELFT> DefinedRegular<ELFT> *ElfSym<ELFT>::RelaIpltEnd;
+template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltStart;
+template <class ELFT> SymbolBody *ElfSym<ELFT>::RelaIpltEnd;
} // namespace elf
} // namespace lld
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 5f57433a39f..b46b0786d3e 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -806,10 +806,14 @@ void Writer<ELFT>::addRelIpltSymbols() {
if (isOutputDynamic() || !Out<ELFT>::RelaPlt)
return;
StringRef S = Config->Rela ? "__rela_iplt_start" : "__rel_iplt_start";
- ElfSym<ELFT>::RelaIpltStart = Symtab.addIgnored(S);
+ if (Symtab.find(S))
+ ElfSym<ELFT>::RelaIpltStart =
+ Symtab.addSynthetic(S, *Out<ELFT>::RelaPlt, 0, STV_HIDDEN);
S = Config->Rela ? "__rela_iplt_end" : "__rel_iplt_end";
- ElfSym<ELFT>::RelaIpltEnd = Symtab.addIgnored(S);
+ if (Symtab.find(S))
+ ElfSym<ELFT>::RelaIpltEnd = Symtab.addSynthetic(
+ S, *Out<ELFT>::RelaPlt, DefinedSynthetic<ELFT>::SectionEnd, STV_HIDDEN);
}
template <class ELFT> static bool includeInSymtab(const SymbolBody &B) {
@@ -1505,16 +1509,6 @@ static uint16_t getELFType() {
// to each section. This function fixes some predefined absolute
// symbol values that depend on section address and size.
template <class ELFT> void Writer<ELFT>::fixAbsoluteSymbols() {
- // Update __rel[a]_iplt_{start,end} symbols so that they point
- // to beginning or ending of .rela.plt section, respectively.
- if (Out<ELFT>::RelaPlt) {
- uintX_t Start = Out<ELFT>::RelaPlt->getVA();
- if (ElfSym<ELFT>::RelaIpltStart)
- ElfSym<ELFT>::RelaIpltStart->Value = Start;
- if (ElfSym<ELFT>::RelaIpltEnd)
- ElfSym<ELFT>::RelaIpltEnd->Value = Start + Out<ELFT>::RelaPlt->getSize();
- }
-
// Update MIPS _gp absolute symbol so that it points to the static data.
if (Config->EMachine == EM_MIPS)
ElfSym<ELFT>::MipsGp->Value = getMipsGpAddr<ELFT>();
diff --git a/lld/test/ELF/aarch64-gnu-ifunc.s b/lld/test/ELF/aarch64-gnu-ifunc.s
index 32e9636ce67..159e2310d68 100644
--- a/lld/test/ELF/aarch64-gnu-ifunc.s
+++ b/lld/test/ELF/aarch64-gnu-ifunc.s
@@ -54,7 +54,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rela.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __rela_iplt_start
@@ -65,7 +65,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rela.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
diff --git a/lld/test/ELF/gnu-ifunc-i386.s b/lld/test/ELF/gnu-ifunc-i386.s
index 925ed22ec63..58363b13a60 100644
--- a/lld/test/ELF/gnu-ifunc-i386.s
+++ b/lld/test/ELF/gnu-ifunc-i386.s
@@ -46,7 +46,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rel.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __rel_iplt_start
@@ -57,7 +57,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rel.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
diff --git a/lld/test/ELF/gnu-ifunc.s b/lld/test/ELF/gnu-ifunc.s
index 38e37279787..d2ba627d06f 100644
--- a/lld/test/ELF/gnu-ifunc.s
+++ b/lld/test/ELF/gnu-ifunc.s
@@ -45,7 +45,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rela.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __rela_iplt_start
@@ -56,7 +56,7 @@
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
-// CHECK-NEXT: Section: Absolute
+// CHECK-NEXT: Section: .rela.plt
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
OpenPOWER on IntegriCloud