-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[clang][PCH] Don't try to create standalone debug-info for types marked nodebug #123253
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang][PCH] Don't try to create standalone debug-info for types marked nodebug #123253
Conversation
…ed nodebug Fixes one of the crashes uncovered by llvm#118710 `getOrCreateStandaloneType` asserts that a `DIType` was created for the requested type. If the `Decl` was marked `nodebug`, however, we can't generate debug-info for it, so we would previously trigger the assert. For now keep the assertion around and check the `nodebug` at the callsite.
@llvm/pr-subscribers-clang-modules @llvm/pr-subscribers-clang Author: Michael Buch (Michael137) ChangesFixes one of the crashes uncovered by
Full diff: https://github.com/llvm/llvm-project/pull/123253.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
index 5447b98d7105e0..02635ce235a12b 100644
--- a/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
+++ b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
@@ -81,6 +81,9 @@ class PCHContainerGenerator : public ASTConsumer {
if (!TD->isCompleteDefinition())
return true;
+ if (D->hasAttr<NoDebugAttr>())
+ return true;
+
QualType QualTy = Ctx.getTypeDeclType(D);
if (!QualTy.isNull() && CanRepresent(QualTy.getTypePtr()))
DI.getOrCreateStandaloneType(QualTy, D->getLocation());
diff --git a/clang/test/Modules/gmodules-nodebug.cpp b/clang/test/Modules/gmodules-nodebug.cpp
new file mode 100644
index 00000000000000..ac987c074f18c9
--- /dev/null
+++ b/clang/test/Modules/gmodules-nodebug.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++23 -x c++-header -emit-pch -fmodule-format=obj \
+// RUN: -o %t.pch %s \
+// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll
+// RUN: cat %t-pch.ll | FileCheck %s
+
+template<class...>
+using __void_t [[gnu::nodebug]] = void;
+
+__void_t<> func() {}
+
+// CHECK: !DICompileUnit
+// CHECK-NOT: __void_t
|
@llvm/pr-subscribers-clang-codegen Author: Michael Buch (Michael137) ChangesFixes one of the crashes uncovered by
Full diff: https://github.com/llvm/llvm-project/pull/123253.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
index 5447b98d7105e0..02635ce235a12b 100644
--- a/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
+++ b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp
@@ -81,6 +81,9 @@ class PCHContainerGenerator : public ASTConsumer {
if (!TD->isCompleteDefinition())
return true;
+ if (D->hasAttr<NoDebugAttr>())
+ return true;
+
QualType QualTy = Ctx.getTypeDeclType(D);
if (!QualTy.isNull() && CanRepresent(QualTy.getTypePtr()))
DI.getOrCreateStandaloneType(QualTy, D->getLocation());
diff --git a/clang/test/Modules/gmodules-nodebug.cpp b/clang/test/Modules/gmodules-nodebug.cpp
new file mode 100644
index 00000000000000..ac987c074f18c9
--- /dev/null
+++ b/clang/test/Modules/gmodules-nodebug.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++23 -x c++-header -emit-pch -fmodule-format=obj \
+// RUN: -o %t.pch %s \
+// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll
+// RUN: cat %t-pch.ll | FileCheck %s
+
+template<class...>
+using __void_t [[gnu::nodebug]] = void;
+
+__void_t<> func() {}
+
+// CHECK: !DICompileUnit
+// CHECK-NOT: __void_t
|
// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll | ||
// RUN: cat %t-pch.ll | FileCheck %s | ||
|
||
template<class...> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just used exactly the template alias that was crashing in the libc++ case. I suppose it doesn't actually have to be a template
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That looks very correct :-)
// RUN: -o %t.pch %s \ | ||
// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll | ||
// RUN: cat %t-pch.ll | FileCheck %s | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't forget the REQUIRE: assertions! (because of -debug-only)
…ed nodebug (llvm#123253) Fixes one of the crashes uncovered by llvm#118710 `getOrCreateStandaloneType` asserts that a `DIType` was created for the requested type. If the `Decl` was marked `nodebug`, however, we can't generate debug-info for it, so we would previously trigger the assert. For now keep the assertion around and check the `nodebug` at the callsite. (cherry picked from commit 30e276d)
…ed nodebug (llvm#123253) Fixes one of the crashes uncovered by llvm#118710 `getOrCreateStandaloneType` asserts that a `DIType` was created for the requested type. If the `Decl` was marked `nodebug`, however, we can't generate debug-info for it, so we would previously trigger the assert. For now keep the assertion around and check the `nodebug` at the callsite. (cherry picked from commit 30e276d)
🍒[clang][PCH] Don't try to create standalone debug-info for types marked nodebug (llvm#123253)
Fixes one of the crashes uncovered by
#118710
getOrCreateStandaloneType
asserts that aDIType
was created for the requested type. If theDecl
was markednodebug
, however, we can't generate debug-info for it, so we would previously trigger the assert. For now keep the assertion around and check thenodebug
at the callsite.