aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGDebugInfo.cpp
diff options
context:
space:
mode:
authorStephen Tozer <stephen.tozer@sony.com>2024-06-10 11:57:53 +0100
committerGitHub <noreply@github.com>2024-06-10 11:57:53 +0100
commit5c268cfaae521dc2db1af58085e3c8d66a5533fe (patch)
tree6aa1dfd04b5c0972b6ec1665e3dbe8cad3c401f8 /clang/lib/CodeGen/CGDebugInfo.cpp
parent8b7e836570b29d3bc89731c5af91c847e3fc5c71 (diff)
downloadllvm-5c268cfaae521dc2db1af58085e3c8d66a5533fe.zip
llvm-5c268cfaae521dc2db1af58085e3c8d66a5533fe.tar.gz
llvm-5c268cfaae521dc2db1af58085e3c8d66a5533fe.tar.bz2
[Clang] Extend EmitPseudoVariable to support debug records (#94956)
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 https://github.com/llvm/llvm-project/pull/89799 relands.
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.cpp32
1 files changed, 10 insertions, 22 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 681a475..11e2d54 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), DeclareTypeMatches) ||
+ any_of(llvm::findDVRDeclares(Var), DeclareTypeMatches))
+ return;
}
// Find the correct location to insert a sequence of instructions to