From: Davide Italiano Date: Thu, 27 Aug 2015 15:11:32 +0000 (+0000) Subject: [llvm-readobj] Add support for dumping MachO min version load command. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=7dbe74f4e32e6bd936f792148668a3cf1e3db2af [llvm-readobj] Add support for dumping MachO min version load command. Example output: File: Format: Mach-O arm Arch: arm AddressSize: 32bit MinVersion { Cmd: LC_VERSION_MIN_IPHONEOS Size: 16 Version: 99.8.7 SDK: n/a } Differential Revision: http://reviews.llvm.org/D12373 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246151 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp index 4628d7ab294..57db9ed7b2d 100644 --- a/tools/llvm-readobj/MachODumper.cpp +++ b/tools/llvm-readobj/MachODumper.cpp @@ -42,6 +42,7 @@ public: // MachO-specific. void printMachODataInCode() override; + void printMachOVersionMin() override; private: template @@ -625,3 +626,40 @@ void MachODumper::printMachODataInCode() { } } } + +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); + } + } +} diff --git a/tools/llvm-readobj/ObjDumper.h b/tools/llvm-readobj/ObjDumper.h index 153e5bb8972..8710088185f 100644 --- a/tools/llvm-readobj/ObjDumper.h +++ b/tools/llvm-readobj/ObjDumper.h @@ -56,6 +56,7 @@ public: // Only implemented for MachO. virtual void printMachODataInCode() { } + virtual void printMachOVersionMin() { } virtual void printStackMap() const = 0; diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index c6f303ddb0f..d41dcc3ab4f 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -186,6 +186,10 @@ namespace opts { 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 @@ static void dumpObject(const ObjectFile *Obj) { if (Obj->isMachO()) if (opts::MachODataInCode) Dumper->printMachODataInCode(); + if (opts::MachOVersionMin) + Dumper->printMachOVersionMin(); if (opts::PrintStackMap) Dumper->printStackMap(); }