llvm-readobj: call exit(1) on error.

llvm-readobj exists for testing llvm. We can safely stop the program
the first time we know the input in corrupted.

This is in preparation for making it handle a few more broken files.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2015-07-20 03:23:55 +00:00
parent b9adbd998f
commit d60ced8e08
7 changed files with 61 additions and 92 deletions

View File

@ -16,7 +16,6 @@ RUN: 2>&1 | FileCheck --check-prefix=VER %s
SECNAME: Error reading file: Invalid data was encountered while parsing the file. SECNAME: Error reading file: Invalid data was encountered while parsing the file.
SECDATA: Error reading file: Invalid data was encountered while parsing the file.
SECDATA: Error reading file: Invalid data was encountered while parsing the file. SECDATA: Error reading file: Invalid data was encountered while parsing the file.
SYMNAME: Error reading file: Invalid data was encountered while parsing the file. SYMNAME: Error reading file: Invalid data was encountered while parsing the file.

View File

@ -385,14 +385,12 @@ void COFFDumper::printFileHeaders() {
// Print PE header. This header does not exist if this is an object file and // Print PE header. This header does not exist if this is an object file and
// not an executable. // not an executable.
const pe32_header *PEHeader = nullptr; const pe32_header *PEHeader = nullptr;
if (error(Obj->getPE32Header(PEHeader))) error(Obj->getPE32Header(PEHeader));
return;
if (PEHeader) if (PEHeader)
printPEHeader<pe32_header>(PEHeader); printPEHeader<pe32_header>(PEHeader);
const pe32plus_header *PEPlusHeader = nullptr; const pe32plus_header *PEPlusHeader = nullptr;
if (error(Obj->getPE32PlusHeader(PEPlusHeader))) error(Obj->getPE32PlusHeader(PEPlusHeader));
return;
if (PEPlusHeader) if (PEPlusHeader)
printPEHeader<pe32plus_header>(PEPlusHeader); printPEHeader<pe32plus_header>(PEPlusHeader);
@ -477,8 +475,7 @@ void COFFDumper::printBaseOfDataField(const pe32plus_header *) {}
void COFFDumper::printCodeViewDebugInfo(const SectionRef &Section) { void COFFDumper::printCodeViewDebugInfo(const SectionRef &Section) {
StringRef Data; StringRef Data;
if (error(Section.getContents(Data))) error(Section.getContents(Data));
return;
SmallVector<StringRef, 10> FunctionNames; SmallVector<StringRef, 10> FunctionNames;
StringMap<StringRef> FunctionLineTables; StringMap<StringRef> FunctionLineTables;
@ -534,9 +531,8 @@ void COFFDumper::printCodeViewDebugInfo(const SectionRef &Section) {
} }
StringRef FunctionName; StringRef FunctionName;
if (error(resolveSymbolName(Obj->getCOFFSection(Section), Offset, error(resolveSymbolName(Obj->getCOFFSection(Section), Offset,
FunctionName))) FunctionName));
return;
W.printString("FunctionName", FunctionName); W.printString("FunctionName", FunctionName);
if (FunctionLineTables.count(FunctionName) != 0) { if (FunctionLineTables.count(FunctionName) != 0) {
// Saw debug info for this function already? // Saw debug info for this function already?
@ -695,9 +691,8 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection,
uint32_t CodeSize = DE.getU32(&Offset); uint32_t CodeSize = DE.getU32(&Offset);
DE.getU8(&Offset, Unused, 12); DE.getU8(&Offset, Unused, 12);
StringRef SectionName; StringRef SectionName;
if (error(resolveSymbolName(Obj->getCOFFSection(Section), error(resolveSymbolName(Obj->getCOFFSection(Section),
OffsetInSection + Offset, SectionName))) OffsetInSection + Offset, SectionName));
return;
Offset += 4; Offset += 4;
DE.getU8(&Offset, Unused, 3); DE.getU8(&Offset, Unused, 3);
StringRef DisplayName = DE.getCStr(&Offset); StringRef DisplayName = DE.getCStr(&Offset);
@ -748,8 +743,7 @@ void COFFDumper::printSections() {
const coff_section *Section = Obj->getCOFFSection(Sec); const coff_section *Section = Obj->getCOFFSection(Sec);
StringRef Name; StringRef Name;
if (error(Sec.getName(Name))) error(Sec.getName(Name));
Name = "";
DictScope D(W, "Section"); DictScope D(W, "Section");
W.printNumber("Number", SectionNumber); W.printNumber("Number", SectionNumber);
@ -788,8 +782,7 @@ void COFFDumper::printSections() {
if (opts::SectionData && if (opts::SectionData &&
!(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) { !(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) {
StringRef Data; StringRef Data;
if (error(Sec.getContents(Data))) error(Sec.getContents(Data));
break;
W.printBinaryBlock("SectionData", Data); W.printBinaryBlock("SectionData", Data);
} }
@ -803,8 +796,7 @@ void COFFDumper::printRelocations() {
for (const SectionRef &Section : Obj->sections()) { for (const SectionRef &Section : Obj->sections()) {
++SectionNumber; ++SectionNumber;
StringRef Name; StringRef Name;
if (error(Section.getName(Name))) error(Section.getName(Name));
continue;
bool PrintedGroup = false; bool PrintedGroup = false;
for (const RelocationRef &Reloc : Section.relocations()) { for (const RelocationRef &Reloc : Section.relocations()) {
@ -834,8 +826,7 @@ void COFFDumper::printRelocation(const SectionRef &Section,
symbol_iterator Symbol = Reloc.getSymbol(); symbol_iterator Symbol = Reloc.getSymbol();
if (Symbol != Obj->symbol_end()) { if (Symbol != Obj->symbol_end()) {
ErrorOr<StringRef> SymbolNameOrErr = Symbol->getName(); ErrorOr<StringRef> SymbolNameOrErr = Symbol->getName();
if (error(SymbolNameOrErr.getError())) error(SymbolNameOrErr.getError());
return;
SymbolName = *SymbolNameOrErr; SymbolName = *SymbolNameOrErr;
} }
@ -914,8 +905,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
for (uint8_t I = 0; I < Symbol.getNumberOfAuxSymbols(); ++I) { for (uint8_t I = 0; I < Symbol.getNumberOfAuxSymbols(); ++I) {
if (Symbol.isFunctionDefinition()) { if (Symbol.isFunctionDefinition()) {
const coff_aux_function_definition *Aux; const coff_aux_function_definition *Aux;
if (error(getSymbolAuxData(Obj, Symbol, I, Aux))) error(getSymbolAuxData(Obj, Symbol, I, Aux));
break;
DictScope AS(W, "AuxFunctionDef"); DictScope AS(W, "AuxFunctionDef");
W.printNumber("TagIndex", Aux->TagIndex); W.printNumber("TagIndex", Aux->TagIndex);
@ -925,8 +915,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
} else if (Symbol.isAnyUndefined()) { } else if (Symbol.isAnyUndefined()) {
const coff_aux_weak_external *Aux; const coff_aux_weak_external *Aux;
if (error(getSymbolAuxData(Obj, Symbol, I, Aux))) error(getSymbolAuxData(Obj, Symbol, I, Aux));
break;
ErrorOr<COFFSymbolRef> Linked = Obj->getSymbol(Aux->TagIndex); ErrorOr<COFFSymbolRef> Linked = Obj->getSymbol(Aux->TagIndex);
StringRef LinkedName; StringRef LinkedName;
@ -943,8 +932,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
} else if (Symbol.isFileRecord()) { } else if (Symbol.isFileRecord()) {
const char *FileName; const char *FileName;
if (error(getSymbolAuxData(Obj, Symbol, I, FileName))) error(getSymbolAuxData(Obj, Symbol, I, FileName));
break;
DictScope AS(W, "AuxFileRecord"); DictScope AS(W, "AuxFileRecord");
@ -954,8 +942,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
break; break;
} else if (Symbol.isSectionDefinition()) { } else if (Symbol.isSectionDefinition()) {
const coff_aux_section_definition *Aux; const coff_aux_section_definition *Aux;
if (error(getSymbolAuxData(Obj, Symbol, I, Aux))) error(getSymbolAuxData(Obj, Symbol, I, Aux));
break;
int32_t AuxNumber = Aux->getNumber(Symbol.isBigObj()); int32_t AuxNumber = Aux->getNumber(Symbol.isBigObj());
@ -986,8 +973,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) {
} }
} else if (Symbol.isCLRToken()) { } else if (Symbol.isCLRToken()) {
const coff_aux_clr_token *Aux; const coff_aux_clr_token *Aux;
if (error(getSymbolAuxData(Obj, Symbol, I, Aux))) error(getSymbolAuxData(Obj, Symbol, I, Aux));
break;
ErrorOr<COFFSymbolRef> ReferredSym = ErrorOr<COFFSymbolRef> ReferredSym =
Obj->getSymbol(Aux->SymbolTableIndex); Obj->getSymbol(Aux->SymbolTableIndex);
@ -1040,9 +1026,9 @@ void COFFDumper::printImportedSymbols(
iterator_range<imported_symbol_iterator> Range) { iterator_range<imported_symbol_iterator> Range) {
for (const ImportedSymbolRef &I : Range) { for (const ImportedSymbolRef &I : Range) {
StringRef Sym; StringRef Sym;
if (error(I.getSymbolName(Sym))) return; error(I.getSymbolName(Sym));
uint16_t Ordinal; uint16_t Ordinal;
if (error(I.getOrdinal(Ordinal))) return; error(I.getOrdinal(Ordinal));
W.printNumber("Symbol", Sym, Ordinal); W.printNumber("Symbol", Sym, Ordinal);
} }
} }
@ -1054,12 +1040,12 @@ void COFFDumper::printDelayImportedSymbols(
for (const ImportedSymbolRef &S : Range) { for (const ImportedSymbolRef &S : Range) {
DictScope Import(W, "Import"); DictScope Import(W, "Import");
StringRef Sym; StringRef Sym;
if (error(S.getSymbolName(Sym))) return; error(S.getSymbolName(Sym));
uint16_t Ordinal; uint16_t Ordinal;
if (error(S.getOrdinal(Ordinal))) return; error(S.getOrdinal(Ordinal));
W.printNumber("Symbol", Sym, Ordinal); W.printNumber("Symbol", Sym, Ordinal);
uint64_t Addr; uint64_t Addr;
if (error(I.getImportAddress(Index++, Addr))) return; error(I.getImportAddress(Index++, Addr));
W.printHex("Address", Addr); W.printHex("Address", Addr);
} }
} }
@ -1069,12 +1055,12 @@ void COFFDumper::printCOFFImports() {
for (const ImportDirectoryEntryRef &I : Obj->import_directories()) { for (const ImportDirectoryEntryRef &I : Obj->import_directories()) {
DictScope Import(W, "Import"); DictScope Import(W, "Import");
StringRef Name; StringRef Name;
if (error(I.getName(Name))) return; error(I.getName(Name));
W.printString("Name", Name); W.printString("Name", Name);
uint32_t Addr; uint32_t Addr;
if (error(I.getImportLookupTableRVA(Addr))) return; error(I.getImportLookupTableRVA(Addr));
W.printHex("ImportLookupTableRVA", Addr); W.printHex("ImportLookupTableRVA", Addr);
if (error(I.getImportAddressTableRVA(Addr))) return; error(I.getImportAddressTableRVA(Addr));
W.printHex("ImportAddressTableRVA", Addr); W.printHex("ImportAddressTableRVA", Addr);
printImportedSymbols(I.imported_symbols()); printImportedSymbols(I.imported_symbols());
} }
@ -1083,10 +1069,10 @@ void COFFDumper::printCOFFImports() {
for (const DelayImportDirectoryEntryRef &I : Obj->delay_import_directories()) { for (const DelayImportDirectoryEntryRef &I : Obj->delay_import_directories()) {
DictScope Import(W, "DelayImport"); DictScope Import(W, "DelayImport");
StringRef Name; StringRef Name;
if (error(I.getName(Name))) return; error(I.getName(Name));
W.printString("Name", Name); W.printString("Name", Name);
const delay_import_directory_table_entry *Table; const delay_import_directory_table_entry *Table;
if (error(I.getDelayImportTable(Table))) return; error(I.getDelayImportTable(Table));
W.printHex("Attributes", Table->Attributes); W.printHex("Attributes", Table->Attributes);
W.printHex("ModuleHandle", Table->ModuleHandle); W.printHex("ModuleHandle", Table->ModuleHandle);
W.printHex("ImportAddressTable", Table->DelayImportAddressTable); W.printHex("ImportAddressTable", Table->DelayImportAddressTable);
@ -1104,12 +1090,9 @@ void COFFDumper::printCOFFExports() {
StringRef Name; StringRef Name;
uint32_t Ordinal, RVA; uint32_t Ordinal, RVA;
if (error(E.getSymbolName(Name))) error(E.getSymbolName(Name));
continue; error(E.getOrdinal(Ordinal));
if (error(E.getOrdinal(Ordinal))) error(E.getExportRVA(RVA));
continue;
if (error(E.getExportRVA(RVA)))
continue;
W.printNumber("Ordinal", Ordinal); W.printNumber("Ordinal", Ordinal);
W.printString("Name", Name); W.printString("Name", Name);
@ -1122,13 +1105,11 @@ void COFFDumper::printCOFFDirectives() {
StringRef Contents; StringRef Contents;
StringRef Name; StringRef Name;
if (error(Section.getName(Name))) error(Section.getName(Name));
continue;
if (Name != ".drectve") if (Name != ".drectve")
continue; continue;
if (error(Section.getContents(Contents))) error(Section.getContents(Contents));
return;
W.printString("Directive(s)", Contents); W.printString("Directive(s)", Contents);
} }
@ -1152,10 +1133,8 @@ void COFFDumper::printCOFFBaseReloc() {
for (const BaseRelocRef &I : Obj->base_relocs()) { for (const BaseRelocRef &I : Obj->base_relocs()) {
uint8_t Type; uint8_t Type;
uint32_t RVA; uint32_t RVA;
if (error(I.getRVA(RVA))) error(I.getRVA(RVA));
continue; error(I.getType(Type));
if (error(I.getType(Type)))
continue;
DictScope Import(W, "Entry"); DictScope Import(W, "Entry");
W.printString("Type", getBaseRelocTypeName(Type)); W.printString("Type", getBaseRelocTypeName(Type));
W.printHex("Address", RVA); W.printHex("Address", RVA);

View File

@ -164,7 +164,7 @@ getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol,
if (SectionIndex == SHN_XINDEX) if (SectionIndex == SHN_XINDEX)
SectionIndex = Obj.getExtendedSymbolTableIndex(&*Symbol); SectionIndex = Obj.getExtendedSymbolTableIndex(&*Symbol);
ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex); ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex);
if (!error(Sec.getError())) error(Sec.getError());
SectionName = errorOrDefault(Obj.getSectionName(*Sec)); SectionName = errorOrDefault(Obj.getSectionName(*Sec));
} }
} }
@ -752,20 +752,18 @@ void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec,
Obj->getRelocationSymbol(Sec, &Rel); Obj->getRelocationSymbol(Sec, &Rel);
if (Sym.second && Sym.second->getType() == ELF::STT_SECTION) { if (Sym.second && Sym.second->getType() == ELF::STT_SECTION) {
ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym.second); ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym.second);
if (!error(Sec.getError())) { error(Sec.getError());
ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec); ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec);
if (SecName) if (SecName)
TargetName = SecName.get(); TargetName = SecName.get();
}
} else if (Sym.first) { } else if (Sym.first) {
const Elf_Shdr *SymTable = Sym.first; const Elf_Shdr *SymTable = Sym.first;
ErrorOr<const Elf_Shdr *> StrTableSec = Obj->getSection(SymTable->sh_link); ErrorOr<const Elf_Shdr *> StrTableSec = Obj->getSection(SymTable->sh_link);
if (!error(StrTableSec.getError())) { error(StrTableSec.getError());
ErrorOr<StringRef> StrTableOrErr = Obj->getStringTable(*StrTableSec); ErrorOr<StringRef> StrTableOrErr = Obj->getStringTable(*StrTableSec);
if (!error(StrTableOrErr.getError())) error(StrTableOrErr.getError());
TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr)); TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr));
} }
}
if (opts::ExpandRelocs) { if (opts::ExpandRelocs) {
DictScope Group(W, "Relocation"); DictScope Group(W, "Relocation");

View File

@ -375,8 +375,7 @@ void MachODumper::printSections(const MachOObjectFile *Obj) {
DataRefImpl DR = Section.getRawDataRefImpl(); DataRefImpl DR = Section.getRawDataRefImpl();
StringRef Name; StringRef Name;
if (error(Section.getName(Name))) error(Section.getName(Name));
Name = "";
ArrayRef<char> RawName = Obj->getSectionRawName(DR); ArrayRef<char> RawName = Obj->getSectionRawName(DR);
StringRef SegmentName = Obj->getSectionFinalSegmentName(DR); StringRef SegmentName = Obj->getSectionFinalSegmentName(DR);
@ -419,8 +418,7 @@ void MachODumper::printSections(const MachOObjectFile *Obj) {
bool IsBSS = Section.isBSS(); bool IsBSS = Section.isBSS();
if (!IsBSS) { if (!IsBSS) {
StringRef Data; StringRef Data;
if (error(Section.getContents(Data))) error(Section.getContents(Data));
break;
W.printBinaryBlock("SectionData", Data); W.printBinaryBlock("SectionData", Data);
} }
@ -434,8 +432,7 @@ void MachODumper::printRelocations() {
std::error_code EC; std::error_code EC;
for (const SectionRef &Section : Obj->sections()) { for (const SectionRef &Section : Obj->sections()) {
StringRef Name; StringRef Name;
if (error(Section.getName(Name))) error(Section.getName(Name));
continue;
bool PrintedGroup = false; bool PrintedGroup = false;
for (const RelocationRef &Reloc : Section.relocations()) { for (const RelocationRef &Reloc : Section.relocations()) {
@ -475,15 +472,13 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj,
symbol_iterator Symbol = Reloc.getSymbol(); symbol_iterator Symbol = Reloc.getSymbol();
if (Symbol != Obj->symbol_end()) { if (Symbol != Obj->symbol_end()) {
ErrorOr<StringRef> TargetNameOrErr = Symbol->getName(); ErrorOr<StringRef> TargetNameOrErr = Symbol->getName();
if (error(TargetNameOrErr.getError())) error(TargetNameOrErr.getError());
return;
TargetName = *TargetNameOrErr; TargetName = *TargetNameOrErr;
} }
} else if (!IsScattered) { } else if (!IsScattered) {
section_iterator SecI = Obj->getRelocationSection(DR); section_iterator SecI = Obj->getRelocationSection(DR);
if (SecI != Obj->section_end()) { if (SecI != Obj->section_end()) {
if (error(SecI->getName(TargetName))) error(SecI->getName(TargetName));
return;
} }
} }
if (TargetName.empty()) if (TargetName.empty())
@ -548,7 +543,8 @@ void MachODumper::printSymbol(const SymbolRef &Symbol) {
StringRef SectionName = ""; StringRef SectionName = "";
section_iterator SecI(Obj->section_begin()); section_iterator SecI(Obj->section_begin());
if (!error(Symbol.getSection(SecI)) && SecI != Obj->section_end()) error(Symbol.getSection(SecI));
if (SecI != Obj->section_end())
error(SecI->getName(SectionName)); error(SecI->getName(SectionName));
DictScope D(W, "Symbol"); DictScope D(W, "Symbol");

View File

@ -284,11 +284,11 @@ void Dumper::printRuntimeFunction(const Context &Ctx,
const coff_section *XData; const coff_section *XData;
uint64_t Offset; uint64_t Offset;
if (error(resolveRelocation(Ctx, Section, SectionOffset + 8, XData, Offset))) resolveRelocation(Ctx, Section, SectionOffset + 8, XData, Offset);
return;
ArrayRef<uint8_t> Contents; ArrayRef<uint8_t> Contents;
if (error(Ctx.COFF.getSectionContents(XData, Contents)) || Contents.empty()) error(Ctx.COFF.getSectionContents(XData, Contents));
if (Contents.empty())
return; return;
Offset = Offset + RF.UnwindInfoOffset; Offset = Offset + RF.UnwindInfoOffset;
@ -302,15 +302,15 @@ void Dumper::printRuntimeFunction(const Context &Ctx,
void Dumper::printData(const Context &Ctx) { void Dumper::printData(const Context &Ctx) {
for (const auto &Section : Ctx.COFF.sections()) { for (const auto &Section : Ctx.COFF.sections()) {
StringRef Name; StringRef Name;
if (error(Section.getName(Name))) Section.getName(Name);
continue;
if (Name != ".pdata" && !Name.startswith(".pdata$")) if (Name != ".pdata" && !Name.startswith(".pdata$"))
continue; continue;
const coff_section *PData = Ctx.COFF.getCOFFSection(Section); const coff_section *PData = Ctx.COFF.getCOFFSection(Section);
ArrayRef<uint8_t> Contents; ArrayRef<uint8_t> Contents;
if (error(Ctx.COFF.getSectionContents(PData, Contents)) || Contents.empty()) error(Ctx.COFF.getSectionContents(PData, Contents));
if (Contents.empty())
continue; continue;
const RuntimeFunction *Entries = const RuntimeFunction *Entries =

View File

@ -188,22 +188,19 @@ namespace opts {
} // namespace opts } // namespace opts
static int ReturnValue = EXIT_SUCCESS;
static void reportError(Twine Msg) { static void reportError(Twine Msg) {
ReturnValue = EXIT_FAILURE;
outs() << Msg << "\n"; outs() << Msg << "\n";
outs().flush(); outs().flush();
exit(1);
} }
namespace llvm { namespace llvm {
bool error(std::error_code EC) { void error(std::error_code EC) {
if (!EC) if (!EC)
return false; return;
reportError(Twine("\nError reading file: ") + EC.message() + "."); reportError(Twine("\nError reading file: ") + EC.message() + ".");
return true;
} }
bool relocAddressLess(RelocationRef a, RelocationRef b) { bool relocAddressLess(RelocationRef a, RelocationRef b) {
@ -408,5 +405,5 @@ int main(int argc, const char *argv[]) {
std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(), std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(),
dumpInput); dumpInput);
return ReturnValue; return 0;
} }

View File

@ -19,7 +19,7 @@ namespace llvm {
} }
// Various helper functions. // Various helper functions.
bool error(std::error_code ec); void error(std::error_code ec);
bool relocAddressLess(object::RelocationRef A, bool relocAddressLess(object::RelocationRef A,
object::RelocationRef B); object::RelocationRef B);
} // namespace llvm } // namespace llvm