[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) {