[ELF2] Devirtualize SymbolBody.
llvm-svn: 243496
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 9b3bc30..35bc499 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -9,12 +9,30 @@
#include "Symbols.h"
#include "Chunks.h"
+#include "InputFiles.h"
using namespace llvm::object;
using namespace lld;
using namespace lld::elf2;
+template <class ELFT>
+StringRef
+getSymbolName(const llvm::object::ELFFile<ELFT> *F,
+ const typename llvm::object::ELFFile<ELFT>::Elf_Sym *S) {
+ ErrorOr<StringRef> StrTab = F->getStringTableForSymtab(*F->getDotSymtabSec());
+ if (!StrTab || S->st_name >= StrTab->size())
+ llvm::report_fatal_error("Invalid string table.");
+ return StrTab->data() + S->st_name;
+}
+
+template <class ELFT>
+DefinedRegular<ELFT>::DefinedRegular(ObjectFile<ELFT> *F, const Elf_Sym *S)
+ : Defined(DefinedRegularKind, getSymbolName<ELFT>(F->getObj(), S)), File(F),
+ Sym(S) {
+ IsExternal = S->isExternal();
+}
+
// Returns 1, 0 or -1 if this symbol should take precedence
// over the Other, tie or lose, respectively.
int SymbolBody::compare(SymbolBody *Other) {