DebugInfo: Emit the correct location for initialization of a complex variable
Especially useful for sanitizer reports. llvm-svn: 223825
This commit is contained in:
parent
e242e8b064
commit
538deffd2d
|
@ -616,7 +616,7 @@ void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue LHS,
|
|||
}
|
||||
break;
|
||||
case TEK_Complex:
|
||||
EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true);
|
||||
EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true, DbgLoc);
|
||||
break;
|
||||
case TEK_Aggregate: {
|
||||
llvm::Value *ArrayIndexVar = nullptr;
|
||||
|
|
|
@ -81,7 +81,8 @@ public:
|
|||
|
||||
/// EmitStoreOfComplex - Store the specified real/imag parts into the
|
||||
/// specified value pointer.
|
||||
void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit);
|
||||
void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit,
|
||||
SourceLocation DbgLoc = SourceLocation());
|
||||
|
||||
/// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
|
||||
ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
|
||||
|
@ -333,9 +334,12 @@ ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue,
|
|||
|
||||
/// EmitStoreOfComplex - Store the specified real/imag parts into the
|
||||
/// specified value pointer.
|
||||
void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val,
|
||||
LValue lvalue,
|
||||
bool isInit) {
|
||||
void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue lvalue,
|
||||
bool isInit,
|
||||
SourceLocation DbgLoc) {
|
||||
if (auto *DI = CGF.getDebugInfo())
|
||||
DI->EmitLocation(CGF.Builder, DbgLoc);
|
||||
|
||||
if (lvalue.getType()->isAtomicType())
|
||||
return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit);
|
||||
|
||||
|
@ -910,6 +914,7 @@ LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
|
|||
LValue LHS = CGF.EmitLValue(E->getLHS());
|
||||
|
||||
// Store the result value into the LHS lvalue.
|
||||
// FIXME
|
||||
EmitStoreOfComplex(Val, LHS, /*isInit*/ false);
|
||||
|
||||
return LHS;
|
||||
|
@ -1038,18 +1043,19 @@ ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue dest,
|
||||
bool isInit) {
|
||||
bool isInit,
|
||||
SourceLocation DbgLoc) {
|
||||
assert(E && getComplexType(E->getType()) &&
|
||||
"Invalid complex expression to emit");
|
||||
ComplexExprEmitter Emitter(*this);
|
||||
ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
|
||||
Emitter.EmitStoreOfComplex(Val, dest, isInit);
|
||||
Emitter.EmitStoreOfComplex(Val, dest, isInit, DbgLoc);
|
||||
}
|
||||
|
||||
/// EmitStoreOfComplex - Store a complex number into the specified l-value.
|
||||
void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
|
||||
bool isInit) {
|
||||
ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit);
|
||||
bool isInit, SourceLocation DbgLoc) {
|
||||
ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit, DbgLoc);
|
||||
}
|
||||
|
||||
/// EmitLoadOfComplex - Load a complex number from the specified address.
|
||||
|
|
|
@ -2524,10 +2524,12 @@ public:
|
|||
|
||||
/// EmitComplexExprIntoLValue - Emit the given expression of complex
|
||||
/// type and place its result into the specified l-value.
|
||||
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit);
|
||||
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit,
|
||||
SourceLocation DbgLoc = SourceLocation());
|
||||
|
||||
/// EmitStoreOfComplex - Store a complex number into the specified l-value.
|
||||
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit);
|
||||
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit,
|
||||
SourceLocation DbgLoc = SourceLocation());
|
||||
|
||||
/// EmitLoadOfComplex - Load a complex number from the specified l-value.
|
||||
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
|
||||
|
||||
int &src(); int* sink();
|
||||
int &src();
|
||||
int* sink();
|
||||
__complex float complex_src();
|
||||
|
||||
void f1() {
|
||||
#line 100
|
||||
|
@ -13,6 +15,7 @@ void f1() {
|
|||
struct foo {
|
||||
int i;
|
||||
int &j;
|
||||
__complex float k;
|
||||
foo();
|
||||
};
|
||||
|
||||
|
@ -21,13 +24,17 @@ foo::foo()
|
|||
#line 200
|
||||
i
|
||||
(src()),
|
||||
j
|
||||
(src())
|
||||
// CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]]
|
||||
j
|
||||
(src()),
|
||||
// CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]]
|
||||
k
|
||||
(complex_src())
|
||||
// CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]]
|
||||
{
|
||||
}
|
||||
|
||||
// CHECK: [[DBG_F1]] = metadata !{i32 100,
|
||||
// CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200,
|
||||
// CHECK: [[DBG_FOO_REF]] = metadata !{i32 202,
|
||||
// CHECK: [[DBG_FOO_REF]] = metadata !{i32 203,
|
||||
// CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 206,
|
||||
|
|
Loading…
Reference in New Issue