[ELF] - Do not call doInitSymbols for all ELFTs
authorGeorge Rimar <grimar@accesssoftek.com>
Thu, 10 Mar 2016 17:38:49 +0000 (17:38 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Thu, 10 Mar 2016 17:38:49 +0000 (17:38 +0000)
It looks a bit wierd that we have to initialize symbols for all ELFT
types when we use only one ELFT for link. We can only init those
that we need. Patch fixes it.

Differential revision: http://reviews.llvm.org/D18047

llvm-svn: 263133

lld/ELF/Driver.cpp
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h

index e027206aae9a6401078b924cc72880283b366b01..8fff516946a2edb483610d17f046a36f4f142b28 100644 (file)
@@ -168,8 +168,6 @@ static bool hasZOption(opt::InputArgList &Args, StringRef Key) {
 }
 
 void LinkerDriver::main(ArrayRef<const char *> ArgsArr) {
-  initSymbols();
-
   opt::InputArgList Args = parseArgs(&Alloc, ArgsArr.slice(1));
   if (Args.hasArg(OPT_help)) {
     printHelp(ArgsArr[0]);
@@ -317,6 +315,7 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
 }
 
 template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
+  initSymbols<ELFT>();
   // For LTO
   InitializeAllTargets();
   InitializeAllTargetMCs();
index 51ab66786804b365b2bc91eb29f01687dda2c290..f6786c27f585bddd986e77759a5637a6a73a60f6 100644 (file)
@@ -209,7 +209,7 @@ std::unique_ptr<InputFile> Lazy::getMember() {
   return createObjectFile(MBRef, File->getName());
 }
 
-template <class ELFT> static void doInitSymbols() {
+template <class ELFT> void elf::initSymbols() {
   ElfSym<ELFT>::Etext.setBinding(STB_GLOBAL);
   ElfSym<ELFT>::Edata.setBinding(STB_GLOBAL);
   ElfSym<ELFT>::End.setBinding(STB_GLOBAL);
@@ -217,13 +217,6 @@ template <class ELFT> static void doInitSymbols() {
   ElfSym<ELFT>::Ignored.setVisibility(STV_HIDDEN);
 }
 
-void elf::initSymbols() {
-  doInitSymbols<ELF32LE>();
-  doInitSymbols<ELF32BE>();
-  doInitSymbols<ELF64LE>();
-  doInitSymbols<ELF64BE>();
-}
-
 // Returns the demangled C++ symbol name for Name.
 std::string elf::demangle(StringRef Name) {
 #if !defined(HAVE_CXXABI_H)
@@ -289,3 +282,8 @@ template class elf::DefinedSynthetic<ELF32LE>;
 template class elf::DefinedSynthetic<ELF32BE>;
 template class elf::DefinedSynthetic<ELF64LE>;
 template class elf::DefinedSynthetic<ELF64BE>;
+
+template void elf::initSymbols<ELF32LE>();
+template void elf::initSymbols<ELF32BE>();
+template void elf::initSymbols<ELF64LE>();
+template void elf::initSymbols<ELF64BE>();
index b0b0faa8e025c5696de8d7812173a8859446e2a3..5ae0ab913c061d0a3e3522a664cfa6d3b2751f34 100644 (file)
@@ -41,8 +41,7 @@ template <class ELFT> class OutputSectionBase;
 template <class ELFT> class SharedFile;
 
 // Initializes global objects defined in this file.
-// Called at the beginning of main().
-void initSymbols();
+template <class ELFT> void initSymbols();
 
 // Returns a demangled C++ symbol name. If Name is not a mangled
 // name or the system does not provide __cxa_demangle function,