diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-04-11 19:14:59 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-04-11 19:14:59 +0000 |
commit | 03ef404e97897761742b6e9681588a267f4e40e1 (patch) | |
tree | fa0dd94c5462daaf93f42288436e10a0621d7120 | |
parent | 7469644259dab9fa820db2da6a15a6fed0530806 (diff) | |
download | bcm5719-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.h | 8 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 18 | ||||
-rw-r--r-- | lld/test/ELF/aarch64-gnu-ifunc.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/gnu-ifunc-i386.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/gnu-ifunc.s | 4 |
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 |