comparison 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
comparison
equal deleted inserted replaced
172:9fbae9c8bf63 173:0572611fdcc8
50 return maybeDemangleSymbol(b.getName()); 50 return maybeDemangleSymbol(b.getName());
51 } 51 }
52 52
53 namespace coff { 53 namespace coff {
54 54
55 StringRef Symbol::getName() { 55 void Symbol::computeName() {
56 // COFF symbol names are read lazily for a performance reason. 56 assert(nameData == nullptr &&
57 // Non-external symbol names are never used by the linker except for logging 57 "should only compute the name once for DefinedCOFF symbols");
58 // or debugging. Their internal references are resolved not by name but by 58 auto *d = cast<DefinedCOFF>(this);
59 // symbol index. And because they are not external, no one can refer them by 59 StringRef nameStr =
60 // name. Object files contain lots of non-external symbols, and creating 60 check(cast<ObjFile>(d->file)->getCOFFObj()->getSymbolName(d->sym));
61 // StringRefs for them (which involves lots of strlen() on the string table) 61 nameData = nameStr.data();
62 // is a waste of time. 62 nameSize = nameStr.size();
63 if (nameData == nullptr) { 63 assert(nameSize == nameStr.size() && "name length truncated");
64 auto *d = cast<DefinedCOFF>(this);
65 StringRef nameStr;
66 cast<ObjFile>(d->file)->getCOFFObj()->getSymbolName(d->sym, nameStr);
67 nameData = nameStr.data();
68 nameSize = nameStr.size();
69 assert(nameSize == nameStr.size() && "name length truncated");
70 }
71 return StringRef(nameData, nameSize);
72 } 64 }
73 65
74 InputFile *Symbol::getFile() { 66 InputFile *Symbol::getFile() {
75 if (auto *sym = dyn_cast<DefinedCOFF>(this)) 67 if (auto *sym = dyn_cast<DefinedCOFF>(this))
76 return sym->file; 68 return sym->file;