[PATCH] D18047: [ELF] - Do not call doInitSymbols for all ELFTs

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 10 08:46:00 PST 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, grimar.

It looks a bit wierd that we have to initialize symbols for all ELFT types when
we use only one ELFT for link. It is little but extra work. Do we really have reasons for that ?
I reviewed this symbols we are initializing and I think we can only init those
what we need at start of link() call.

http://reviews.llvm.org/D18047

Files:
  ELF/Driver.cpp
  ELF/Symbols.cpp
  ELF/Symbols.h

Index: ELF/Symbols.h
===================================================================
--- ELF/Symbols.h
+++ ELF/Symbols.h
@@ -41,8 +41,7 @@
 template <class ELFT> class SharedFile;
 
 // Initializes global objects defined in this file.
-// Called at the beginning of main().
-void initSymbols();
+template <class ELFT> void doInitSymbols();
 
 // Returns a demangled C++ symbol name. If Name is not a mangled
 // name or the system does not provide __cxa_demangle function,
Index: ELF/Symbols.cpp
===================================================================
--- ELF/Symbols.cpp
+++ ELF/Symbols.cpp
@@ -209,21 +209,14 @@
   return createObjectFile(MBRef, File->getName());
 }
 
-template <class ELFT> static void doInitSymbols() {
+template <class ELFT> void elf::doInitSymbols() {
   ElfSym<ELFT>::Etext.setBinding(STB_GLOBAL);
   ElfSym<ELFT>::Edata.setBinding(STB_GLOBAL);
   ElfSym<ELFT>::End.setBinding(STB_GLOBAL);
   ElfSym<ELFT>::Ignored.setBinding(STB_WEAK);
   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<ELF32BE>;
 template class elf::DefinedSynthetic<ELF64LE>;
 template class elf::DefinedSynthetic<ELF64BE>;
+
+template void elf::doInitSymbols<ELF32LE>();
+template void elf::doInitSymbols<ELF32BE>();
+template void elf::doInitSymbols<ELF64LE>();
+template void elf::doInitSymbols<ELF64BE>();
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -168,8 +168,6 @@
 }
 
 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 @@
 }
 
 template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
+  doInitSymbols<ELFT>();
   // For LTO
   InitializeAllTargets();
   InitializeAllTargetMCs();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18047.50283.patch
Type: text/x-patch
Size: 2210 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160310/aa8dac4f/attachment.bin>


More information about the llvm-commits mailing list