forked from OSchip/llvm-project
parent
22c6a22d76
commit
19c2b9a66f
|
@ -72,7 +72,41 @@ void CodeGenModule::EmitGlobalVar(const FileVarDecl *D) {
|
||||||
if (D->getInit()->isIntegerConstantExpr(Value, Context))
|
if (D->getInit()->isIntegerConstantExpr(Value, Context))
|
||||||
Init = llvm::ConstantInt::get(Value);
|
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);
|
GV->setInitializer(Init);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
// RUN: clang -emit-llvm %s
|
||||||
|
|
||||||
|
int A[10] = { 1,2,3,4,5 };
|
||||||
|
|
Loading…
Reference in New Issue