diff options
Diffstat (limited to 'llvm/tools/llvm-readobj/MachODumper.cpp')
| -rw-r--r-- | llvm/tools/llvm-readobj/MachODumper.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 20a60b3df699..c13b1f3bf2a0 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -10,7 +10,6 @@ // //===----------------------------------------------------------------------===// -#include "Error.h" #include "ObjDumper.h" #include "StackMapPrinter.h" #include "llvm-readobj.h" @@ -28,7 +27,7 @@ namespace { class MachODumper : public ObjDumper { public: MachODumper(const MachOObjectFile *Obj, ScopedPrinter &Writer) - : ObjDumper(Writer), Obj(Obj) {} + : ObjDumper(Writer, Obj->getFileName()), Obj(Obj) {} void printFileHeaders() override; void printSectionHeaders() override; @@ -68,15 +67,9 @@ private: namespace llvm { -std::error_code createMachODumper(const object::ObjectFile *Obj, - ScopedPrinter &Writer, - std::unique_ptr<ObjDumper> &Result) { - const MachOObjectFile *MachOObj = dyn_cast<MachOObjectFile>(Obj); - if (!MachOObj) - return readobj_error::unsupported_obj_file_format; - - Result.reset(new MachODumper(MachOObj, Writer)); - return readobj_error::success; +std::unique_ptr<ObjDumper> createMachODumper(const object::MachOObjectFile &Obj, + ScopedPrinter &Writer) { + return std::make_unique<MachODumper>(&Obj, Writer); } } // namespace llvm @@ -161,8 +154,9 @@ static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM[] = { }; static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64[] = { - LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL), - LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E), + LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL), + LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8), + LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E), }; static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = { @@ -629,13 +623,20 @@ void MachODumper::printSymbol(const SymbolRef &Symbol) { getSymbol(Obj, Symbol.getRawDataRefImpl(), MOSymbol); StringRef SectionName = ""; - Expected<section_iterator> SecIOrErr = Symbol.getSection(); - if (!SecIOrErr) - reportError(SecIOrErr.takeError(), Obj->getFileName()); + // Don't ask a Mach-O STABS symbol for its section unless we know that + // STAB symbol's section field refers to a valid section index. Otherwise + // the symbol may error trying to load a section that does not exist. + // TODO: Add a whitelist of STABS symbol types that contain valid section + // indices. + if (!(MOSymbol.Type & MachO::N_STAB)) { + Expected<section_iterator> SecIOrErr = Symbol.getSection(); + if (!SecIOrErr) + reportError(SecIOrErr.takeError(), Obj->getFileName()); - section_iterator SecI = *SecIOrErr; - if (SecI != Obj->section_end()) - SectionName = unwrapOrError(Obj->getFileName(), SecI->getName()); + section_iterator SecI = *SecIOrErr; + if (SecI != Obj->section_end()) + SectionName = unwrapOrError(Obj->getFileName(), SecI->getName()); + } DictScope D(W, "Symbol"); W.printNumber("Name", SymbolName, MOSymbol.StringIndex); |
