DebugInfo: Location information for scalar new expressions

llvm-svn: 223937
This commit is contained in:
David Blaikie 2014-12-10 19:04:09 +00:00
parent 0df50938be
commit a2c1124f9c
2 changed files with 18 additions and 5 deletions

View File

@ -754,14 +754,15 @@ static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
} }
static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init, static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init,
QualType AllocType, llvm::Value *NewPtr) { QualType AllocType, llvm::Value *NewPtr,
SourceLocation DbgLoc = SourceLocation()) {
// FIXME: Refactor with EmitExprAsInit. // FIXME: Refactor with EmitExprAsInit.
CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType); CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType);
switch (CGF.getEvaluationKind(AllocType)) { switch (CGF.getEvaluationKind(AllocType)) {
case TEK_Scalar: case TEK_Scalar:
CGF.EmitScalarInit(Init, nullptr, CGF.MakeAddrLValue(NewPtr, AllocType, CGF.EmitScalarInit(Init, nullptr,
Alignment), CGF.MakeAddrLValue(NewPtr, AllocType, Alignment), false,
false); DbgLoc);
return; return;
case TEK_Complex: case TEK_Complex:
CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType, CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType,
@ -1023,7 +1024,8 @@ static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements, CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements,
AllocSizeWithoutCookie); AllocSizeWithoutCookie);
else if (const Expr *Init = E->getInitializer()) else if (const Expr *Init = E->getInitializer())
StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr); StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr,
E->getStartLoc());
} }
/// Emit a call to an operator new or operator delete function, as implicitly /// Emit a call to an operator new or operator delete function, as implicitly

View File

@ -99,6 +99,16 @@ void f9(int i) {
src1)[src2()]; src1)[src2()];
} }
void *operator new(unsigned long, void *);
// CHECK-LABEL: define
void f10() {
void *void_src();
( // CHECK: store {{.*}} !dbg [[DBG_F10:!.*]]
#line 1100
new (void_src()) int(src()));
}
// CHECK: [[DBG_F1]] = metadata !{i32 100, // CHECK: [[DBG_F1]] = metadata !{i32 100,
// CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200, // CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200,
// CHECK: [[DBG_FOO_REF]] = metadata !{i32 202, // CHECK: [[DBG_FOO_REF]] = metadata !{i32 202,
@ -111,3 +121,4 @@ void f9(int i) {
// CHECK: [[DBG_F7]] = metadata !{i32 800, // CHECK: [[DBG_F7]] = metadata !{i32 800,
// CHECK: [[DBG_F8]] = metadata !{i32 900, // CHECK: [[DBG_F8]] = metadata !{i32 900,
// CHECK: [[DBG_F9]] = metadata !{i32 1000, // CHECK: [[DBG_F9]] = metadata !{i32 1000,
// CHECK: [[DBG_F10]] = metadata !{i32 1100,