X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=tools%2Fllvm-dwarfdump%2Fllvm-dwarfdump.cpp;h=9ab2047c352206e1d4c8ada68b9249a6f284ff32;hp=0eb6e4f4304eb61f0681d527e9a51264a8b4159e;hb=1040f990fc26f08f59b3a2156b17814e72903e69;hpb=b138caba43b5c1a370bc9cf52d815c44bdf90159 diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 0eb6e4f4304..9ab2047c352 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -14,6 +14,8 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Triple.h" #include "llvm/DebugInfo/DIContext.h" +#include "llvm/DebugInfo/DWARF/DWARFContext.h" +#include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Object/RelocVisitor.h" #include "llvm/Support/CommandLine.h" @@ -21,7 +23,6 @@ #include "llvm/Support/Format.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/MemoryObject.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" @@ -45,6 +46,10 @@ DumpType("debug-dump", cl::init(DIDT_All), clEnumValN(DIDT_All, "all", "Dump all debug sections"), clEnumValN(DIDT_Abbrev, "abbrev", ".debug_abbrev"), clEnumValN(DIDT_AbbrevDwo, "abbrev.dwo", ".debug_abbrev.dwo"), + clEnumValN(DIDT_AppleNames, "apple_names", ".apple_names"), + clEnumValN(DIDT_AppleTypes, "apple_types", ".apple_types"), + clEnumValN(DIDT_AppleNamespaces, "apple_namespaces", ".apple_namespaces"), + clEnumValN(DIDT_AppleObjC, "apple_objc", ".apple_objc"), clEnumValN(DIDT_Aranges, "aranges", ".debug_aranges"), clEnumValN(DIDT_Info, "info", ".debug_info"), clEnumValN(DIDT_InfoDwo, "info.dwo", ".debug_info.dwo"), @@ -63,31 +68,46 @@ DumpType("debug-dump", cl::init(DIDT_All), clEnumValN(DIDT_Str, "str", ".debug_str"), clEnumValN(DIDT_StrDwo, "str.dwo", ".debug_str.dwo"), clEnumValN(DIDT_StrOffsetsDwo, "str_offsets.dwo", ".debug_str_offsets.dwo"), + clEnumValN(DIDT_CUIndex, "cu_index", ".debug_cu_index"), clEnumValEnd)); -static void DumpInput(const StringRef &Filename) { - std::unique_ptr Buff; - - if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, Buff)) { - errs() << Filename << ": " << ec.message() << "\n"; - return; - } - - ErrorOr ObjOrErr(ObjectFile::createObjectFile(Buff)); - if (std::error_code EC = ObjOrErr.getError()) { - errs() << Filename << ": " << EC.message() << '\n'; +static void error(StringRef Filename, std::error_code EC) { + if (!EC) return; - } - std::unique_ptr Obj(ObjOrErr.get()); + errs() << Filename << ": " << EC.message() << "\n"; + exit(1); +} - std::unique_ptr DICtx(DIContext::getDWARFContext(Obj.get())); +static void DumpObjectFile(ObjectFile &Obj, Twine Filename) { + std::unique_ptr DICtx(new DWARFContextInMemory(Obj)); - outs() << Filename - << ":\tfile format " << Obj->getFileFormatName() << "\n\n"; + outs() << Filename.str() << ":\tfile format " << Obj.getFileFormatName() + << "\n\n"; // Dump the complete DWARF structure. DICtx->dump(outs(), DumpType); } +static void DumpInput(StringRef Filename) { + ErrorOr> BuffOrErr = + MemoryBuffer::getFileOrSTDIN(Filename); + error(Filename, BuffOrErr.getError()); + std::unique_ptr Buff = std::move(BuffOrErr.get()); + + ErrorOr> BinOrErr = + object::createBinary(Buff->getMemBufferRef()); + error(Filename, BinOrErr.getError()); + + if (auto *Obj = dyn_cast(BinOrErr->get())) + DumpObjectFile(*Obj, Filename); + else if (auto *Fat = dyn_cast(BinOrErr->get())) + for (auto &ObjForArch : Fat->objects()) { + auto MachOOrErr = ObjForArch.getAsObjectFile(); + error(Filename, MachOOrErr.getError()); + DumpObjectFile(**MachOOrErr, + Filename + " (" + ObjForArch.getArchTypeName() + ")"); + } +} + int main(int argc, char **argv) { // Print a stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); @@ -102,5 +122,5 @@ int main(int argc, char **argv) { std::for_each(InputFilenames.begin(), InputFilenames.end(), DumpInput); - return 0; + return EXIT_SUCCESS; }