зеркало из https://github.com/microsoft/clang-1.git
The address of a vla is actually complex and requires a dereference.
Part of rdar://11352000 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156407 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
3a89bfbeed
Коммит
a135f2ca67
|
@ -2289,8 +2289,25 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
||||||
DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock());
|
DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock());
|
||||||
Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
|
Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
|
||||||
return;
|
return;
|
||||||
}
|
} else if (isa<VariableArrayType>(VD->getType())) {
|
||||||
|
// These are "complex" variables in that they need an op_deref.
|
||||||
// Create the descriptor for the variable.
|
// Create the descriptor for the variable.
|
||||||
|
llvm::Value *Addr = llvm::ConstantInt::get(CGM.Int64Ty,
|
||||||
|
llvm::DIBuilder::OpDeref);
|
||||||
|
llvm::DIVariable D =
|
||||||
|
DBuilder.createComplexVariable(Tag,
|
||||||
|
llvm::DIDescriptor(Scope),
|
||||||
|
Name, Unit, Line, Ty,
|
||||||
|
Addr, ArgNo);
|
||||||
|
|
||||||
|
// Insert an llvm.dbg.declare into the current block.
|
||||||
|
llvm::Instruction *Call =
|
||||||
|
DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock());
|
||||||
|
Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the descriptor for the variable.
|
||||||
llvm::DIVariable D =
|
llvm::DIVariable D =
|
||||||
DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope),
|
DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope),
|
||||||
Name, Unit, Line, Ty,
|
Name, Unit, Line, Ty,
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: metadata !{i32 {{.*}}, metadata {{.*}}, metadata !"vla", metadata {{.*}}, i32 7, metadata {{.*}}, i32 0, i32 0, i64 2} ; [ DW_TAG_auto_variable ]
|
||||||
|
|
||||||
|
void testVLAwithSize(int s)
|
||||||
|
{
|
||||||
|
int vla[s];
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < s; i++) {
|
||||||
|
vla[i] = i*i;
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче