-
Notifications
You must be signed in to change notification settings - Fork 12k
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] Extend EmitPseudoVariable to support debug records #94956
Conversation
CGDebugInfo::EmitPseudoVariable currently uses detailed logic to exactly collect llvm.dbg.declare users of an alloca. This patch replaces this with an LLVM function for finding debug declares intrinsics and also adds the same for debug records, simplifying the code and adding record support.
@llvm/pr-subscribers-clang-codegen Author: Stephen Tozer (SLTozer) ChangesCGDebugInfo::EmitPseudoVariable currently uses detailed logic to exactly collect llvm.dbg.declare users of an alloca. This patch replaces this with an LLVM function for finding debug declares intrinsics and also adds the same for debug records, simplifying the code and adding record support. No tests added in this commit because it is NFC for intrinsics, and there is no way to make clang emit records directly yet - one of the existing tests however will switch to covering debug records once #89799 relands. Full diff: https://github.com/llvm/llvm-project/pull/94956.diff 1 Files Affected:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 681a475f9e4be..d5676be0e8742 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -5766,28 +5766,16 @@ void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder,
// it is loaded upon use, so we identify such pattern here.
if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) {
llvm::Value *Var = Load->getPointerOperand();
- if (llvm::Metadata *MDValue = llvm::ValueAsMetadata::getIfExists(Var)) {
- if (llvm::Value *DbgValue = llvm::MetadataAsValue::getIfExists(
- CGM.getLLVMContext(), MDValue)) {
- for (llvm::User *U : DbgValue->users()) {
- if (llvm::CallInst *DbgDeclare = dyn_cast<llvm::CallInst>(U)) {
- if (DbgDeclare->getCalledFunction()->getIntrinsicID() ==
- llvm::Intrinsic::dbg_declare &&
- DbgDeclare->getArgOperand(0) == DbgValue) {
- // There can be implicit type cast applied on a variable if it is
- // an opaque ptr, in this case its debug info may not match the
- // actual type of object being used as in the next instruction, so
- // we will need to emit a pseudo variable for type-casted value.
- llvm::DILocalVariable *MDNode = cast<llvm::DILocalVariable>(
- cast<llvm::MetadataAsValue>(DbgDeclare->getOperand(1))
- ->getMetadata());
- if (MDNode->getType() == Type)
- return;
- }
- }
- }
- }
- }
+ // There can be implicit type cast applied on a variable if it is an opaque
+ // ptr, in this case its debug info may not match the actual type of object
+ // being used as in the next instruction, so we will need to emit a pseudo
+ // variable for type-casted value.
+ auto DeclareTypeMatches = [&](auto *DbgDeclare) {
+ return DbgDeclare->getVariable()->getType() == Type;
+ };
+ if (any_of(llvm::findDbgDeclares(Var), DeclareMatches) ||
+ any_of(llvm::findDVRDeclares(Var), DeclareMatches))
+ return;
}
// Find the correct location to insert a sequence of instructions to
|
@llvm/pr-subscribers-debuginfo Author: Stephen Tozer (SLTozer) ChangesCGDebugInfo::EmitPseudoVariable currently uses detailed logic to exactly collect llvm.dbg.declare users of an alloca. This patch replaces this with an LLVM function for finding debug declares intrinsics and also adds the same for debug records, simplifying the code and adding record support. No tests added in this commit because it is NFC for intrinsics, and there is no way to make clang emit records directly yet - one of the existing tests however will switch to covering debug records once #89799 relands. Full diff: https://github.com/llvm/llvm-project/pull/94956.diff 1 Files Affected:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 681a475f9e4be..d5676be0e8742 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -5766,28 +5766,16 @@ void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder,
// it is loaded upon use, so we identify such pattern here.
if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) {
llvm::Value *Var = Load->getPointerOperand();
- if (llvm::Metadata *MDValue = llvm::ValueAsMetadata::getIfExists(Var)) {
- if (llvm::Value *DbgValue = llvm::MetadataAsValue::getIfExists(
- CGM.getLLVMContext(), MDValue)) {
- for (llvm::User *U : DbgValue->users()) {
- if (llvm::CallInst *DbgDeclare = dyn_cast<llvm::CallInst>(U)) {
- if (DbgDeclare->getCalledFunction()->getIntrinsicID() ==
- llvm::Intrinsic::dbg_declare &&
- DbgDeclare->getArgOperand(0) == DbgValue) {
- // There can be implicit type cast applied on a variable if it is
- // an opaque ptr, in this case its debug info may not match the
- // actual type of object being used as in the next instruction, so
- // we will need to emit a pseudo variable for type-casted value.
- llvm::DILocalVariable *MDNode = cast<llvm::DILocalVariable>(
- cast<llvm::MetadataAsValue>(DbgDeclare->getOperand(1))
- ->getMetadata());
- if (MDNode->getType() == Type)
- return;
- }
- }
- }
- }
- }
+ // There can be implicit type cast applied on a variable if it is an opaque
+ // ptr, in this case its debug info may not match the actual type of object
+ // being used as in the next instruction, so we will need to emit a pseudo
+ // variable for type-casted value.
+ auto DeclareTypeMatches = [&](auto *DbgDeclare) {
+ return DbgDeclare->getVariable()->getType() == Type;
+ };
+ if (any_of(llvm::findDbgDeclares(Var), DeclareMatches) ||
+ any_of(llvm::findDVRDeclares(Var), DeclareMatches))
+ return;
}
// Find the correct location to insert a sequence of instructions to
|
@llvm/pr-subscribers-clang Author: Stephen Tozer (SLTozer) ChangesCGDebugInfo::EmitPseudoVariable currently uses detailed logic to exactly collect llvm.dbg.declare users of an alloca. This patch replaces this with an LLVM function for finding debug declares intrinsics and also adds the same for debug records, simplifying the code and adding record support. No tests added in this commit because it is NFC for intrinsics, and there is no way to make clang emit records directly yet - one of the existing tests however will switch to covering debug records once #89799 relands. Full diff: https://github.com/llvm/llvm-project/pull/94956.diff 1 Files Affected:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 681a475f9e4be..d5676be0e8742 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -5766,28 +5766,16 @@ void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder,
// it is loaded upon use, so we identify such pattern here.
if (llvm::LoadInst *Load = dyn_cast<llvm::LoadInst>(Value)) {
llvm::Value *Var = Load->getPointerOperand();
- if (llvm::Metadata *MDValue = llvm::ValueAsMetadata::getIfExists(Var)) {
- if (llvm::Value *DbgValue = llvm::MetadataAsValue::getIfExists(
- CGM.getLLVMContext(), MDValue)) {
- for (llvm::User *U : DbgValue->users()) {
- if (llvm::CallInst *DbgDeclare = dyn_cast<llvm::CallInst>(U)) {
- if (DbgDeclare->getCalledFunction()->getIntrinsicID() ==
- llvm::Intrinsic::dbg_declare &&
- DbgDeclare->getArgOperand(0) == DbgValue) {
- // There can be implicit type cast applied on a variable if it is
- // an opaque ptr, in this case its debug info may not match the
- // actual type of object being used as in the next instruction, so
- // we will need to emit a pseudo variable for type-casted value.
- llvm::DILocalVariable *MDNode = cast<llvm::DILocalVariable>(
- cast<llvm::MetadataAsValue>(DbgDeclare->getOperand(1))
- ->getMetadata());
- if (MDNode->getType() == Type)
- return;
- }
- }
- }
- }
- }
+ // There can be implicit type cast applied on a variable if it is an opaque
+ // ptr, in this case its debug info may not match the actual type of object
+ // being used as in the next instruction, so we will need to emit a pseudo
+ // variable for type-casted value.
+ auto DeclareTypeMatches = [&](auto *DbgDeclare) {
+ return DbgDeclare->getVariable()->getType() == Type;
+ };
+ if (any_of(llvm::findDbgDeclares(Var), DeclareMatches) ||
+ any_of(llvm::findDVRDeclares(Var), DeclareMatches))
+ return;
}
// Find the correct location to insert a sequence of instructions to
|
clang/lib/CodeGen/CGDebugInfo.cpp
Outdated
auto DeclareTypeMatches = [&](auto *DbgDeclare) { | ||
return DbgDeclare->getVariable()->getType() == Type; | ||
}; | ||
if (any_of(llvm::findDbgDeclares(Var), DeclareMatches) || |
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.
DeclareMatches
or DeclareTypeMatches
?
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.
Oops!
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.
LGTM
…lvm#94956)" This reverts commit 5c268cf.
CGDebugInfo::EmitPseudoVariable currently uses detailed logic to exactly collect llvm.dbg.declare users of an alloca. This patch replaces this with an LLVM function for finding debug declares intrinsics and also adds the same for debug records, simplifying the code and adding record support.
No tests added in this commit because it is NFC for intrinsics, and there is no way to make clang emit records directly yet - one of the existing tests however will switch to covering debug records once #89799 relands.