[PATCH] D89286: [DebugInfo] Check for templated static data member when adding constant to record static fields

Amy Huang via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 14 14:41:41 PDT 2020


akhuang updated this revision to Diff 298243.
akhuang added a comment.

update test case and add check for dependent values


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D89286/new/

https://reviews.llvm.org/D89286

Files:
  clang/lib/CodeGen/CGDebugInfo.cpp
  clang/test/CodeGenCXX/debug-info-static-member.cpp


Index: clang/test/CodeGenCXX/debug-info-static-member.cpp
===================================================================
--- clang/test/CodeGenCXX/debug-info-static-member.cpp
+++ clang/test/CodeGenCXX/debug-info-static-member.cpp
@@ -1,6 +1,7 @@
 // RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck %s
 // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck %s
 // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck %s
+// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++17 %s -emit-llvm -S -o - | FileCheck %s --check-prefix=CXX17
 // RUN: %clang_cc1 -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited %s -emit-llvm -o - | FileCheck --check-prefix MSVC %s
 // PR14471
 
@@ -45,6 +46,9 @@
 // CHECK-NOT:              DIFlagFwdDecl
 // CHECK-SAME:             ){{$}}
 // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var"
+// CHECK-SAME:           extraData: i32 7
+// CXX17: !DIDerivedType(tag: DW_TAG_member, name: "static_constexpr_decl_templ_var"
+// CXX17-SAME:           extraData: i32 8
 
 int C::a = 4;
 // CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression())
@@ -133,6 +137,9 @@
 template<typename T>
 struct static_decl_templ {
   static const int static_decl_templ_var = 7;
+#if __cplusplus >= 201703L
+  static constexpr int static_constexpr_decl_templ_var = 8;
+#endif
 };
 
 template<typename T>
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1415,14 +1415,22 @@
   unsigned LineNumber = getLineNumber(Var->getLocation());
   StringRef VName = Var->getName();
   llvm::Constant *C = nullptr;
-  if (Var->getInit()) {
-    const APValue *Value = Var->evaluateValue();
-    if (Value) {
-      if (Value->isInt())
-        C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt());
-      if (Value->isFloat())
-        C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat());
-    }
+  APValue *Value = nullptr;
+  if (Var->getInit())
+    Value = Var->evaluateValue();
+  else if (auto *TemplateDecl = Var->getInstantiatedFromStaticDataMember()) {
+    // Inline static data members might not have an initialization.
+    // FIXME: Still doesn't get a value if the initialization is dependent.
+    auto *TemplateInit = TemplateDecl->getInit();
+    if (TemplateInit && !TemplateInit->isValueDependent())
+      Value = TemplateDecl->evaluateValue();
+  }
+
+  if (Value) {
+    if (Value->isInt())
+      C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt());
+    if (Value->isFloat())
+      C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat());
   }
 
   llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89286.298243.patch
Type: text/x-patch
Size: 2919 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201014/f1bbe5f1/attachment-0001.bin>


More information about the cfe-commits mailing list