llvm-dwarfdump: Add an option to print out line info for a specific address
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 15 Sep 2011 21:17:40 +0000 (21:17 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 15 Sep 2011 21:17:40 +0000 (21:17 +0000)
Usage:
$ llvm-dwarfdump -address=0x0000000100000ed4 a.out.dSYM/Contents/Resources/DWARF/a.out
xxx.c:6:0

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139850 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-dwarfdump/llvm-dwarfdump.cpp

index 9618a1a4bba2d4476e5d7ba941c679bfaf4c6af1..66d5a72ea4478bf675c6256a1110d33d9d613fe4 100644 (file)
@@ -35,6 +35,10 @@ static cl::list<std::string>
 InputFilenames(cl::Positional, cl::desc("<input object files>"),
                cl::ZeroOrMore);
 
+static cl::opt<unsigned long long>
+Address("address", cl::init(-1ULL),
+        cl::desc("Print line information for a given address"));
+
 static void DumpInput(const StringRef &Filename) {
   OwningPtr<MemoryBuffer> Buff;
 
@@ -45,10 +49,6 @@ static void DumpInput(const StringRef &Filename) {
 
   OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take()));
 
-  outs() << '\n';
-  outs() << Filename
-         << ":\tfile format " << Obj->getFileFormatName() << "\n\n";
-
   StringRef DebugInfoSection;
   StringRef DebugAbbrevSection;
   StringRef DebugLineSection;
@@ -85,7 +85,17 @@ static void DumpInput(const StringRef &Filename) {
                                                         DebugArangesSection,
                                                         DebugLineSection,
                                                         DebugStringSection));
-  dictx->dump(outs());
+  if (Address == -1ULL) {
+    outs() << Filename
+           << ":\tfile format " << Obj->getFileFormatName() << "\n\n";
+    // Dump the complete DWARF structure.
+    dictx->dump(outs());
+  } else {
+    // Print line info for the specified address.
+    DILineInfo dli = dictx->getLineInfoForAddress(Address);
+    outs() << (dli.getFileName() ? dli.getFileName() : "<unknown>") << ':'
+           << dli.getLine() << ':' << dli.getColumn() << '\n';
+  }
 }
 
 int main(int argc, char **argv) {