Codegen global array initializers.

llvm-svn: 43383
This commit is contained in:
Devang Patel 2007-10-26 16:31:40 +00:00
parent 22c6a22d76
commit 19c2b9a66f
2 changed files with 39 additions and 1 deletions

View File

@ -72,7 +72,41 @@ void CodeGenModule::EmitGlobalVar(const FileVarDecl *D) {
if (D->getInit()->isIntegerConstantExpr(Value, Context))
Init = llvm::ConstantInt::get(Value);
}
assert(Init && "FIXME: Global variable initializers unimp!");
if (!Init) {
if (const InitListExpr *ILE = dyn_cast<InitListExpr>(D->getInit())) {
unsigned NumInitElements = ILE->getNumInits();
assert ( ILE->getType()->isArrayType()
&& "FIXME: Only Array initializers are supported");
std::vector<llvm::Constant*> ArrayElts;
const llvm::PointerType *APType = cast<llvm::PointerType>(GV->getType());
const llvm::ArrayType *AType = cast<llvm::ArrayType>(APType->getElementType());
// Copy initializer elements.
unsigned i = 0;
for (i = 0; i < NumInitElements; ++i) {
assert (ILE->getInit(i)->getType()->isIntegerType()
&& "Only IntegerType global array initializers are supported");
llvm::APSInt Value(static_cast<uint32_t>(
getContext().getTypeSize(ILE->getInit(i)->getType(), SourceLocation())));
if (ILE->getInit(i)->isIntegerConstantExpr(Value, Context)) {
llvm::Constant *C = llvm::ConstantInt::get(Value);
ArrayElts.push_back(C);
}
}
// Initialize remaining array elements.
unsigned NumArrayElements = AType->getNumElements();
for (; i < NumArrayElements; ++i)
ArrayElts.push_back(llvm::Constant::getNullValue(AType->getElementType()));
Init = llvm::ConstantArray::get(AType, ArrayElts);
} else
assert(Init && "FIXME: Global variable initializers unimp!");
}
GV->setInitializer(Init);

View File

@ -0,0 +1,4 @@
// RUN: clang -emit-llvm %s
int A[10] = { 1,2,3,4,5 };