forked from OSchip/llvm-project
llvm-objdump: deal with unexpected object files more gracefully.
Specifically, we don't want to segfault on release builds, so print the problem instead. llvm-svn: 287022
This commit is contained in:
parent
d4bb5e4831
commit
bf55f7ea59
Binary file not shown.
|
@ -0,0 +1,5 @@
|
|||
# RUN: llvm-objdump -unwind-info %p/Inputs/malformed-unwind.macho-x86_64 | FileCheck %s
|
||||
|
||||
# CHECK: Contents of __unwind_info section:
|
||||
# [...]
|
||||
# CHECK: Skipping 2nd level page with unknown kind 4
|
|
@ -7072,8 +7072,10 @@ printMachOCompactUnwindSection(const MachOObjectFile *Obj,
|
|||
std::map<uint64_t, SymbolRef> &Symbols,
|
||||
const SectionRef &CompactUnwind) {
|
||||
|
||||
assert(Obj->isLittleEndian() &&
|
||||
"There should not be a big-endian .o with __compact_unwind");
|
||||
if (!Obj->isLittleEndian()) {
|
||||
outs() << "Skipping big-endian __compact_unwind section\n";
|
||||
return;
|
||||
}
|
||||
|
||||
bool Is64 = Obj->is64Bit();
|
||||
uint32_t PointerSize = Is64 ? sizeof(uint64_t) : sizeof(uint32_t);
|
||||
|
@ -7105,8 +7107,10 @@ printMachOCompactUnwindSection(const MachOObjectFile *Obj,
|
|||
Entry.PersonalityReloc = Reloc;
|
||||
else if (OffsetInEntry == 2 * PointerSize + 2 * sizeof(uint32_t))
|
||||
Entry.LSDAReloc = Reloc;
|
||||
else
|
||||
llvm_unreachable("Unexpected relocation in __compact_unwind section");
|
||||
else {
|
||||
outs() << "Invalid relocation in __compact_unwind section\n";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, we're ready to print the data we've gathered.
|
||||
|
@ -7212,8 +7216,10 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
|
|||
std::map<uint64_t, SymbolRef> &Symbols,
|
||||
const SectionRef &UnwindInfo) {
|
||||
|
||||
assert(Obj->isLittleEndian() &&
|
||||
"There should not be a big-endian .o with __unwind_info");
|
||||
if (!Obj->isLittleEndian()) {
|
||||
outs() << "Skipping big-endian __unwind_info section\n";
|
||||
return;
|
||||
}
|
||||
|
||||
outs() << "Contents of __unwind_info section:\n";
|
||||
|
||||
|
@ -7228,7 +7234,10 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
|
|||
uint32_t Version = readNext<uint32_t>(Pos);
|
||||
outs() << " Version: "
|
||||
<< format("0x%" PRIx32, Version) << '\n';
|
||||
assert(Version == 1 && "only understand version 1");
|
||||
if (Version != 1) {
|
||||
outs() << " Skipping section with unknown version\n";
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t CommonEncodingsStart = readNext<uint32_t>(Pos);
|
||||
outs() << " Common encodings array section offset: "
|
||||
|
@ -7368,7 +7377,8 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
|
|||
printCompressedSecondLevelUnwindPage(Pos, IndexEntries[i].FunctionOffset,
|
||||
CommonEncodings);
|
||||
else
|
||||
llvm_unreachable("Do not know how to print this kind of 2nd level page");
|
||||
outs() << " Skipping 2nd level page with unknown kind " << Kind
|
||||
<< '\n';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue