diff options
author | Davide Italiano <davide@freebsd.org> | 2015-08-27 15:11:32 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2015-08-27 15:11:32 +0000 |
commit | 976f4da09d0a2defc8448e890149b5376bd4c7e7 (patch) | |
tree | 67f5b57eec82dbd7293ca84bd482f016ac27f0a3 /llvm/tools/llvm-readobj | |
parent | 3e61f238c6e5382038250613b5bfcca3da31bad1 (diff) | |
download | bcm5719-llvm-976f4da09d0a2defc8448e890149b5376bd4c7e7.tar.gz bcm5719-llvm-976f4da09d0a2defc8448e890149b5376bd4c7e7.zip |
[llvm-readobj] Add support for dumping MachO min version load command.
Example output:
File: <stdin>
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
llvm-svn: 246151
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/MachODumper.cpp | 38 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.h | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 6 |
3 files changed, 45 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 4628d7ab294..57db9ed7b2d 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -42,6 +42,7 @@ public: // MachO-specific. void printMachODataInCode() override; + void printMachOVersionMin() override; private: template<class MachHeader> @@ -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/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index 153e5bb8972..8710088185f 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/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/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index c6f303ddb0f..d41dcc3ab4f 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/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<bool> + MachOVersionMin("macho-version-min", + cl::desc("Display MachO version min command")); // -stackmap cl::opt<bool> 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(); } |