mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 18:24:00 +00:00
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:
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
@ -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");
|
||||||
|
@ -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 =
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user