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))
|
||||
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);
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
// RUN: clang -emit-llvm %s
|
||||
|
||||
int A[10] = { 1,2,3,4,5 };
|
||||
|
Loading…
Reference in New Issue