diff options
author | Adrian Prantl <aprantl@apple.com> | 2015-12-23 21:51:13 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2015-12-23 21:51:13 +0000 |
commit | 8e7d3b940234864b73833f19f00d8bb5234f1aef (patch) | |
tree | e5d14b6c2017f7c834022f67769796457d48870a /llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | |
parent | 442dfb4fc0281e2504f16318f480959f404f36de (diff) | |
download | bcm5719-llvm-8e7d3b940234864b73833f19f00d8bb5234f1aef.tar.gz bcm5719-llvm-8e7d3b940234864b73833f19f00d8bb5234f1aef.zip |
llvm-dwarfdump: Add support for dumping .dSYM bundles.
This replicates the logic of Darwin dwarfdump for manually opening up
.dSYM bundles without introducing any new dependencies.
<rdar://problem/20491670>
llvm-svn: 256350
Diffstat (limited to 'llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp')
-rw-r--r-- | llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index d742eb3ec34..eaacc7c5f21 100644 --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/Format.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" @@ -36,7 +37,7 @@ using namespace llvm; using namespace object; static cl::list<std::string> -InputFilenames(cl::Positional, cl::desc("<input object files>"), +InputFilenames(cl::Positional, cl::desc("<input object files or .dSYM bundles>"), cl::ZeroOrMore); static cl::opt<DIDumpType> DumpType( @@ -110,6 +111,39 @@ static void DumpInput(StringRef Filename) { } } +/// If the input path is a .dSYM bundle (as created by the dsymutil tool), +/// replace it with individual entries for each of the object files inside the +/// bundle otherwise return the input path. +static std::vector<std::string> expandBundle(std::string InputPath) { + std::vector<std::string> BundlePaths; + SmallString<256> BundlePath(InputPath); + // Manually open up the bundle to avoid introducing additional dependencies. + if (sys::fs::is_directory(BundlePath) && + sys::path::extension(BundlePath) == ".dSYM") { + std::error_code EC; + sys::path::append(BundlePath, "Contents", "Resources", "DWARF"); + for (sys::fs::directory_iterator Dir(BundlePath, EC), DirEnd; + Dir != DirEnd && !EC; Dir.increment(EC)) { + const std::string &Path = Dir->path(); + sys::fs::file_status Status; + EC = sys::fs::status(Path, Status); + error(Path, EC); + switch (Status.type()) { + case sys::fs::file_type::regular_file: + case sys::fs::file_type::symlink_file: + case sys::fs::file_type::type_unknown: + BundlePaths.push_back(Path); + break; + default: /*ignore*/; + } + } + error(BundlePath, EC); + } + if (!BundlePaths.size()) + BundlePaths.push_back(InputPath); + return BundlePaths; +} + int main(int argc, char **argv) { // Print a stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); @@ -122,7 +156,14 @@ int main(int argc, char **argv) { if (InputFilenames.size() == 0) InputFilenames.push_back("a.out"); - std::for_each(InputFilenames.begin(), InputFilenames.end(), DumpInput); + // Expand any .dSYM bundles to the individual object files contained therein. + std::vector<std::string> Objects; + for (auto F : InputFilenames) { + auto Objs = expandBundle(F); + Objects.insert(Objects.end(), Objs.begin(), Objs.end()); + } + + std::for_each(Objects.begin(), Objects.end(), DumpInput); return EXIT_SUCCESS; } |