<div dir="ltr">Should the address size be required/used for parsing the debug_loc.dwo section? I would think there shouldn't be any addresses, or otherwise address-size-dependent there?</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Sep 24, 2018 at 4:21 PM Wolfgang Pieb via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">wolfgangp created this revision.<br>
wolfgangp added a reviewer: dblaikie.<br>
Herald added a subscriber: JDevlieghere.<br>
Herald added a reviewer: alexshap.<br>
<br>
A trivial fix. When creating the DebugLocDWO context, look at the number of DWO compile units.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D52444" rel="noreferrer" target="_blank">https://reviews.llvm.org/D52444</a><br>
<br>
Files:<br>
  lib/DebugInfo/DWARF/DWARFContext.cpp<br>
  test/tools/llvm-dwarfdump/X86/debug_loc_dwo.ll<br>
<br>
<br>
Index: test/tools/llvm-dwarfdump/X86/debug_loc_dwo.ll<br>
===================================================================<br>
--- test/tools/llvm-dwarfdump/X86/debug_loc_dwo.ll<br>
+++ test/tools/llvm-dwarfdump/X86/debug_loc_dwo.ll<br>
@@ -0,0 +1,52 @@<br>
+; RUN: llc -filetype=obj -o %t.o -split-dwarf-file=%t.dwo %s<br>
+; RUN: llvm-objcopy --split-dwo=%t.dwo %t.o<br>
+; RUN: llvm-dwarfdump --debug-loc %t.dwo | FileCheck %s<br>
+<br>
+; Make sure llvm-dwarfdump can display a location list in a split dwarf context<br>
+; (i.e. in the .debug_loc.dwo section).<br>
+;<br>
+; Generated from the following source with <br>
+; clang -emit-llvm -S -O2 -gsplit-dwarf from:<br>
+;<br>
+; void y();<br>
+; void a(int i) {<br>
+;   y();<br>
+;   asm("" : : : "rdi");<br>
+; }<br>
+;<br>
+; CHECK:      .debug_loc.dwo contents:<br>
+; CHECK-NEXT: 0x00000000:<br>
+; CHECK-NEXT: Addr idx 0 (w/ length 6): DW_OP_reg5 RDI<br>
+<br>
+define dso_local void @_Z1ai(i32 %i) local_unnamed_addr !dbg !6 {<br>
+entry:<br>
+  call void @llvm.dbg.value(metadata i32 %i, metadata !11, metadata !DIExpression()), !dbg !12<br>
+  tail call void @_Z1yv(), !dbg !13<br>
+  tail call void asm sideeffect "", "~{rdi},~{dirflag},~{fpsr},~{flags}"(), !dbg !14, !srcloc !15<br>
+  ret void, !dbg !16<br>
+}<br>
+<br>
+declare dso_local void @_Z1yv() local_unnamed_addr<br>
+declare void @llvm.dbg.value(metadata, metadata, metadata)<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!3, !4}<br>
+!llvm.ident = !{!5}<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 8.0.0 (trunk 342698)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: GNU)<br>
+!1 = !DIFile(filename: "a.cpp", directory: "/home/test/Bugzillas/PR38990")<br>
+!2 = !{}<br>
+!3 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!4 = !{i32 1, !"wchar_size", i32 4}<br>
+!5 = !{!"clang version 8.0.0 (trunk 342698)"}<br>
+!6 = distinct !DISubprogram(name: "a", linkageName: "_Z1ai", scope: !1, file: !1, line: 2, type: !7, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !10)<br>
+!7 = !DISubroutineType(types: !8)<br>
+!8 = !{null, !9}<br>
+!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!10 = !{!11}<br>
+!11 = !DILocalVariable(name: "i", arg: 1, scope: !6, file: !1, line: 2, type: !9)<br>
+!12 = !DILocation(line: 2, column: 12, scope: !6)<br>
+!13 = !DILocation(line: 3, column: 3, scope: !6)<br>
+!14 = !DILocation(line: 4, column: 3, scope: !6)<br>
+!15 = !{i32 41}<br>
+!16 = !DILocation(line: 5, column: 1, scope: !6)<br>
Index: lib/DebugInfo/DWARF/DWARFContext.cpp<br>
===================================================================<br>
--- lib/DebugInfo/DWARF/DWARFContext.cpp<br>
+++ lib/DebugInfo/DWARF/DWARFContext.cpp<br>
@@ -692,9 +692,9 @@<br>
<br>
   LocDWO.reset(new DWARFDebugLocDWO());<br>
   // Assume all compile units have the same address byte size.<br>
-  if (getNumCompileUnits()) {<br>
+  if (getNumDWOCompileUnits()) {<br>
     DataExtractor LocData(DObj->getLocDWOSection().Data, isLittleEndian(),<br>
-                          getUnitAtIndex(0)->getAddressByteSize());<br>
+                          getDWOUnitAtIndex(0)->getAddressByteSize());<br>
     LocDWO->parse(LocData);<br>
   }<br>
   return LocDWO.get();<br>
<br>
<br>
</blockquote></div>