[llvm] r218245 - Allow DWARFDebugInfoEntryMinimal::getSubroutineName to resolve cross-unit references.

Frederic Riss friss at apple.com
Mon Sep 22 05:35:54 PDT 2014


Author: friss
Date: Mon Sep 22 07:35:53 2014
New Revision: 218245

URL: http://llvm.org/viewvc/llvm-project?rev=218245&view=rev
Log:
Allow DWARFDebugInfoEntryMinimal::getSubroutineName to resolve cross-unit references.

Summary: getSubroutineName is currently only used by llvm-symbolizer, thus add a binary test containing a cross-cu inlining example.

Reviewers: samsonov, dblaikie

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D5394

Added:
    llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.c
    llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.x86_64-macho.o
Modified:
    llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp
    llvm/trunk/test/DebugInfo/llvm-symbolizer.test

Modified: llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp?rev=218245&r1=218244&r2=218245&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp Mon Sep 22 07:35:53 2014
@@ -20,6 +20,17 @@ using namespace llvm;
 using namespace dwarf;
 typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
 
+// Small helper to extract a DIE pointed by a reference
+// attribute. It looks up the Unit containing the DIE and calls
+// DIE.extractFast with the right unit. Returns new unit on success,
+// nullptr otherwise.
+static const DWARFUnit *findUnitAndExtractFast(DWARFDebugInfoEntryMinimal &DIE,
+                                               const DWARFUnit *Unit,
+                                               uint32_t *Offset) {
+  Unit = Unit->getUnitSection().getUnitForOffset(*Offset);
+  return (Unit && DIE.extractFast(Unit, Offset)) ? Unit : nullptr;
+}
+
 void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, const DWARFUnit *u,
                                       unsigned recurseDepth,
                                       unsigned indent) const {
@@ -315,8 +326,8 @@ DWARFDebugInfoEntryMinimal::getSubroutin
       getAttributeValueAsReference(U, DW_AT_specification, -1U);
   if (spec_ref != -1U) {
     DWARFDebugInfoEntryMinimal spec_die;
-    if (spec_die.extractFast(U, &spec_ref)) {
-      if (const char *name = spec_die.getSubroutineName(U, Kind))
+    if (const DWARFUnit *RefU = findUnitAndExtractFast(spec_die, U, &spec_ref)) {
+      if (const char *name = spec_die.getSubroutineName(RefU, Kind))
         return name;
     }
   }
@@ -325,8 +336,9 @@ DWARFDebugInfoEntryMinimal::getSubroutin
       getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
   if (abs_origin_ref != -1U) {
     DWARFDebugInfoEntryMinimal abs_origin_die;
-    if (abs_origin_die.extractFast(U, &abs_origin_ref)) {
-      if (const char *name = abs_origin_die.getSubroutineName(U, Kind))
+    if (const DWARFUnit *RefU = findUnitAndExtractFast(abs_origin_die, U,
+                                                       &abs_origin_ref)) {
+      if (const char *name = abs_origin_die.getSubroutineName(RefU, Kind))
         return name;
     }
   }

Added: llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.c
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.c?rev=218245&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.c (added)
+++ llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.c Mon Sep 22 07:35:53 2014
@@ -0,0 +1,18 @@
+// To generate the test file:
+// clang cross-cu-inlining.c -DA_C -g -emit-llvm -S -o a.ll
+// clang cross-cu-inlining.c -DB_C -g -emit-llvm -S -o b.ll
+// llvm-link a.ll b.ll -o ab.bc
+// opt -inline ab.bc -o cross-cu-inlining.bc
+// clang -c cross-cu-inlining.bc -o cross-cu-inlining.o
+#ifdef A_C
+int i;
+int func(int);
+int main() {
+  return func(i);
+}
+#endif
+#ifdef B_C
+int __attribute__((always_inline)) func(int x) {
+  return x * 2;
+}
+#endif

Added: llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.x86_64-macho.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.x86_64-macho.o?rev=218245&view=auto
==============================================================================
Binary files llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.x86_64-macho.o (added) and llvm/trunk/test/DebugInfo/Inputs/cross-cu-inlining.x86_64-macho.o Mon Sep 22 07:35:53 2014 differ

Modified: llvm/trunk/test/DebugInfo/llvm-symbolizer.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/llvm-symbolizer.test?rev=218245&r1=218244&r2=218245&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/llvm-symbolizer.test (original)
+++ llvm/trunk/test/DebugInfo/llvm-symbolizer.test Mon Sep 22 07:35:53 2014
@@ -22,6 +22,7 @@ RUN: echo "%p/Inputs/arange-overlap.elf-
 RUN: cp %p/Inputs/split-dwarf-test.dwo %T
 RUN: echo "%p/Inputs/split-dwarf-test 0x4004d0" >> %t.input
 RUN: echo "%p/Inputs/split-dwarf-test 0x4004c0" >> %t.input
+RUN: echo "%p/Inputs/cross-cu-inlining.x86_64-macho.o 0x17" >> %t.input
 
 RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
 RUN:    --default-arch=i386 < %t.input | FileCheck %s
@@ -111,6 +112,13 @@ CHECK-NEXT: {{.*}}split-dwarf-test.cc
 CHECK: _Z3fooi
 CHECK-NEXT: {{.*}}split-dwarf-test.cc
 
+; func has been inlined into main by LTO. Check that the symbolizer is able
+; to resolve the cross-cu reference and retrieve func's name
+CHECK: func
+CHECK-NEXT: /tmp{{[/\\]}}cross-cu-inlining.c:16:3
+CHECK-NEXT: main
+CHECK-NEXT: /tmp{{[/\\]}}cross-cu-inlining.c:11:0
+
 RUN: echo "unexisting-file 0x1234" > %t.input2
 RUN: llvm-symbolizer < %t.input2
 





More information about the llvm-commits mailing list