<div dir="ltr">Hello Jonas,<br><br>This commit broke tests on few our builders:<br><br><a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/18318">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/18318</a><br><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu</a><br><a href="http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu">http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu</a><br><br>. . .<br>Failing Tests (1):<br>    LLVM :: tools/llvm-dwarfdump/X86/lookup.s<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 3, 2017 at 10:10 AM, Jonas Devlieghere via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jdevlieghere<br>
Date: Tue Oct  3 10:10:21 2017<br>
New Revision: 314817<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=314817&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=314817&view=rev</a><br>
Log:<br>
[dwarfdump] Add -lookup option<br>
<br>
Add the option to lookup an address in the debug information and print<br>
out the file, function, block and line table details.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D38409" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D38409</a><br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-<wbr>dwarfdump/X86/lookup.s<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>DebugInfo/DIContext.h<br>
    llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFContext.h<br>
    llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFUnit.h<br>
    llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFContext.cpp<br>
    llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFUnit.cpp<br>
    llvm/trunk/test/tools/llvm-<wbr>dwarfdump/cmdline.test<br>
    llvm/trunk/tools/llvm-<wbr>dwarfdump/llvm-dwarfdump.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>DebugInfo/DIContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DIContext.h?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/DebugInfo/DIContext.h?<wbr>rev=314817&r1=314816&r2=<wbr>314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>DebugInfo/DIContext.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>DebugInfo/DIContext.h Tue Oct  3 10:10:21 2017<br>
@@ -17,6 +17,7 @@<br>
<br>
 #include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Support/raw_ostream.h"<br>
 #include <cassert><br>
 #include <cstdint><br>
 #include <memory><br>
@@ -26,8 +27,6 @@<br>
<br>
 namespace llvm {<br>
<br>
-class raw_ostream;<br>
-<br>
 /// A format-neutral container for source line information.<br>
 struct DILineInfo {<br>
   std::string FileName;<br>
@@ -46,15 +45,30 @@ struct DILineInfo {<br>
            FileName == RHS.FileName && FunctionName == RHS.FunctionName &&<br>
            StartLine == RHS.StartLine && Discriminator == RHS.Discriminator;<br>
   }<br>
+<br>
   bool operator!=(const DILineInfo &RHS) const {<br>
     return !(*this == RHS);<br>
   }<br>
+<br>
   bool operator<(const DILineInfo &RHS) const {<br>
     return std::tie(FileName, FunctionName, Line, Column, StartLine,<br>
                     Discriminator) <<br>
            std::tie(RHS.FileName, RHS.FunctionName, RHS.Line, RHS.Column,<br>
                     RHS.StartLine, RHS.Discriminator);<br>
   }<br>
+<br>
+  operator bool() const { return (*this) != DILineInfo(); }<br>
+<br>
+  void dump(raw_ostream &OS) {<br>
+    OS << "Line info: ";<br>
+    if (FileName != "<invalid>")<br>
+      OS << "file '" << FileName << "', ";<br>
+    if (FunctionName != "<invalid>")<br>
+      OS << "function '" << FunctionName << "', ";<br>
+    OS << "line " << Line << ", ";<br>
+    OS << "column " << Column << ", ";<br>
+    OS << "start line " << StartLine << '\n';<br>
+  }<br>
 };<br>
<br>
 using DILineInfoTable = SmallVector<std::pair<uint64_<wbr>t, DILineInfo>, 16>;<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/DebugInfo/DWARF/<wbr>DWARFContext.h?rev=314817&r1=<wbr>314816&r2=314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFContext.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFContext.h Tue Oct  3 10:10:21 2017<br>
@@ -257,6 +257,18 @@ public:<br>
   /// Get a pointer to a parsed line table corresponding to a compile unit.<br>
   const DWARFDebugLine::LineTable *getLineTableForUnit(DWARFUnit *cu);<br>
<br>
+  /// Wraps the returned DIEs for a given address.<br>
+  struct DIEsForAddress {<br>
+    DWARFCompileUnit *CompileUnit = nullptr;<br>
+    DWARFDie FunctionDIE;<br>
+    DWARFDie BlockDIE;<br>
+    operator bool() const { return CompileUnit != nullptr; }<br>
+  };<br>
+<br>
+  /// Get the compilation unit, the function DIE and lexical block DIE for the<br>
+  /// given address where applicable.<br>
+  DIEsForAddress getDIEsForAddress(uint64_t Address);<br>
+<br>
   DILineInfo getLineInfoForAddress(uint64_t Address,<br>
       DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;<br>
   DILineInfoTable getLineInfoForAddressRange(<wbr>uint64_t Address, uint64_t Size,<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFUnit.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/DebugInfo/DWARF/<wbr>DWARFUnit.h?rev=314817&r1=<wbr>314816&r2=314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFUnit.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>DebugInfo/DWARF/DWARFUnit.h Tue Oct  3 10:10:21 2017<br>
@@ -329,6 +329,11 @@ public:<br>
<br>
   void collectAddressRanges(<wbr>DWARFAddressRangesVector &CURanges);<br>
<br>
+  /// Returns subprogram DIE with address range encompassing the provided<br>
+  /// address. The pointer is alive as long as parsed compile unit DIEs are not<br>
+  /// cleared.<br>
+  DWARFDie getSubroutineForAddress(<wbr>uint64_t Address);<br>
+<br>
   /// getInlinedChainForAddress - fetches inlined chain for a given address.<br>
   /// Returns empty chain if there is no subprogram containing address. The<br>
   /// chain is valid as long as parsed compile unit DIEs are not cleared.<br>
@@ -411,11 +416,6 @@ private:<br>
   /// parseDWO - Parses .dwo file for current compile unit. Returns true if<br>
   /// it was actually constructed.<br>
   bool parseDWO();<br>
-<br>
-  /// getSubroutineForAddress - Returns subprogram DIE with address range<br>
-  /// encompassing the provided address. The pointer is alive as long as parsed<br>
-  /// compile unit DIEs are not cleared.<br>
-  DWARFDie getSubroutineForAddress(<wbr>uint64_t Address);<br>
 };<br>
<br>
 } // end namespace llvm<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>DebugInfo/DWARF/DWARFContext.<wbr>cpp?rev=314817&r1=314816&r2=<wbr>314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFContext.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFContext.cpp Tue Oct  3 10:10:21 2017<br>
@@ -48,7 +48,6 @@<br>
 #include <cstdint><br>
 #include <map><br>
 #include <string><br>
-#include <tuple><br>
 #include <utility><br>
 #include <vector><br>
<br>
@@ -723,6 +722,35 @@ DWARFCompileUnit *DWARFContext::getCompi<br>
   return getCompileUnitForOffset(<wbr>CUOffset);<br>
 }<br>
<br>
+DWARFContext::DIEsForAddress DWARFContext::<wbr>getDIEsForAddress(uint64_t Address) {<br>
+  DIEsForAddress Result;<br>
+<br>
+  DWARFCompileUnit *CU = getCompileUnitForAddress(<wbr>Address);<br>
+  if (!CU)<br>
+    return Result;<br>
+<br>
+  Result.CompileUnit = CU;<br>
+  Result.FunctionDIE = CU->getSubroutineForAddress(<wbr>Address);<br>
+<br>
+  std::vector<DWARFDie> Worklist;<br>
+  Worklist.push_back(Result.<wbr>FunctionDIE);<br>
+  while (!Worklist.empty()) {<br>
+    DWARFDie DIE = Worklist.back();<br>
+    Worklist.pop_back();<br>
+<br>
+    if (DIE.getTag() == DW_TAG_lexical_block &&<br>
+        DIE.<wbr>addressRangeContainsAddress(<wbr>Address)) {<br>
+      Result.BlockDIE = DIE;<br>
+      break;<br>
+    }<br>
+<br>
+    for (auto Child : DIE)<br>
+      Worklist.push_back(Child);<br>
+  }<br>
+<br>
+  return Result;<br>
+}<br>
+<br>
 static bool getFunctionNameAndStartLineFor<wbr>Address(DWARFCompileUnit *CU,<br>
                                                   uint64_t Address,<br>
                                                   FunctionNameKind Kind,<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFUnit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>DebugInfo/DWARF/DWARFUnit.cpp?<wbr>rev=314817&r1=314816&r2=<wbr>314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFUnit.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/<wbr>DWARF/DWARFUnit.cpp Tue Oct  3 10:10:21 2017<br>
@@ -440,7 +440,7 @@ DWARFDie DWARFUnit::getSibling(const DWA<br>
   // NULL DIEs don't have siblings.<br>
   if (Die-><wbr>getAbbreviationDeclarationPtr(<wbr>) == nullptr)<br>
     return DWARFDie();<br>
-<br>
+<br>
   // Find the next DIE whose depth is the same as the Die's depth.<br>
   for (size_t I = getDIEIndex(Die) + 1, EndIdx = DieArray.size(); I < EndIdx;<br>
        ++I) {<br>
<br>
Added: llvm/trunk/test/tools/llvm-<wbr>dwarfdump/X86/lookup.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/lookup.s?rev=314817&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-dwarfdump/X86/lookup.s?<wbr>rev=314817&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-<wbr>dwarfdump/X86/lookup.s (added)<br>
+++ llvm/trunk/test/tools/llvm-<wbr>dwarfdump/X86/lookup.s Tue Oct  3 10:10:21 2017<br>
@@ -0,0 +1,285 @@<br>
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \<br>
+# RUN:   | llvm-dwarfdump -lookup=0x6a6f6e6173 - | \<br>
+# RUN: FileCheck %s --check-prefix=EMPTY --allow-empty<br>
+# EMPTY: {{^$}}<br>
+<br>
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \<br>
+# RUN:   | llvm-dwarfdump -lookup=0x4 - | \<br>
+# RUN: FileCheck %s -check-prefixes=CHECK,LEX,A<br>
+<br>
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \<br>
+# RUN:   | llvm-dwarfdump -lookup=0xb - | \<br>
+# RUN: FileCheck %s -check-prefixes=CHECK,LEX,B<br>
+<br>
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \<br>
+# RUN:   | llvm-dwarfdump -lookup=0x14 - | \<br>
+# RUN: FileCheck %s -check-prefixes=CHECK,C<br>
+<br>
+# CHECK: Compile Unit: length = 0x00000060 version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000064)<br>
+<br>
+# CHECK: DW_TAG_compile_unit<br>
+# CHECK:   DW_AT_name        ("foo.c")<br>
+# CHECK:   DW_AT_stmt_list   (0x00000000)<br>
+# CHECK:   DW_AT_low_pc      (0x0000000000000000)<br>
+# CHECK:   DW_AT_high_pc     (0x00000016)<br>
+<br>
+# CHECK: DW_TAG_subprogram<br>
+# CHECK:     DW_AT_low_pc    (0x0000000000000000)<br>
+# CHECK:     DW_AT_high_pc   (0x00000016)<br>
+# CHECK:     DW_AT_name      ("foo")<br>
+<br>
+# LEX: DW_TAG_lexical_block<br>
+# LEX:       DW_AT_low_pc  (0x0000000000000004)<br>
+# LEX:       DW_AT_high_pc (0x00000010)<br>
+<br>
+# A: Line info: file 'foo.c', line 3, column 9, start line 1<br>
+# B: Line info: file 'foo.c', line 4, column 6, start line 1<br>
+# C: Line info: file 'foo.c', line 6, column 1, start line 1<br>
+<br>
+       .section        __TEXT,__text,regular,pure_<wbr>instructions<br>
+       .macosx_version_min 10, 13<br>
+       .globl  _foo                    ## -- Begin function foo<br>
+       .p2align        4, 0x90<br>
+_foo:                                   ## @foo<br>
+Lfunc_begin0:<br>
+       .file   1 "foo.c"<br>
+       .loc    1 1 0                   ## foo.c:1:0<br>
+       .cfi_startproc<br>
+## BB#0:                                ## %entry<br>
+       pushq   %rbp<br>
+Lcfi0:<br>
+       .cfi_def_cfa_offset 16<br>
+Lcfi1:<br>
+       .cfi_offset %rbp, -16<br>
+       movq    %rsp, %rbp<br>
+Lcfi2:<br>
+       .cfi_def_cfa_register %rbp<br>
+Ltmp0:<br>
+       .loc    1 3 9 prologue_end      ## foo.c:3:9<br>
+       movl    $1, -4(%rbp)<br>
+       .loc    1 4 6                   ## foo.c:4:6<br>
+       movl    -4(%rbp), %eax<br>
+       addl    $1, %eax<br>
+       movl    %eax, -4(%rbp)<br>
+Ltmp1:<br>
+       .loc    1 6 1                   ## foo.c:6:1<br>
+       popq    %rbp<br>
+       retq<br>
+Ltmp2:<br>
+Lfunc_end0:<br>
+       .cfi_endproc<br>
+                                        ## -- End function<br>
+       .section        __DWARF,__debug_str,regular,<wbr>debug<br>
+Linfo_string:<br>
+       .asciz  "clang version 6.0.0 (trunk 314509) (llvm/trunk 314517)" ## string offset=0<br>
+       .asciz  "foo.c"                 ## string offset=55<br>
+       .asciz  "/private/tmp"          ## string offset=61<br>
+       .asciz  "foo"                   ## string offset=74<br>
+       .asciz  "i"                     ## string offset=78<br>
+       .asciz  "int"                   ## string offset=80<br>
+       .section        __DWARF,__debug_abbrev,<wbr>regular,debug<br>
+Lsection_abbrev:<br>
+       .byte   1                       ## Abbreviation Code<br>
+       .byte   17                      ## DW_TAG_compile_unit<br>
+       .byte   1                       ## DW_CHILDREN_yes<br>
+       .byte   37                      ## DW_AT_producer<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   19                      ## DW_AT_language<br>
+       .byte   5                       ## DW_FORM_data2<br>
+       .byte   3                       ## DW_AT_name<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   16                      ## DW_AT_stmt_list<br>
+       .byte   23                      ## DW_FORM_sec_offset<br>
+       .byte   27                      ## DW_AT_comp_dir<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   17                      ## DW_AT_low_pc<br>
+       .byte   1                       ## DW_FORM_addr<br>
+       .byte   18                      ## DW_AT_high_pc<br>
+       .byte   6                       ## DW_FORM_data4<br>
+       .byte   0                       ## EOM(1)<br>
+       .byte   0                       ## EOM(2)<br>
+       .byte   2                       ## Abbreviation Code<br>
+       .byte   46                      ## DW_TAG_subprogram<br>
+       .byte   1                       ## DW_CHILDREN_yes<br>
+       .byte   17                      ## DW_AT_low_pc<br>
+       .byte   1                       ## DW_FORM_addr<br>
+       .byte   18                      ## DW_AT_high_pc<br>
+       .byte   6                       ## DW_FORM_data4<br>
+       .byte   64                      ## DW_AT_frame_base<br>
+       .byte   24                      ## DW_FORM_exprloc<br>
+       .byte   3                       ## DW_AT_name<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   58                      ## DW_AT_decl_file<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   59                      ## DW_AT_decl_line<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   63                      ## DW_AT_external<br>
+       .byte   25                      ## DW_FORM_flag_present<br>
+       .byte   0                       ## EOM(1)<br>
+       .byte   0                       ## EOM(2)<br>
+       .byte   3                       ## Abbreviation Code<br>
+       .byte   11                      ## DW_TAG_lexical_block<br>
+       .byte   1                       ## DW_CHILDREN_yes<br>
+       .byte   17                      ## DW_AT_low_pc<br>
+       .byte   1                       ## DW_FORM_addr<br>
+       .byte   18                      ## DW_AT_high_pc<br>
+       .byte   6                       ## DW_FORM_data4<br>
+       .byte   0                       ## EOM(1)<br>
+       .byte   0                       ## EOM(2)<br>
+       .byte   4                       ## Abbreviation Code<br>
+       .byte   52                      ## DW_TAG_variable<br>
+       .byte   0                       ## DW_CHILDREN_no<br>
+       .byte   2                       ## DW_AT_location<br>
+       .byte   24                      ## DW_FORM_exprloc<br>
+       .byte   3                       ## DW_AT_name<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   58                      ## DW_AT_decl_file<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   59                      ## DW_AT_decl_line<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   73                      ## DW_AT_type<br>
+       .byte   19                      ## DW_FORM_ref4<br>
+       .byte   0                       ## EOM(1)<br>
+       .byte   0                       ## EOM(2)<br>
+       .byte   5                       ## Abbreviation Code<br>
+       .byte   36                      ## DW_TAG_base_type<br>
+       .byte   0                       ## DW_CHILDREN_no<br>
+       .byte   3                       ## DW_AT_name<br>
+       .byte   14                      ## DW_FORM_strp<br>
+       .byte   62                      ## DW_AT_encoding<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   11                      ## DW_AT_byte_size<br>
+       .byte   11                      ## DW_FORM_data1<br>
+       .byte   0                       ## EOM(1)<br>
+       .byte   0                       ## EOM(2)<br>
+       .byte   0                       ## EOM(3)<br>
+       .section        __DWARF,__debug_info,regular,<wbr>debug<br>
+Lsection_info:<br>
+Lcu_begin0:<br>
+       .long   96                      ## Length of Unit<br>
+       .short  4                       ## DWARF version number<br>
+Lset0 = Lsection_abbrev-Lsection_<wbr>abbrev ## Offset Into Abbrev. Section<br>
+       .long   Lset0<br>
+       .byte   8                       ## Address Size (in bytes)<br>
+       .byte   1                       ## Abbrev [1] 0xb:0x59 DW_TAG_compile_unit<br>
+       .long   0                       ## DW_AT_producer<br>
+       .short  12                      ## DW_AT_language<br>
+       .long   55                      ## DW_AT_name<br>
+Lset1 = Lline_table_start0-Lsection_<wbr>line ## DW_AT_stmt_list<br>
+       .long   Lset1<br>
+       .long   61                      ## DW_AT_comp_dir<br>
+       .quad   Lfunc_begin0            ## DW_AT_low_pc<br>
+Lset2 = Lfunc_end0-Lfunc_begin0         ## DW_AT_high_pc<br>
+       .long   Lset2<br>
+       .byte   2                       ## Abbrev [2] 0x2a:0x32 DW_TAG_subprogram<br>
+       .quad   Lfunc_begin0            ## DW_AT_low_pc<br>
+Lset3 = Lfunc_end0-Lfunc_begin0         ## DW_AT_high_pc<br>
+       .long   Lset3<br>
+       .byte   1                       ## DW_AT_frame_base<br>
+       .byte   86<br>
+       .long   74                      ## DW_AT_name<br>
+       .byte   1                       ## DW_AT_decl_file<br>
+       .byte   1                       ## DW_AT_decl_line<br>
+                                        ## DW_AT_external<br>
+       .byte   3                       ## Abbrev [3] 0x3f:0x1c DW_TAG_lexical_block<br>
+       .quad   Ltmp0                   ## DW_AT_low_pc<br>
+Lset4 = Ltmp1-Ltmp0                     ## DW_AT_high_pc<br>
+       .long   Lset4<br>
+       .byte   4                       ## Abbrev [4] 0x4c:0xe DW_TAG_variable<br>
+       .byte   2                       ## DW_AT_location<br>
+       .byte   145<br>
+       .byte   124<br>
+       .long   78                      ## DW_AT_name<br>
+       .byte   1                       ## DW_AT_decl_file<br>
+       .byte   3                       ## DW_AT_decl_line<br>
+       .long   92                      ## DW_AT_type<br>
+       .byte   0                       ## End Of Children Mark<br>
+       .byte   0                       ## End Of Children Mark<br>
+       .byte   5                       ## Abbrev [5] 0x5c:0x7 DW_TAG_base_type<br>
+       .long   80                      ## DW_AT_name<br>
+       .byte   5                       ## DW_AT_encoding<br>
+       .byte   4                       ## DW_AT_byte_size<br>
+       .byte   0                       ## End Of Children Mark<br>
+       .section        __DWARF,__debug_ranges,<wbr>regular,debug<br>
+Ldebug_range:<br>
+       .section        __DWARF,__debug_macinfo,<wbr>regular,debug<br>
+Ldebug_macinfo:<br>
+Lcu_macro_begin0:<br>
+       .byte   0                       ## End Of Macro List Mark<br>
+       .section        __DWARF,__apple_names,regular,<wbr>debug<br>
+Lnames_begin:<br>
+       .long   1212240712              ## Header Magic<br>
+       .short  1                       ## Header Version<br>
+       .short  0                       ## Header Hash Function<br>
+       .long   1                       ## Header Bucket Count<br>
+       .long   1                       ## Header Hash Count<br>
+       .long   12                      ## Header Data Length<br>
+       .long   0                       ## HeaderData Die Offset Base<br>
+       .long   1                       ## HeaderData Atom Count<br>
+       .short  1                       ## DW_ATOM_die_offset<br>
+       .short  6                       ## DW_FORM_data4<br>
+       .long   0                       ## Bucket 0<br>
+       .long   193491849               ## Hash in Bucket 0<br>
+       .long   LNames0-Lnames_begin    ## Offset in Bucket 0<br>
+LNames0:<br>
+       .long   74                      ## foo<br>
+       .long   1                       ## Num DIEs<br>
+       .long   42<br>
+       .long   0<br>
+       .section        __DWARF,__apple_objc,regular,<wbr>debug<br>
+Lobjc_begin:<br>
+       .long   1212240712              ## Header Magic<br>
+       .short  1                       ## Header Version<br>
+       .short  0                       ## Header Hash Function<br>
+       .long   1                       ## Header Bucket Count<br>
+       .long   0                       ## Header Hash Count<br>
+       .long   12                      ## Header Data Length<br>
+       .long   0                       ## HeaderData Die Offset Base<br>
+       .long   1                       ## HeaderData Atom Count<br>
+       .short  1                       ## DW_ATOM_die_offset<br>
+       .short  6                       ## DW_FORM_data4<br>
+       .long   -1                      ## Bucket 0<br>
+       .section        __DWARF,__apple_namespac,<wbr>regular,debug<br>
+Lnamespac_begin:<br>
+       .long   1212240712              ## Header Magic<br>
+       .short  1                       ## Header Version<br>
+       .short  0                       ## Header Hash Function<br>
+       .long   1                       ## Header Bucket Count<br>
+       .long   0                       ## Header Hash Count<br>
+       .long   12                      ## Header Data Length<br>
+       .long   0                       ## HeaderData Die Offset Base<br>
+       .long   1                       ## HeaderData Atom Count<br>
+       .short  1                       ## DW_ATOM_die_offset<br>
+       .short  6                       ## DW_FORM_data4<br>
+       .long   -1                      ## Bucket 0<br>
+       .section        __DWARF,__apple_types,regular,<wbr>debug<br>
+Ltypes_begin:<br>
+       .long   1212240712              ## Header Magic<br>
+       .short  1                       ## Header Version<br>
+       .short  0                       ## Header Hash Function<br>
+       .long   1                       ## Header Bucket Count<br>
+       .long   1                       ## Header Hash Count<br>
+       .long   20                      ## Header Data Length<br>
+       .long   0                       ## HeaderData Die Offset Base<br>
+       .long   3                       ## HeaderData Atom Count<br>
+       .short  1                       ## DW_ATOM_die_offset<br>
+       .short  6                       ## DW_FORM_data4<br>
+       .short  3                       ## DW_ATOM_die_tag<br>
+       .short  5                       ## DW_FORM_data2<br>
+       .short  4                       ## DW_ATOM_type_flags<br>
+       .short  11                      ## DW_FORM_data1<br>
+       .long   0                       ## Bucket 0<br>
+       .long   193495088               ## Hash in Bucket 0<br>
+       .long   Ltypes0-Ltypes_begin    ## Offset in Bucket 0<br>
+Ltypes0:<br>
+       .long   80                      ## int<br>
+       .long   1                       ## Num DIEs<br>
+       .long   92<br>
+       .short  36<br>
+       .byte   0<br>
+       .long   0<br>
+<br>
+.subsections_via_symbols<br>
+       .section        __DWARF,__debug_line,regular,<wbr>debug<br>
+Lsection_line:<br>
+Lline_table_start0:<br>
<br>
Modified: llvm/trunk/test/tools/llvm-<wbr>dwarfdump/cmdline.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/cmdline.test?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-dwarfdump/cmdline.test?<wbr>rev=314817&r1=314816&r2=<wbr>314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-<wbr>dwarfdump/cmdline.test (original)<br>
+++ llvm/trunk/test/tools/llvm-<wbr>dwarfdump/cmdline.test Tue Oct  3 10:10:21 2017<br>
@@ -8,6 +8,7 @@ HELP: -eh-frame<br>
 HELP: Specific Options<br>
 HELP: -find<br>
 HELP: -ignore-case<br>
+HELP: -lookup=<address><br>
 HELP: -name<br>
 HELP: -recurse-depth=<N><br>
 HELP: -show-children<br>
<br>
Modified: llvm/trunk/tools/llvm-<wbr>dwarfdump/llvm-dwarfdump.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=314817&r1=314816&r2=314817&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>dwarfdump/llvm-dwarfdump.cpp?<wbr>rev=314817&r1=314816&r2=<wbr>314817&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-<wbr>dwarfdump/llvm-dwarfdump.cpp (original)<br>
+++ llvm/trunk/tools/llvm-<wbr>dwarfdump/llvm-dwarfdump.cpp Tue Oct  3 10:10:21 2017<br>
@@ -155,13 +155,17 @@ static list<std::string><br>
               "attribute) matches the exact text in <name>."),<br>
          value_desc("name"), cat(DwarfDumpCategory));<br>
 static alias NameAlias("n", desc("Alias for -name"), aliasopt(Name));<br>
+static opt<uint64_t><br>
+    Lookup("lookup",<br>
+           desc("Lookup <address> in the debug information and print out any"<br>
+                "available file, function, block and line table details."),<br>
+           value_desc("address"), cat(DwarfDumpCategory));<br>
 static opt<std::string><br>
     OutputFilename("out-file", cl::init(""),<br>
-                   cl::desc("Redirect output to the specified file"),<br>
-                   cl::value_desc("filename"));<br>
+                   cl::desc("Redirect output to <filename>"),<br>
+                   cl::value_desc("filename"), cat(DwarfDumpCategory));<br>
 static alias OutputFilenameAlias("o", desc("Alias for -out-file"),<br>
-                                 aliasopt(OutputFilename),<br>
-                                 cat(DwarfDumpCategory));<br>
+                                 aliasopt(OutputFilename));<br>
 static opt<bool><br>
     ShowChildren("show-children",<br>
                  desc("Show a debug info entry's children when selectively "<br>
@@ -277,17 +281,44 @@ static void filterByName(const StringSet<br>
           Die.dump(OS, 0, getDumpOpts());<br>
       }<br>
     }<br>
+<br>
+}<br>
+<br>
+/// Handle the --lookup option and dump the DIEs and line info for the given<br>
+/// address.<br>
+static bool lookup(DWARFContext &DICtx, uint64_t Address, raw_ostream &OS) {<br>
+  auto DIEsForAddr = DICtx.getDIEsForAddress(<wbr>Lookup);<br>
+<br>
+  if (!DIEsForAddr)<br>
+    return false;<br>
+<br>
+  DIDumpOptions DumpOpts = getDumpOpts();<br>
+  DumpOpts.RecurseDepth = 0;<br>
+  DIEsForAddr.CompileUnit->dump(<wbr>OS, DumpOpts);<br>
+  if (DIEsForAddr.FunctionDIE) {<br>
+    DIEsForAddr.FunctionDIE.dump(<wbr>OS, 2, DumpOpts);<br>
+    if (DIEsForAddr.BlockDIE)<br>
+      DIEsForAddr.BlockDIE.dump(OS, 4, DumpOpts);<br>
+  }<br>
+<br>
+  if (DILineInfo LineInfo = DICtx.getLineInfoForAddress(<wbr>Lookup))<br>
+    LineInfo.dump(OS);<br>
+<br>
+  return true;<br>
 }<br>
<br>
 static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx, Twine Filename,<br>
                            raw_ostream &OS) {<br>
   logAllUnhandledErrors(DICtx.<wbr>loadRegisterInfo(Obj), errs(),<br>
                         Filename.str() + ": ");<br>
-<br>
   // The UUID dump already contains all the same information.<br>
   if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All)<br>
     OS << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';<br>
<br>
+  // Handle the --lookup option.<br>
+  if (Lookup)<br>
+    return lookup(DICtx, Lookup, OS);<br>
+<br>
   // Handle the --name option.<br>
   if (!Name.empty()) {<br>
     StringSet<> Names;<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>