Mercurial > hg > CbC > CbC_llvm
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; |