If an aggregate argument is passed indirectly because it has non trivial
destructor or copy constructor than let debug info know about it. Radar 8945514. llvm-svn: 125142
This commit is contained in:
parent
0b2f8d24b3
commit
14524e0f24
|
@ -898,7 +898,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
|
|||
V = EmitScalarConversion(V, Ty, Arg->getType());
|
||||
}
|
||||
}
|
||||
EmitParmDecl(*Arg, V);
|
||||
EmitParmDecl(*Arg, V, true /*ABIArgInfo::Indirect*/);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1735,7 +1735,8 @@ llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
|
|||
|
||||
/// EmitDeclare - Emit local variable declaration debug info.
|
||||
void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
||||
llvm::Value *Storage, CGBuilderTy &Builder) {
|
||||
llvm::Value *Storage, CGBuilderTy &Builder,
|
||||
bool IndirectArgument) {
|
||||
assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
|
||||
|
||||
llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
|
||||
|
@ -1751,6 +1752,12 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
|||
if (!Ty)
|
||||
return;
|
||||
|
||||
// If an aggregate variable has non trivial destructor or non trivial copy
|
||||
// constructor than it is pass indirectly. Let debug info know about this
|
||||
// by using reference of the aggregate type as a argument type.
|
||||
if (IndirectArgument && VD->getType()->isRecordType())
|
||||
Ty = DBuilder.CreateReferenceType(Ty);
|
||||
|
||||
// Get location information.
|
||||
unsigned Line = getLineNumber(VD->getLocation());
|
||||
unsigned Column = getColumnNumber(VD->getLocation());
|
||||
|
@ -1911,8 +1918,10 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
|
|||
/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
|
||||
/// variable declaration.
|
||||
void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
|
||||
CGBuilderTy &Builder) {
|
||||
EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder);
|
||||
CGBuilderTy &Builder,
|
||||
bool IndirectArgument) {
|
||||
EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder,
|
||||
IndirectArgument);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ public:
|
|||
/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
|
||||
/// variable declaration.
|
||||
void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,
|
||||
CGBuilderTy &Builder);
|
||||
CGBuilderTy &Builder, bool IndirectArg = false);
|
||||
|
||||
/// EmitGlobalVariable - Emit information about a global variable.
|
||||
void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl);
|
||||
|
@ -194,7 +194,7 @@ public:
|
|||
private:
|
||||
/// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
|
||||
void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
|
||||
CGBuilderTy &Builder);
|
||||
CGBuilderTy &Builder, bool IndirectArgument = false);
|
||||
|
||||
/// EmitDeclare - Emit call to llvm.dbg.declare for a variable
|
||||
/// declaration from an enclosing block.
|
||||
|
|
|
@ -927,7 +927,8 @@ void CodeGenFunction::EmitAutoVarDecl(const VarDecl &D,
|
|||
|
||||
/// Emit an alloca (or GlobalValue depending on target)
|
||||
/// for the specified parameter and set up LocalDeclMap.
|
||||
void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
|
||||
void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
|
||||
bool IndirectArg) {
|
||||
// FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
|
||||
assert((isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)) &&
|
||||
"Invalid argument to EmitParmDecl");
|
||||
|
@ -956,6 +957,6 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
|
|||
// Emit debug info for param declaration.
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
DI->setLocation(D.getLocation());
|
||||
DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder);
|
||||
DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder, IndirectArg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1438,7 +1438,8 @@ public:
|
|||
llvm::GlobalValue::LinkageTypes Linkage);
|
||||
|
||||
/// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
|
||||
void EmitParmDecl(const VarDecl &D, llvm::Value *Arg);
|
||||
void EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
|
||||
bool IndirectArgument = false);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Statement Emission
|
||||
|
|
Loading…
Reference in New Issue