================ @@ -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; + } ---------------- SLTozer wrote:
To add a little extra to this, it looks like what this code is trying to do is the same as `Instruction::getInsertionPointAfterDef` - would that be a suitable substitution? https://github.com/llvm/llvm-project/pull/95298 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits