[clang] d8a1a55 - DebugInfo: Disable ctor homing for types with only deleted (non copy/move) ctors
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 27 17:25:30 PST 2023
Author: David Blaikie
Date: 2023-02-28T01:25:22Z
New Revision: d8a1a559f3009a31c517f864156db91d2ae3012c
URL: https://github.com/llvm/llvm-project/commit/d8a1a559f3009a31c517f864156db91d2ae3012c
DIFF: https://github.com/llvm/llvm-project/commit/d8a1a559f3009a31c517f864156db91d2ae3012c.diff
LOG: DebugInfo: Disable ctor homing for types with only deleted (non copy/move) ctors
Such a type is never going to have a ctor home, and may be used for type
punning or other ways of creating objects.
May be a more generally acceptable solution in some cases compared to
attributing with [[clang::standalone_debug]].
Differential Revision: https://reviews.llvm.org/D144931
Added:
Modified:
clang/lib/CodeGen/CGDebugInfo.cpp
clang/test/CodeGenCXX/debug-info-limited-ctor.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 4dab595ada76b..126b239042ee1 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2489,9 +2489,18 @@ static bool canUseCtorHoming(const CXXRecordDecl *RD) {
if (isClassOrMethodDLLImport(RD))
return false;
- return !RD->isLambda() && !RD->isAggregate() &&
- !RD->hasTrivialDefaultConstructor() &&
- !RD->hasConstexprNonCopyMoveConstructor();
+ if (RD->isLambda() || RD->isAggregate() ||
+ RD->hasTrivialDefaultConstructor() ||
+ RD->hasConstexprNonCopyMoveConstructor())
+ return false;
+
+ for (const CXXConstructorDecl *Ctor : RD->ctors()) {
+ if (Ctor->isCopyOrMoveConstructor())
+ continue;
+ if (!Ctor->isDeleted())
+ return true;
+ }
+ return false;
}
static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind,
diff --git a/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp b/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp
index ac53cace075cd..18adfdeed0480 100644
--- a/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp
+++ b/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp
@@ -68,6 +68,21 @@ class K {
};
void f(K k) {}
+// CHECK-DAG: !DICompositeType({{.*}}name: "DeletedCtors",{{.*}}DIFlagTypePassBy
+struct NonTrivial {
+ NonTrivial();
+};
+struct DeletedCtors {
+ DeletedCtors() = delete;
+ DeletedCtors(const DeletedCtors &) = default;
+ void f1();
+ NonTrivial t;
+};
+
+const NonTrivial &f(const DeletedCtors &D) {
+ return D.t;
+}
+
// Test that we don't use constructor homing on lambdas.
// CHECK-DAG: ![[L:.*]] ={{.*}}!DISubprogram({{.*}}name: "L"
// CHECK-DAG: !DICompositeType({{.*}}scope: ![[L]], {{.*}}DIFlagTypePassByValue
@@ -89,3 +104,4 @@ VTableAndCtor::VTableAndCtor() {
}
// ITANIUM-DAG: !DICompositeType({{.*}}name: "VTableAndCtor", {{.*}}flags: DIFlagFwdDecl
+
More information about the cfe-commits
mailing list