summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/COFFDumper.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-11-17 11:17:17 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-11-17 11:17:17 +0000
commit236b0ca79055779c4d024d66dcd0cbc44265df7f (patch)
tree22602146bb0ce39a2ae4d0f4b901c48952cca9c0 /llvm/tools/llvm-readobj/COFFDumper.cpp
parentd29db9b949034de5ee71a445b9aa8cbe20b62f07 (diff)
downloadbcm5719-llvm-236b0ca79055779c4d024d66dcd0cbc44265df7f.tar.gz
bcm5719-llvm-236b0ca79055779c4d024d66dcd0cbc44265df7f.zip
Object, COFF: Tighten the object file parser
We were a little lax in a few areas: - We pretended that import libraries were like any old COFF file, they are not. In fact, they aren't really COFF files at all, we should probably grow some specialized functionality to handle them smarter. - Our symbol iterators were more than happy to attempt to go past the end of the symbol table if you had a symbol with a bad list of auxiliary symbols. llvm-svn: 222124
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp36
1 files changed, 22 insertions, 14 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index 1506f06136e..c5469db98af 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -825,22 +825,22 @@ void COFFDumper::printSymbols() {
void COFFDumper::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); }
-static StringRef getSectionName(const llvm::object::COFFObjectFile *Obj,
- COFFSymbolRef Symbol,
- const coff_section *Section) {
+static ErrorOr<StringRef>
+getSectionName(const llvm::object::COFFObjectFile *Obj, int32_t SectionNumber,
+ const coff_section *Section) {
if (Section) {
StringRef SectionName;
- Obj->getSectionName(Section, SectionName);
+ if (std::error_code EC = Obj->getSectionName(Section, SectionName))
+ return EC;
return SectionName;
}
- int32_t SectionNumber = Symbol.getSectionNumber();
if (SectionNumber == llvm::COFF::IMAGE_SYM_DEBUG)
- return "IMAGE_SYM_DEBUG";
+ return StringRef("IMAGE_SYM_DEBUG");
if (SectionNumber == llvm::COFF::IMAGE_SYM_ABSOLUTE)
- return "IMAGE_SYM_ABSOLUTE";
+ return StringRef("IMAGE_SYM_ABSOLUTE");
if (SectionNumber == llvm::COFF::IMAGE_SYM_UNDEFINED)
- return "IMAGE_SYM_UNDEFINED";
- return "";
+ return StringRef("IMAGE_SYM_UNDEFINED");
+ return StringRef("");
}
void COFFDumper::printSymbol(const SymbolRef &Sym) {
@@ -858,7 +858,11 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
if (Obj->getSymbolName(Symbol, SymbolName))
SymbolName = "";
- StringRef SectionName = getSectionName(Obj, Symbol, Section);
+ StringRef SectionName = "";
+ ErrorOr<StringRef> Res =
+ getSectionName(Obj, Symbol.getSectionNumber(), Section);
+ if (Res)
+ SectionName = *Res;
W.printString("Name", SymbolName);
W.printNumber("Value", Symbol.getValue());
@@ -929,10 +933,14 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
if (Section && Section->Characteristics & COFF::IMAGE_SCN_LNK_COMDAT
&& Aux->Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) {
const coff_section *Assoc;
- StringRef AssocName;
- std::error_code EC;
- if ((EC = Obj->getSection(AuxNumber, Assoc)) ||
- (EC = Obj->getSectionName(Assoc, AssocName))) {
+ StringRef AssocName = "";
+ std::error_code EC = Obj->getSection(AuxNumber, Assoc);
+ ErrorOr<StringRef> Res = getSectionName(Obj, AuxNumber, Assoc);
+ if (Res)
+ AssocName = *Res;
+ if (!EC)
+ EC = Res.getError();
+ if (EC) {
AssocName = "";
error(EC);
}
OpenPOWER on IntegriCloud