<div dir="ltr">Shows how much attention I paid - but this only applies to Split DWARF so far. Do you have plans to generalize this for non-Split DWARF cases? (where it can be valuable for reducing relocations... a bit, at least - though what we really need is a form that supports addrx+offset, though I vaguely started a discussion about what form (har har) that should take & didn't find any great conclusions (the main issue being the mix of lengths to support - addrx{,1,2,3,4} and data{,1,2,3,4} - support all combinations? only support the variable length versions & say to heck with fixed-size records? etc)</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jul 31, 2018 at 10:48 PM Victor Leschuk 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: vleschuk<br>
Date: Tue Jul 31 22:48:06 2018<br>
New Revision: 338487<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=338487&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=338487&view=rev</a><br>
Log:<br>
[DWARF] Basic support for producing DWARFv5 .debug_addr section<br>
<br>
This revision implements support for generating DWARFv5 .debug_addr section.<br>
The implementation is pretty straight-forward: we just check the dwarf version<br>
and emit section header if needed.<br>
<br>
Reviewers: aprantl, dblaikie, probinson<br>
<br>
Reviewed by: dblaikie<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D50005" rel="noreferrer" target="_blank">https://reviews.llvm.org/D50005</a><br>
<br>
<br>
Added:<br>
    llvm/trunk/test/DebugInfo/X86/debug_addr.ll<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp?rev=338487&r1=338486&r2=338487&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp?rev=338487&r1=338486&r2=338487&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp Tue Jul 31 22:48:06 2018<br>
@@ -24,8 +24,26 @@ unsigned AddressPool::getIndex(const MCS<br>
   return IterBool.first->second.Number;<br>
 }<br>
<br>
+<br>
+void AddressPool::emitHeader(AsmPrinter &Asm, MCSection *Section) {<br>
+  static const uint8_t AddrSize = Asm.getDataLayout().getPointerSize();<br>
+  Asm.OutStreamer->SwitchSection(Section);<br>
+<br>
+  uint64_t Length = sizeof(uint16_t) // version<br>
+                  + sizeof(uint8_t)  // address_size<br>
+                  + sizeof(uint8_t)  // segment_selector_size<br>
+                  + AddrSize * Pool.size(); // entries<br>
+  Asm.emitInt32(Length); // TODO: Support DWARF64 format.<br>
+  Asm.emitInt16(Asm.getDwarfVersion());<br>
+  Asm.emitInt8(AddrSize);<br>
+  Asm.emitInt8(0); // TODO: Support non-zero segment_selector_size.<br>
+}<br>
+<br>
 // Emit addresses into the section given.<br>
 void AddressPool::emit(AsmPrinter &Asm, MCSection *AddrSection) {<br>
+  if (Asm.getDwarfVersion() >= 5)<br>
+    emitHeader(Asm, AddrSection);<br>
+<br>
   if (Pool.empty())<br>
     return;<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h?rev=338487&r1=338486&r2=338487&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h?rev=338487&r1=338486&r2=338487&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h Tue Jul 31 22:48:06 2018<br>
@@ -50,6 +50,9 @@ public:<br>
   bool hasBeenUsed() const { return HasBeenUsed; }<br>
<br>
   void resetUsedFlag() { HasBeenUsed = false; }<br>
+<br>
+private:<br>
+  void emitHeader(AsmPrinter &Asm, MCSection *Section);<br>
 };<br>
<br>
 } // end namespace llvm<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=338487&r1=338486&r2=338487&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=338487&r1=338486&r2=338487&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Jul 31 22:48:06 2018<br>
@@ -886,8 +886,7 @@ void DwarfDebug::endModule() {<br>
     emitDebugInfoDWO();<br>
     emitDebugAbbrevDWO();<br>
     emitDebugLineDWO();<br>
-    // Emit DWO addresses.<br>
-    AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());<br>
+    emitDebugAddr();<br>
   }<br>
<br>
   // Emit info into the dwarf accelerator table sections.<br>
@@ -2297,6 +2296,12 @@ void DwarfDebug::emitDebugStrDWO() {<br>
                          OffSec, /* UseRelativeOffsets = */ false);<br>
 }<br>
<br>
+// Emit DWO addresses.<br>
+void DwarfDebug::emitDebugAddr() {<br>
+  assert(useSplitDwarf() && "No split dwarf?");<br>
+  AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());<br>
+}<br>
+<br>
 MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {<br>
   if (!useSplitDwarf())<br>
     return nullptr;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=338487&r1=338486&r2=338487&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=338487&r1=338486&r2=338487&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Jul 31 22:48:06 2018<br>
@@ -447,6 +447,9 @@ class DwarfDebug : public DebugHandlerBa<br>
   /// Emit the debug str dwo section.<br>
   void emitDebugStrDWO();<br>
<br>
+  /// Emit DWO addresses.<br>
+  void emitDebugAddr();<br>
+<br>
   /// Flags to let the linker know we have emitted new style pubnames. Only<br>
   /// emit it here if we don't have a skeleton CU for split dwarf.<br>
   void addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const;<br>
<br>
Added: llvm/trunk/test/DebugInfo/X86/debug_addr.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug_addr.ll?rev=338487&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug_addr.ll?rev=338487&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/DebugInfo/X86/debug_addr.ll (added)<br>
+++ llvm/trunk/test/DebugInfo/X86/debug_addr.ll Tue Jul 31 22:48:06 2018<br>
@@ -0,0 +1,79 @@<br>
+; RUN: llc -split-dwarf-file=test.dwo -dwarf-version=4 %s -mtriple=i386-unknown-linux-gnu -filetype=obj -o - | \<br>
+; RUN: llvm-dwarfdump -v - | FileCheck %s -check-prefix=DWARF4<br>
+<br>
+; RUN: llc -split-dwarf-file=test.dwo -dwarf-version=5 %s -mtriple=i386-unknown-linux-gnu -filetype=obj -o - | \<br>
+; RUN: llvm-dwarfdump -v - | FileCheck %s -check-prefix=DWARF5<br>
+<br>
+; Source:<br>
+; void foo() {<br>
+; }<br>
+;<br>
+; void bar() {<br>
+; }<br>
+<br>
+; DWARF4: .debug_info contents:<br>
+; DWARF4: Compile Unit:{{.*}}version = 0x0004<br>
+; DWARF4-NOT: Compile Unit<br>
+; DWARF4: DW_TAG_compile_unit<br>
+; DWARF4-NOT: DW_TAG_{{.*}}<br>
+; DWARF4: DW_AT_GNU_dwo_name{{.*}}test.dwo<br>
+; DWARF4: DW_AT_GNU_addr_base{{.*}}0x00000000<br>
+; DWARF4: .debug_addr contents:<br>
+; DWARF4-NEXT: 0x00000000: Addr Section: length = 0x00000000, version = 0x0004, addr_size = 0x04, seg_size = 0x00<br>
+; DWARF4-NEXT: Addrs: [<br>
+; DWARF4-NEXT: 0x00000000<br>
+; DWARF4-NEXT: 0x00000010<br>
+; DWARF4-NEXT: ]<br>
+<br>
+; DWARF5: .debug_info contents:<br>
+; DWARF5: Compile Unit:{{.*}}version = 0x0005<br>
+; DWARF5-NOT: Compile Unit<br>
+; DWARF5: DW_TAG_compile_unit<br>
+; DWARF5-NOT: DW_TAG_{{.*}}<br>
+; DWARF5: DW_AT_GNU_dwo_name{{.*}}test.dwo<br>
+; DWARF5: DW_AT_GNU_addr_base{{.*}}0x00000000<br>
+; DWARF5: .debug_addr contents:<br>
+; DWARF5-NEXT: 0x00000000: Addr Section: length = 0x0000000c, version = 0x0005, addr_size = 0x04, seg_size = 0x00<br>
+; DWARF5-NEXT: Addrs: [<br>
+; DWARF5-NEXT: 0x00000000<br>
+; DWARF5-NEXT: 0x00000010<br>
+; DWARF5-NEXT: ]<br>
+<br>
+; ModuleID = './test.c'<br>
+source_filename = "./test.c"<br>
+target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"<br>
+target triple = "i386-unknown-linux-gnu"<br>
+<br>
+; Function Attrs: noinline nounwind optnone<br>
+define void @foo() #0 !dbg !8 {<br>
+entry:<br>
+  ret void, !dbg !12<br>
+}<br>
+<br>
+; Function Attrs: noinline nounwind optnone<br>
+define void @bar() #0 !dbg !13 {<br>
+entry:<br>
+  ret void, !dbg !14<br>
+}<br>
+<br>
+attributes #0 = { noinline nounwind optnone }<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!3, !4, !5, !6}<br>
+!llvm.ident = !{!7}<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.1", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)<br>
+!1 = !DIFile(filename: "test.c", directory: "/tmp")<br>
+!2 = !{}<br>
+!3 = !{i32 1, !"NumRegisterParameters", i32 0}<br>
+!4 = !{i32 2, !"Dwarf Version", i32 5}<br>
+!5 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!6 = !{i32 1, !"wchar_size", i32 4}<br>
+!7 = !{!"clang version 6.0.1"}<br>
+!8 = distinct !DISubprogram(name: "foo", scope: !9, file: !9, line: 1, type: !10, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, unit: !0)<br>
+!9 = !DIFile(filename: "./test.c", directory: "/tmp")<br>
+!10 = !DISubroutineType(types: !11)<br>
+!11 = !{null}<br>
+!12 = !DILocation(line: 2, column: 3, scope: !8)<br>
+!13 = distinct !DISubprogram(name: "bar", scope: !9, file: !9, line: 5, type: !10, isLocal: false, isDefinition: true, scopeLine: 5, isOptimized: false, unit: !0)<br>
+!14 = !DILocation(line: 6, column: 3, scope: !13)<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>