diff lld/COFF/Symbols.cpp @ 173:0572611fdcc8 llvm10 llvm12

reorgnization done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 11:55:54 +0900
parents 1d019706d866
children 5f17cb93ff66
line wrap: on
line diff
--- a/lld/COFF/Symbols.cpp	Mon May 25 11:50:15 2020 +0900
+++ b/lld/COFF/Symbols.cpp	Mon May 25 11:55:54 2020 +0900
@@ -52,23 +52,15 @@
 
 namespace coff {
 
-StringRef Symbol::getName() {
-  // COFF symbol names are read lazily for a performance reason.
-  // Non-external symbol names are never used by the linker except for logging
-  // or debugging. Their internal references are resolved not by name but by
-  // symbol index. And because they are not external, no one can refer them by
-  // name. Object files contain lots of non-external symbols, and creating
-  // StringRefs for them (which involves lots of strlen() on the string table)
-  // is a waste of time.
-  if (nameData == nullptr) {
-    auto *d = cast<DefinedCOFF>(this);
-    StringRef nameStr;
-    cast<ObjFile>(d->file)->getCOFFObj()->getSymbolName(d->sym, nameStr);
-    nameData = nameStr.data();
-    nameSize = nameStr.size();
-    assert(nameSize == nameStr.size() && "name length truncated");
-  }
-  return StringRef(nameData, nameSize);
+void Symbol::computeName() {
+  assert(nameData == nullptr &&
+         "should only compute the name once for DefinedCOFF symbols");
+  auto *d = cast<DefinedCOFF>(this);
+  StringRef nameStr =
+      check(cast<ObjFile>(d->file)->getCOFFObj()->getSymbolName(d->sym));
+  nameData = nameStr.data();
+  nameSize = nameStr.size();
+  assert(nameSize == nameStr.size() && "name length truncated");
 }
 
 InputFile *Symbol::getFile() {