[clang] (New) Add option to generate additional debug info for expression dereferencing pointer to pointers (PR #95298)
William Junda Huang via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 13 19:13:17 PDT 2024
================
@@ -5746,6 +5746,57 @@ void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
Var->addDebugInfo(GVE);
}
+void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder,
+ llvm::Instruction *Value, QualType Ty) {
+ // Only when -g2 or above is specified, debug info for variables will be
+ // generated.
+ if (CGM.getCodeGenOpts().getDebugInfo() <=
+ llvm::codegenoptions::DebugLineTablesOnly)
+ return;
+
+ llvm::DILocation *DIL = Value->getDebugLoc().get();
+ if (!DIL)
+ return;
+
+ llvm::DIFile *Unit = DIL->getFile();
+ llvm::DIType *Type = getOrCreateType(Ty, Unit);
+
+ // Check if Value is already a declared variable and has debug info, in this
+ // case we have nothing to do. Clang emits declared variable as alloca, and
+ // 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();
+ // 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 the debug value.
+ llvm::BasicBlock *InsertBB = Value->getParent();
+ llvm::Instruction *InsertBefore = Value->getIterator()->getNextNode();
+ if (llvm::InvokeInst *Invoke = dyn_cast<llvm::InvokeInst>(Value)) {
+ InsertBB = Invoke->getNormalDest();
+ InsertBefore = InsertBB->size() > 0 ? &(InsertBB->front()) : nullptr;
+ }
----------------
huangjd wrote:
Done.
https://github.com/llvm/llvm-project/pull/95298
More information about the cfe-commits
mailing list