[llvm] [DebugInfo][RemoveDIs] Find types hidden in DbgRecords (PR #106547)

Jeremy Morse via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 30 02:51:53 PDT 2024


https://github.com/jmorse updated https://github.com/llvm/llvm-project/pull/106547

>From 7a084b4e4db71377a538363e6a7d73fc1acbbc10 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Thu, 29 Aug 2024 13:28:11 +0100
Subject: [PATCH 1/6] [DebugInfo][RemoveDIs] Find types hidden in DbgRecords
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When serialising to textual IR, there can be constant Values referred to by
DbgRecords that don't appear anywhere else, and have types hidden even
deeper in side them. Enumerate these when enumerating all types.

Test by Mikael Holmén.
---
 llvm/lib/IR/TypeFinder.cpp                    | 11 +++++
 .../DebugInfo/type-finder-w-dbg-records.ll    | 43 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 llvm/test/DebugInfo/type-finder-w-dbg-records.ll

diff --git a/llvm/lib/IR/TypeFinder.cpp b/llvm/lib/IR/TypeFinder.cpp
index 003155a4af4877..d2ffe1ba77b4e3 100644
--- a/llvm/lib/IR/TypeFinder.cpp
+++ b/llvm/lib/IR/TypeFinder.cpp
@@ -88,6 +88,17 @@ void TypeFinder::run(const Module &M, bool onlyNamed) {
         for (const auto &MD : MDForInst)
           incorporateMDNode(MD.second);
         MDForInst.clear();
+
+        // Incorporate types hiding in variable-location information.
+        for (const auto &Dbg : I.getDbgRecordRange()) {
+          // Pick out records that have Values.
+          if (Dbg.getRecordKind() != DbgRecord::Kind::ValueKind)
+            continue;
+          const DbgVariableRecord &DVI = static_cast<const DbgVariableRecord &>(Dbg);
+          for (Value *V : DVI.location_ops()) {
+            incorporateValue(V);
+          }
+        }
       }
   }
 
diff --git a/llvm/test/DebugInfo/type-finder-w-dbg-records.ll b/llvm/test/DebugInfo/type-finder-w-dbg-records.ll
new file mode 100644
index 00000000000000..d2daabc40a3ac3
--- /dev/null
+++ b/llvm/test/DebugInfo/type-finder-w-dbg-records.ll
@@ -0,0 +1,43 @@
+; RUN: opt --passes=verify %s -o - -S | FileCheck %s
+
+;; Test that the type definitions are discovered when serialising to LLVM-IR,
+;; even if they're only present inside a DbgRecord, and thus not normally
+;; visible.
+
+; CHECK: %union.anon = type { %struct.a }
+; CHECK: %struct.a = type { i32 }
+
+; ModuleID = 'bbi-98372.ll'
+source_filename = "bbi-98372.ll"
+
+%union.anon = type { %struct.a }
+%struct.a = type { i32 }
+
+ at d = global [1 x { i16, i16 }] [{ i16, i16 } { i16 0, i16 undef }], align 1
+
+define void @e() {
+entry:
+    #dbg_value(ptr getelementptr inbounds ([1 x %union.anon], ptr @d, i32 0, i32 3), !7, !DIExpression(), !14)
+  ret void, !dbg !15
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2, !3, !4, !5}
+!llvm.ident = !{!6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "foo.c", directory: "/bar")
+!2 = !{i32 7, !"Dwarf Version", i32 4}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{i32 1, !"wchar_size", i32 1}
+!5 = !{i32 7, !"frame-pointer", i32 2}
+!6 = !{!"clang"}
+!7 = !DILocalVariable(name: "f", scope: !8, file: !1, line: 8, type: !12)
+!8 = distinct !DISubprogram(name: "e", scope: !1, file: !1, line: 8, type: !9, scopeLine: 8, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
+!9 = !DISubroutineType(types: !10)
+!10 = !{null}
+!11 = !{!7}
+!12 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 16)
+!13 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
+!14 = !DILocation(line: 0, scope: !8)
+!15 = !DILocation(line: 8, column: 28, scope: !8)

>From 1e5a2cdc7e3b933df6bae0a72305e7472d342dc5 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Thu, 29 Aug 2024 13:40:07 +0100
Subject: [PATCH 2/6] claaannngggg fooorrmmaatttt

---
 llvm/lib/IR/TypeFinder.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/IR/TypeFinder.cpp b/llvm/lib/IR/TypeFinder.cpp
index d2ffe1ba77b4e3..eb5d61e959ef58 100644
--- a/llvm/lib/IR/TypeFinder.cpp
+++ b/llvm/lib/IR/TypeFinder.cpp
@@ -94,7 +94,8 @@ void TypeFinder::run(const Module &M, bool onlyNamed) {
           // Pick out records that have Values.
           if (Dbg.getRecordKind() != DbgRecord::Kind::ValueKind)
             continue;
-          const DbgVariableRecord &DVI = static_cast<const DbgVariableRecord &>(Dbg);
+          const DbgVariableRecord &DVI =
+              static_cast<const DbgVariableRecord &>(Dbg);
           for (Value *V : DVI.location_ops()) {
             incorporateValue(V);
           }

>From 515ab3a707c10b1ef6ac7704c9f5cf4d91d3fae2 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Thu, 29 Aug 2024 14:05:44 +0100
Subject: [PATCH 3/6] Switch to dyn_cast, get Address too

---
 llvm/lib/IR/TypeFinder.cpp | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/IR/TypeFinder.cpp b/llvm/lib/IR/TypeFinder.cpp
index eb5d61e959ef58..ed7b2ab3617ec4 100644
--- a/llvm/lib/IR/TypeFinder.cpp
+++ b/llvm/lib/IR/TypeFinder.cpp
@@ -92,12 +92,11 @@ void TypeFinder::run(const Module &M, bool onlyNamed) {
         // Incorporate types hiding in variable-location information.
         for (const auto &Dbg : I.getDbgRecordRange()) {
           // Pick out records that have Values.
-          if (Dbg.getRecordKind() != DbgRecord::Kind::ValueKind)
-            continue;
-          const DbgVariableRecord &DVI =
-              static_cast<const DbgVariableRecord &>(Dbg);
-          for (Value *V : DVI.location_ops()) {
-            incorporateValue(V);
+          if (const DbgVariableRecord*DVI = dyn_cast<DbgVariableRecord>(&Dbg)) {
+            for (Value *V : DVI->location_ops())
+              incorporateValue(V);
+             if (Value *Addr = DVI->getAddress(); Addr && DVI->isDbgAssign())
+               incorporateValue(Addr);
           }
         }
       }

>From 791ce77e91340b88f92d75ad842da452e0c62d39 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Thu, 29 Aug 2024 14:35:49 +0100
Subject: [PATCH 4/6] Add a #dbg_assign to be enumerated

---
 llvm/test/DebugInfo/type-finder-w-dbg-records.ll | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/llvm/test/DebugInfo/type-finder-w-dbg-records.ll b/llvm/test/DebugInfo/type-finder-w-dbg-records.ll
index d2daabc40a3ac3..8259b4a9f1c3a5 100644
--- a/llvm/test/DebugInfo/type-finder-w-dbg-records.ll
+++ b/llvm/test/DebugInfo/type-finder-w-dbg-records.ll
@@ -6,18 +6,24 @@
 
 ; CHECK: %union.anon = type { %struct.a }
 ; CHECK: %struct.a = type { i32 }
+; CHECK: %union.anon2 = type { %struct.a2 }
+; CHECK: %struct.a2 = type { i32 }
 
 ; ModuleID = 'bbi-98372.ll'
 source_filename = "bbi-98372.ll"
 
 %union.anon = type { %struct.a }
 %struct.a = type { i32 }
+%union.anon2 = type { %struct.a2 }
+%struct.a2 = type { i32 }
 
 @d = global [1 x { i16, i16 }] [{ i16, i16 } { i16 0, i16 undef }], align 1
+ at e = global [1 x { i16, i16 }] [{ i16, i16 } { i16 0, i16 undef }], align 1
 
-define void @e() {
+define void @f() {
 entry:
     #dbg_value(ptr getelementptr inbounds ([1 x %union.anon], ptr @d, i32 0, i32 3), !7, !DIExpression(), !14)
+    #dbg_assign(ptr null, !7, !DIExpression(), !16, ptr getelementptr inbounds ([1 x %union.anon2], ptr @e, i32 0, i32 3), !17, !14)
   ret void, !dbg !15
 }
 
@@ -41,3 +47,5 @@ entry:
 !13 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
 !14 = !DILocation(line: 0, scope: !8)
 !15 = !DILocation(line: 8, column: 28, scope: !8)
+!16 = distinct !DIAssignID()
+!17 = !DIExpression()

>From 90055ba9fca14447cf62261a14e18b14ed08137a Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Thu, 29 Aug 2024 17:46:04 +0100
Subject: [PATCH 5/6] clang-format again

---
 llvm/lib/IR/TypeFinder.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/IR/TypeFinder.cpp b/llvm/lib/IR/TypeFinder.cpp
index ed7b2ab3617ec4..d33b80d6d073cb 100644
--- a/llvm/lib/IR/TypeFinder.cpp
+++ b/llvm/lib/IR/TypeFinder.cpp
@@ -92,11 +92,12 @@ void TypeFinder::run(const Module &M, bool onlyNamed) {
         // Incorporate types hiding in variable-location information.
         for (const auto &Dbg : I.getDbgRecordRange()) {
           // Pick out records that have Values.
-          if (const DbgVariableRecord*DVI = dyn_cast<DbgVariableRecord>(&Dbg)) {
+          if (const DbgVariableRecord *DVI =
+                  dyn_cast<DbgVariableRecord>(&Dbg)) {
             for (Value *V : DVI->location_ops())
               incorporateValue(V);
-             if (Value *Addr = DVI->getAddress(); Addr && DVI->isDbgAssign())
-               incorporateValue(Addr);
+            if (Value *Addr = DVI->getAddress(); Addr && DVI->isDbgAssign())
+              incorporateValue(Addr);
           }
         }
       }

>From 4eaf585ee8531352ed3c6f816be1bbc1a0e9c439 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Fri, 30 Aug 2024 10:51:20 +0100
Subject: [PATCH 6/6] Allow for empty dbg_assign addresses being null

---
 llvm/lib/IR/DebugProgramInstruction.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/IR/DebugProgramInstruction.cpp b/llvm/lib/IR/DebugProgramInstruction.cpp
index 7937e306e7a8ce..f9f3264eab23d5 100644
--- a/llvm/lib/IR/DebugProgramInstruction.cpp
+++ b/llvm/lib/IR/DebugProgramInstruction.cpp
@@ -473,11 +473,12 @@ DbgLabelRecord::createDebugIntrinsic(Module *M,
 
 Value *DbgVariableRecord::getAddress() const {
   auto *MD = getRawAddress();
-  if (auto *V = dyn_cast<ValueAsMetadata>(MD))
+  if (auto *V = dyn_cast_or_null<ValueAsMetadata>(MD))
     return V->getValue();
 
   // When the value goes to null, it gets replaced by an empty MDNode.
-  assert(!cast<MDNode>(MD)->getNumOperands() && "Expected an empty MDNode");
+  assert(!MD || !cast<MDNode>(MD)->getNumOperands() &&
+         "Expected an empty MDNode");
   return nullptr;
 }
 



More information about the llvm-commits mailing list