<div dir="ltr">Could you add a test case for this? (llvm-dwarfdump run on an object file (either check in the source and the object file, or check in assembly code that is run through llvm-mc) - there are examples of llvm-dwarfdump tests in test/tools/llvm-dwarfdump)</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 5, 2018 at 3:30 PM Fangrui Song via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: maskray<br>
Date: Mon Nov  5 15:27:53 2018<br>
New Revision: 346181<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=346181&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=346181&view=rev</a><br>
Log:<br>
[DWARF] Support types CU list in .gdb_index dumping<br>
<br>
Some executables have non-empty types CU list and -gdb-index would report "<error reporting>" before.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h<br>
    llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h?rev=346181&r1=346180&r2=346181&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h?rev=346181&r1=346180&r2=346181&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h (original)<br>
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFGdbIndex.h Mon Nov  5 15:27:53 2018<br>
@@ -24,6 +24,7 @@ class DWARFGdbIndex {<br>
   uint32_t Version;<br>
<br>
   uint32_t CuListOffset;<br>
+  uint32_t TuListOffset;<br>
   uint32_t AddressAreaOffset;<br>
   uint32_t SymbolTableOffset;<br>
   uint32_t ConstantPoolOffset;<br>
@@ -34,6 +35,13 @@ class DWARFGdbIndex {<br>
   };<br>
   SmallVector<CompUnitEntry, 0> CuList;<br>
<br>
+  struct TypeUnitEntry {<br>
+    uint64_t Offset;<br>
+    uint64_t TypeOffset;<br>
+    uint64_t TypeSignature;<br>
+  };<br>
+  SmallVector<TypeUnitEntry, 0> TuList;<br>
+<br>
   struct AddressEntry {<br>
     uint64_t LowAddress;  /// The low address.<br>
     uint64_t HighAddress; /// The high address.<br>
@@ -55,6 +63,7 @@ class DWARFGdbIndex {<br>
   uint32_t StringPoolOffset;<br>
<br>
   void dumpCUList(raw_ostream &OS) const;<br>
+  void dumpTUList(raw_ostream &OS) const;<br>
   void dumpAddressArea(raw_ostream &OS) const;<br>
   void dumpSymbolTable(raw_ostream &OS) const;<br>
   void dumpConstantPool(raw_ostream &OS) const;<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp?rev=346181&r1=346180&r2=346181&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp?rev=346181&r1=346180&r2=346181&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp Mon Nov  5 15:27:53 2018<br>
@@ -11,6 +11,7 @@<br>
 #include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/Format.h"<br>
+#include "llvm/Support/FormatVariadic.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
 #include <algorithm><br>
 #include <cassert><br>
@@ -33,6 +34,16 @@ void DWARFGdbIndex::dumpCUList(raw_ostre<br>
                  CU.Length);<br>
 }<br>
<br>
+void DWARFGdbIndex::dumpTUList(raw_ostream &OS) const {<br>
+  OS << formatv("\n  Types CU list offset = {0:x}, has {1} entries:\n",<br>
+                TuListOffset, TuList.size());<br>
+  uint32_t I = 0;<br>
+  for (const TypeUnitEntry &TU : TuList)<br>
+    OS << formatv("    {0}: offset = {1:x8}, type_offset = {2:x8}, "<br>
+                  "type_signature = {3:x16}\n",<br>
+                  I++, TU.Offset, TU.TypeOffset, TU.TypeSignature);<br>
+}<br>
+<br>
 void DWARFGdbIndex::dumpAddressArea(raw_ostream &OS) const {<br>
   OS << format("\n  Address area offset = 0x%x, has %" PRId64 " entries:",<br>
                AddressAreaOffset, (uint64_t)AddressArea.size())<br>
@@ -94,6 +105,7 @@ void DWARFGdbIndex::dump(raw_ostream &OS<br>
   if (HasContent) {<br>
     OS << "  Version = " << Version << '\n';<br>
     dumpCUList(OS);<br>
+    dumpTUList(OS);<br>
     dumpAddressArea(OS);<br>
     dumpSymbolTable(OS);<br>
     dumpConstantPool(OS);<br>
@@ -127,9 +139,14 @@ bool DWARFGdbIndex::parseImpl(DataExtrac<br>
<br>
   // CU Types are no longer needed as DWARF skeleton type units never made it<br>
   // into the standard.<br>
-  uint32_t CuTypesListSize = (AddressAreaOffset - CuTypesOffset) / 24;<br>
-  if (CuTypesListSize != 0)<br>
-    return false;<br>
+  uint32_t TuListSize = (AddressAreaOffset - CuTypesOffset) / 24;<br>
+  TuList.resize(TuListSize);<br>
+  for (uint32_t I = 0; I < TuListSize; ++I) {<br>
+    uint64_t CuOffset = Data.getU64(&Offset);<br>
+    uint64_t TypeOffset = Data.getU64(&Offset);<br>
+    uint64_t Signature = Data.getU64(&Offset);<br>
+    TuList[I] = {CuOffset, TypeOffset, Signature};<br>
+  }<br>
<br>
   uint32_t AddressAreaSize = (SymbolTableOffset - AddressAreaOffset) / 20;<br>
   AddressArea.reserve(AddressAreaSize);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>