1d7169e9f067d60796269f1a77b1f10195742a453Eric Christopher//===-- llvm-dwarfdump.cpp - Debug info dumping utility for llvm ----------===// 272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// The LLVM Compiler Infrastructure 472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// This file is distributed under the University of Illinois Open Source 672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// License. See LICENSE.TXT for details. 772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===----------------------------------------------------------------------===// 972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 1072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// This program is a utility that works like "dwarfdump". 1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===----------------------------------------------------------------------===// 1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/ADT/STLExtras.h" 15f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/ADT/Triple.h" 16f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/DebugInfo/DIContext.h" 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Object/ObjectFile.h" 18806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#include "llvm/Object/RelocVisitor.h" 1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/CommandLine.h" 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/Debug.h" 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/Format.h" 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/ManagedStatic.h" 2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/MemoryBuffer.h" 2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/MemoryObject.h" 2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/PrettyStackTrace.h" 2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/Signals.h" 2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/raw_ostream.h" 2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include <algorithm> 2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include <cstring> 30806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#include <list> 31806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#include <string> 32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <system_error> 33806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 3472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerusing namespace llvm; 3572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerusing namespace object; 3672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 3772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstatic cl::list<std::string> 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerInputFilenames(cl::Positional, cl::desc("<input object files>"), 3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer cl::ZeroOrMore); 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 41939a4e8b693820d161f362317f7dba9057e66cc7Eli Benderskystatic cl::opt<DIDumpType> 42939a4e8b693820d161f362317f7dba9057e66cc7Eli BenderskyDumpType("debug-dump", cl::init(DIDT_All), 43939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky cl::desc("Dump of debug sections:"), 44939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky cl::values( 45939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_All, "all", "Dump all debug sections"), 46939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Abbrev, "abbrev", ".debug_abbrev"), 47939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_AbbrevDwo, "abbrev.dwo", ".debug_abbrev.dwo"), 48939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Aranges, "aranges", ".debug_aranges"), 49939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Info, "info", ".debug_info"), 50939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_InfoDwo, "info.dwo", ".debug_info.dwo"), 5126efdc5621043d28dc0c78addc7b7a75d1591a10David Blaikie clEnumValN(DIDT_Types, "types", ".debug_types"), 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines clEnumValN(DIDT_TypesDwo, "types.dwo", ".debug_types.dwo"), 53939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Line, "line", ".debug_line"), 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines clEnumValN(DIDT_LineDwo, "line.dwo", ".debug_line.dwo"), 553df7d2f70bb316ebeec8a8c862b3da5386fbb145David Blaikie clEnumValN(DIDT_Loc, "loc", ".debug_loc"), 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines clEnumValN(DIDT_LocDwo, "loc.dwo", ".debug_loc.dwo"), 5760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky clEnumValN(DIDT_Frames, "frames", ".debug_frame"), 58939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Ranges, "ranges", ".debug_ranges"), 59e38825f490b898644089d5cd9cb90cec681bded8Krzysztof Parzyszek clEnumValN(DIDT_Pubnames, "pubnames", ".debug_pubnames"), 607357f03e888e7d95066ca1bbb26994c278eb465cEric Christopher clEnumValN(DIDT_Pubtypes, "pubtypes", ".debug_pubtypes"), 61498ffb8a568992d613e654ddec69b04d350aec20Eric Christopher clEnumValN(DIDT_GnuPubnames, "gnu_pubnames", ".debug_gnu_pubnames"), 62498ffb8a568992d613e654ddec69b04d350aec20Eric Christopher clEnumValN(DIDT_GnuPubtypes, "gnu_pubtypes", ".debug_gnu_pubtypes"), 63939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_Str, "str", ".debug_str"), 64939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_StrDwo, "str.dwo", ".debug_str.dwo"), 65939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValN(DIDT_StrOffsetsDwo, "str_offsets.dwo", ".debug_str_offsets.dwo"), 66939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky clEnumValEnd)); 67939a4e8b693820d161f362317f7dba9057e66cc7Eli Bendersky 6872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstatic void DumpInput(const StringRef &Filename) { 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ErrorOr<std::unique_ptr<MemoryBuffer>> Buff = 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MemoryBuffer::getFileOrSTDIN(Filename); 7172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (std::error_code EC = Buff.getError()) { 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines errs() << Filename << ": " << EC.message() << "\n"; 7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return; 7572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ErrorOr<ObjectFile *> ObjOrErr(ObjectFile::createObjectFile(Buff.get())); 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (std::error_code EC = ObjOrErr.getError()) { 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines errs() << Filename << ": " << EC.message() << '\n'; 80a965baca3c7ce1ced00446cff1c6395d03dfed52Eli Bendersky return; 81a965baca3c7ce1ced00446cff1c6395d03dfed52Eli Bendersky } 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<ObjectFile> Obj(ObjOrErr.get()); 83a965baca3c7ce1ced00446cff1c6395d03dfed52Eli Bendersky 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<DIContext> DICtx(DIContext::getDWARFContext(Obj.get())); 8572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines outs() << Filename 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines << ":\tfile format " << Obj->getFileFormatName() << "\n\n"; 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Dump the complete DWARF structure. 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DICtx->dump(outs(), DumpType); 9072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 9172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerint main(int argc, char **argv) { 9372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Print a stack trace if we signal out. 9472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer sys::PrintStackTraceOnErrorSignal(); 9572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer PrettyStackTraceProgram X(argc, argv); 9672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 9772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer cl::ParseCommandLineOptions(argc, argv, "llvm dwarf dumper\n"); 9972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 10072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Defaults to a.out if no filenames specified. 10172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (InputFilenames.size() == 0) 10272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer InputFilenames.push_back("a.out"); 10372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 10472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer std::for_each(InputFilenames.begin(), InputFilenames.end(), DumpInput); 10572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 10672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return 0; 10772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 108