https://github.com/ykhatav created 
https://github.com/llvm/llvm-project/pull/137818

…ebug-types

>From 0c5885d927031f5b8f1b650badb237154d3cb878 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatav...@intel.com>
Date: Tue, 29 Apr 2025 07:19:31 -0700
Subject: [PATCH] fix emiision of nested unused enum types with
 -fno-eliminate-unused-debug-types

---
 clang/lib/CodeGen/CGDebugInfo.cpp          | 10 +++++++++
 clang/lib/CodeGen/CGDebugInfo.h            |  2 ++
 clang/test/CodeGen/unused_nested_enump.cpp | 26 ++++++++++++++++++++++
 3 files changed, 38 insertions(+)
 create mode 100644 clang/test/CodeGen/unused_nested_enump.cpp

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp 
b/clang/lib/CodeGen/CGDebugInfo.cpp
index f3ec498d4064b..7840b09776be4 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1901,6 +1901,14 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, 
llvm::DIType *RecordTy,
   return GV;
 }
 
+void CGDebugInfo::CollectRecordEnumType(
+    const EnumDecl *ED, SmallVectorImpl<llvm::Metadata *> &elements) {
+  QualType Ty = CGM.getContext().getTypeDeclType(ED);
+  SourceLocation Loc = ED->getLocation();
+  if (llvm::DIType *enumType = getOrCreateType(Ty, getOrCreateFile(Loc)))
+    elements.push_back(enumType);
+}
+
 void CGDebugInfo::CollectRecordNormalField(
     const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit,
     SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy,
@@ -1987,6 +1995,8 @@ void CGDebugInfo::CollectRecordFields(
 
         // Bump field number for next field.
         ++fieldNo;
+      } else if (const auto *enumType = dyn_cast<EnumDecl>(I)) {
+        CollectRecordEnumType(enumType, elements);
       } else if (CGM.getCodeGenOpts().EmitCodeView) {
         // Debug info for nested types is included in the member list only for
         // CodeView.
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index b287ce7b92eee..baf2069745535 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -370,6 +370,8 @@ class CGDebugInfo {
   llvm::DIDerivedType *CreateRecordStaticField(const VarDecl *Var,
                                                llvm::DIType *RecordTy,
                                                const RecordDecl *RD);
+  void CollectRecordEnumType(const EnumDecl *ED,
+                             SmallVectorImpl<llvm::Metadata *> &elements);
   void CollectRecordNormalField(const FieldDecl *Field, uint64_t OffsetInBits,
                                 llvm::DIFile *F,
                                 SmallVectorImpl<llvm::Metadata *> &E,
diff --git a/clang/test/CodeGen/unused_nested_enump.cpp 
b/clang/test/CodeGen/unused_nested_enump.cpp
new file mode 100644
index 0000000000000..1e7b39dbb7b1c
--- /dev/null
+++ b/clang/test/CodeGen/unused_nested_enump.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -debug-info-kind=unused-types  -emit-llvm -o - %s | 
FileCheck %s
+
+struct Type {
+    enum { Unused };
+    int value = 0;
+};
+int main() {
+    Type t;
+    return t.value;
+}
+
+// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type
+// CHECK-SAME: scope: ![[STRUCT:[0-9]+]]
+// CHECK-SAME: elements: ![[ELEMENTS:[0-9]+]]
+
+// CHECK: ![[STRUCT]] = distinct !DICompositeType(tag: DW_TAG_structure_type
+// CHECK-SAME: elements: ![[STRUCT_ELEMENTS:[0-9]+]]
+
+// CHECK: ![[STRUCT_ELEMENTS]] = !{![[ENUM_MEMBER:[0-9]+]], 
![[VALUE_MEMBER:[0-9]+]]}
+
+// CHECK: ![[VALUE_MEMBER]] = !DIDerivedType(tag: DW_TAG_member
+// CHECK-SAME: name: "value"
+// CHECK-SAME: scope: ![[STRUCT]]
+
+// CHECK: ![[ELEMENTS]] = !{![[ENUMERATOR:[0-9]+]]}
+// CHECK: ![[ENUMERATOR]] = !DIEnumerator(name: "Unused", value: 0

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to