Index: llvm/trunk/tools/llvm-readobj/MachODumper.cpp =================================================================== --- llvm/trunk/tools/llvm-readobj/MachODumper.cpp +++ llvm/trunk/tools/llvm-readobj/MachODumper.cpp @@ -42,6 +42,7 @@ // MachO-specific. void printMachODataInCode() override; + void printMachOVersionMin() override; private: template @@ -625,3 +626,40 @@ } } } + +void MachODumper::printMachOVersionMin() { + for (const auto &Load : Obj->load_commands()) { + if (Load.C.cmd == MachO::LC_VERSION_MIN_MACOSX || + Load.C.cmd == MachO::LC_VERSION_MIN_IPHONEOS) { + MachO::version_min_command VMC = Obj->getVersionMinLoadCommand(Load); + DictScope Group(W, "MinVersion"); + StringRef Cmd; + if (Load.C.cmd == MachO::LC_VERSION_MIN_MACOSX) + Cmd = "LC_VERSION_MIN_MACOSX"; + else + Cmd = "LC_VERSION_MIN_IPHONEOS"; + W.printString("Cmd", Cmd); + W.printNumber("Size", VMC.cmdsize); + SmallString<32> Version; + Version = utostr(MachOObjectFile::getVersionMinMajor(VMC, false)) + "." + + utostr(MachOObjectFile::getVersionMinMinor(VMC, false)); + uint32_t Update = MachOObjectFile::getVersionMinUpdate(VMC, false); + if (Update != 0) + Version += "." + utostr(MachOObjectFile::getVersionMinUpdate(VMC, + false)); + W.printString("Version", Version); + SmallString<32> SDK; + if (VMC.sdk == 0) + SDK = "n/a"; + else { + SDK = utostr(MachOObjectFile::getVersionMinMajor(VMC, true)) + "." + + utostr(MachOObjectFile::getVersionMinMinor(VMC, true)); + uint32_t Update = MachOObjectFile::getVersionMinUpdate(VMC, true); + if (Update != 0) + SDK += "." + utostr(MachOObjectFile::getVersionMinUpdate(VMC, + true)); + } + W.printString("SDK", SDK); + } + } +} Index: llvm/trunk/tools/llvm-readobj/ObjDumper.h =================================================================== --- llvm/trunk/tools/llvm-readobj/ObjDumper.h +++ llvm/trunk/tools/llvm-readobj/ObjDumper.h @@ -56,6 +56,7 @@ // Only implemented for MachO. virtual void printMachODataInCode() { } + virtual void printMachOVersionMin() { } virtual void printStackMap() const = 0; Index: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp =================================================================== --- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp +++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp @@ -186,6 +186,10 @@ MachODataInCode("macho-data-in-code", cl::desc("Display MachO Data in Code command")); + // -macho-version-min + cl::opt + MachOVersionMin("macho-version-min", + cl::desc("Display MachO version min command")); // -stackmap cl::opt PrintStackMap("stackmap", @@ -320,6 +324,8 @@ if (Obj->isMachO()) if (opts::MachODataInCode) Dumper->printMachODataInCode(); + if (opts::MachOVersionMin) + Dumper->printMachOVersionMin(); if (opts::PrintStackMap) Dumper->printStackMap(); }