[PATCH] D77436: [DebugInfo] Fix for adding "returns cxx udt" option to functions in CodeView.

Amy Huang via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 3 16:17:06 PDT 2020


akhuang created this revision.
akhuang added reviewers: rnk, dblaikie, aprantl.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This change adds DIFlagNonTrivial to forward declarations of
DICompositeType. It adds the flag to nontrivial types and types with
unknown triviality.

It fixes adding the "CxxReturnUdt" flag to functions inconsistently,
since it is added based on whether the return type is marked NonTrivial, and
that changes if the return type was a forward declaration.

continues the discussion at https://reviews.llvm.org/D75215

Bug: https://bugs.llvm.org/show_bug.cgi?id=44785


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D77436

Files:
  clang/lib/CodeGen/CGDebugInfo.cpp
  clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp


Index: clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -emit-llvm -gcodeview -debug-info-kind=limited -x c %s -o - | FileCheck %s --check-prefix CHECK-C
+// RUN: %clang_cc1 -emit-llvm -gcodeview -debug-info-kind=limited -x c++ %s -o - | FileCheck %s --check-prefix CHECK-CXX
+//
+// Test for DIFlagNonTrivial on forward declared DICompositeTypes.
+
+struct Incomplete;
+struct Incomplete (*func_ptr)() = 0;
+// CHECK-C: !DICompositeType({{.*}}name: "Incomplete"
+// CHECK-C-NOT: DIFlagNonTrivial
+// CHECK-CXX: !DICompositeType({{.*}}name: "Incomplete"
+// CHECK-CXX-SAME: DIFlagNonTrivial
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -991,11 +991,21 @@
   uint64_t Size = 0;
   uint32_t Align = 0;
 
+  llvm::DINode::DIFlags Flags = llvm::DINode::FlagFwdDecl;
+
+  // Add flag to nontrivial forward declarations. To be consistent with MSVC,
+  // add the flag if a record has no definition because we don't know whether
+  // it will be trivial or not.
+  if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
+    if (!CXXRD->hasDefinition() ||
+        (CXXRD->hasDefinition() && !CXXRD->isTrivial()))
+      Flags |= llvm::DINode::FlagNonTrivial;
+
   // Create the type.
   SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
   llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType(
-      getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align,
-      llvm::DINode::FlagFwdDecl, Identifier);
+      getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, Flags,
+      Identifier);
   if (CGM.getCodeGenOpts().DebugFwdTemplateParams)
     if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
       DBuilder.replaceArrays(RetTy, llvm::DINodeArray(),


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77436.254939.patch
Type: text/x-patch
Size: 2080 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200403/68835448/attachment.bin>


More information about the cfe-commits mailing list