diff options
Diffstat (limited to 'lld/COFF/Symbols.cpp')
-rw-r--r-- | lld/COFF/Symbols.cpp | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 938c9c527ffa..60ff72aeb522 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -36,12 +36,12 @@ static std::string maybeDemangleSymbol(StringRef symName) { StringRef demangleInput = prefixless; if (config->machine == I386) demangleInput.consume_front("_"); - std::string demangled = demangle(demangleInput); + std::string demangled = demangle(std::string(demangleInput)); if (demangled != demangleInput) - return prefix + demangle(demangleInput); + return prefix + demangle(std::string(demangleInput)); return (prefix + prefixless).str(); } - return symName; + return std::string(symName); } std::string toString(coff::Symbol &b) { return maybeDemangleSymbol(b.getName()); @@ -52,23 +52,15 @@ std::string toCOFFString(const Archive::Symbol &b) { 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() { |