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:
Eric Christopher 2012-05-08 18:56:47 +00:00
Родитель 3a89bfbeed
Коммит a135f2ca67
2 изменённых файлов: 30 добавлений и 1 удалений

Просмотреть файл

@ -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;
}
}