From: Rafael Espindola Date: Thu, 3 Nov 2016 17:28:33 +0000 (+0000) Subject: Replace a report_fatal_error with an ErrorOr. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7446318ad9d91aca7533c967eea800da6ce6c344;p=llvm Replace a report_fatal_error with an ErrorOr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285942 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 2155fea5d26..fe56c39d768 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -132,9 +132,9 @@ public: } /// \brief Iterate over program header table. - const Elf_Phdr_Range program_headers() const { + ErrorOr program_headers() const { if (Header->e_phnum && Header->e_phentsize != sizeof(Elf_Phdr)) - report_fatal_error("Invalid program header size"); + return object_error::parse_failed; auto *Begin = reinterpret_cast(base() + Header->e_phoff); return makeArrayRef(Begin, Begin+Header->e_phnum); } diff --git a/test/Object/corrupt.test b/test/Object/corrupt.test index 3ce7dc7f5e9..d19d2924f14 100644 --- a/test/Object/corrupt.test +++ b/test/Object/corrupt.test @@ -36,7 +36,7 @@ RUN: not llvm-readobj -program-headers \ RUN: %p/Inputs/corrupt-invalid-phentsize.elf.x86-64 2>&1 | \ RUN: FileCheck --check-prefix=PHENTSIZE %s -PHENTSIZE: Invalid program header size +PHENTSIZE: Invalid data was encountered while parsing the file. RUN: not llvm-readobj -dynamic-table \ RUN: %p/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 2>&1 | \ diff --git a/tools/llvm-objdump/ELFDump.cpp b/tools/llvm-objdump/ELFDump.cpp index 7b44e3916c4..e9e0bcf30e8 100644 --- a/tools/llvm-objdump/ELFDump.cpp +++ b/tools/llvm-objdump/ELFDump.cpp @@ -24,7 +24,10 @@ using namespace llvm::object; template void printProgramHeaders(const ELFFile *o) { typedef ELFFile ELFO; outs() << "Program Header:\n"; - for (const typename ELFO::Elf_Phdr &Phdr : o->program_headers()) { + auto ProgramHeaderOrError = o->program_headers(); + if (std::error_code EC = ProgramHeaderOrError.getError()) + report_fatal_error(EC.message()); + for (const typename ELFO::Elf_Phdr &Phdr : *ProgramHeaderOrError) { switch (Phdr.p_type) { case ELF::PT_LOAD: outs() << " LOAD "; diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 05c018cfe3d..edb35642395 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -1305,7 +1305,7 @@ ELFDumper::ELFDumper(const ELFFile *Obj, ScopedPrinter &Writer) : ObjDumper(Writer), Obj(Obj) { SmallVector LoadSegments; - for (const Elf_Phdr &Phdr : Obj->program_headers()) { + for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { if (Phdr.p_type == ELF::PT_DYNAMIC) { DynamicTable = createDRIFrom(&Phdr, sizeof(Elf_Dyn)); continue; @@ -2910,7 +2910,7 @@ void GNUStyle::printProgramHeaders(const ELFO *Obj) { else OS << " Type Offset VirtAddr PhysAddr FileSiz " << "MemSiz Flg Align\n"; - for (const auto &Phdr : Obj->program_headers()) { + for (const auto &Phdr : unwrapOrError(Obj->program_headers())) { Type = getElfPtType(Header->e_machine, Phdr.p_type); Offset = to_string(format_hex(Phdr.p_offset, 8)); VMA = to_string(format_hex(Phdr.p_vaddr, Width)); @@ -2937,7 +2937,7 @@ void GNUStyle::printProgramHeaders(const ELFO *Obj) { } OS << "\n Section to Segment mapping:\n Segment Sections...\n"; int Phnum = 0; - for (const Elf_Phdr &Phdr : Obj->program_headers()) { + for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { std::string Sections; OS << format(" %2.2d ", Phnum++); for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { @@ -3268,7 +3268,7 @@ void GNUStyle::printNotes(const ELFFile *Obj) { }; if (IsCore) { - for (const auto &P : Obj->program_headers()) + for (const auto &P : unwrapOrError(Obj->program_headers())) if (P.p_type == PT_NOTE) process(P.p_offset, P.p_filesz); } else { @@ -3630,7 +3630,7 @@ template void LLVMStyle::printProgramHeaders(const ELFO *Obj) { ListScope L(W, "ProgramHeaders"); - for (const Elf_Phdr &Phdr : Obj->program_headers()) { + for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { DictScope P(W, "ProgramHeader"); W.printHex("Type", getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type),