diff options
author | Georgii Rymar <grimar@accesssoftek.com> | 2020-07-06 13:45:49 +0300 |
---|---|---|
committer | Georgii Rymar <grimar@accesssoftek.com> | 2020-07-07 13:33:47 +0300 |
commit | 2953ac0975bc7e5dbe61fbd6538f02487efa62d2 (patch) | |
tree | 110193c1f3aba9dc6d4137b8ce4a34ff6d16865f /llvm | |
parent | 2d9bd448c9f051de088b53592f89871e9b390fba (diff) | |
download | llvm-2953ac0975bc7e5dbe61fbd6538f02487efa62d2.zip llvm-2953ac0975bc7e5dbe61fbd6538f02487efa62d2.tar.gz llvm-2953ac0975bc7e5dbe61fbd6538f02487efa62d2.tar.bz2 |
[llvm-readobj] - Refactor ELFDumper<ELFT>::getStaticSymbolName.
This is a followup for D83129.
It is possible to make `getStaticSymbolName` report warnings inside
and return the "<?>" on a error. This allows to encapsulate errors handling
and slightly simplifies the logic in callers code.
Differential revision: https://reviews.llvm.org/D83208
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/tools/llvm-readobj/ELF/addrsig.test | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 35 |
2 files changed, 17 insertions, 20 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/addrsig.test b/llvm/test/tools/llvm-readobj/ELF/addrsig.test index 1234a42..c4793aae 100644 --- a/llvm/test/tools/llvm-readobj/ELF/addrsig.test +++ b/llvm/test/tools/llvm-readobj/ELF/addrsig.test @@ -58,7 +58,7 @@ Sections: # INVALID-INDEX: Addrsig [ # INVALID-INDEX-NEXT: Sym: foo (1) -# INVALID-INDEX-NEXT: warning: '[[FILE]]': unable to get symbol from section [index 2]: invalid symbol index (255) +# INVALID-INDEX-NEXT: warning: '[[FILE]]': unable to read the name of symbol with index 255: unable to get symbol from section [index 2]: invalid symbol index (255) # INVALID-INDEX-NEXT: Sym: <?> (255) # INVALID-INDEX-NEXT: Sym: bar (2) # INVALID-INDEX-NEXT: ] diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 3d51515..b284aae8 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -343,7 +343,7 @@ public: const Elf_Sym *FirstSym) const; Expected<StringRef> getSymbolSectionName(const Elf_Sym *Symbol, unsigned SectionIndex) const; - Expected<std::string> getStaticSymbolName(uint32_t Index) const; + std::string getStaticSymbolName(uint32_t Index) const; StringRef getDynamicString(uint64_t Value) const; Expected<StringRef> getSymbolVersionByIndex(uint32_t VersionSymbolIndex, bool &IsDefault) const; @@ -1131,21 +1131,27 @@ static std::string maybeDemangle(StringRef Name) { } template <typename ELFT> -Expected<std::string> -ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const { +std::string ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const { + auto Warn = [&](Error E) -> std::string { + this->reportUniqueWarning( + createError("unable to read the name of symbol with index " + + Twine(Index) + ": " + toString(std::move(E)))); + return "<?>"; + }; + const ELFFile<ELFT> *Obj = ObjF->getELFFile(); Expected<const typename ELFT::Sym *> SymOrErr = Obj->getSymbol(DotSymtabSec, Index); if (!SymOrErr) - return SymOrErr.takeError(); + return Warn(SymOrErr.takeError()); Expected<StringRef> StrTabOrErr = Obj->getStringTableForSymtab(*DotSymtabSec); if (!StrTabOrErr) - return StrTabOrErr.takeError(); + return Warn(StrTabOrErr.takeError()); Expected<StringRef> NameOrErr = (*SymOrErr)->getName(*StrTabOrErr); if (!NameOrErr) - return NameOrErr.takeError(); + return Warn(NameOrErr.takeError()); return maybeDemangle(*NameOrErr); } @@ -6575,21 +6581,12 @@ void LLVMStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) { return; } - auto GetSymName = [&](uint32_t Index) -> std::string { - if (Expected<std::string> NameOrErr = - this->dumper()->getStaticSymbolName(Index)) - return *NameOrErr; - else - this->reportUniqueWarning( - createError("unable to read the name of symbol with index " + - Twine(Index) + ": " + toString(NameOrErr.takeError()))); - return "<?>"; - }; - for (const Elf_CGProfile &CGPE : *CGProfileOrErr) { DictScope D(W, "CGProfileEntry"); - W.printNumber("From", GetSymName(CGPE.cgp_from), CGPE.cgp_from); - W.printNumber("To", GetSymName(CGPE.cgp_to), CGPE.cgp_to); + W.printNumber("From", this->dumper()->getStaticSymbolName(CGPE.cgp_from), + CGPE.cgp_from); + W.printNumber("To", this->dumper()->getStaticSymbolName(CGPE.cgp_to), + CGPE.cgp_to); W.printNumber("Weight", CGPE.cgp_weight); } } |