]> granicus.if.org Git - clang/commitdiff
Codegen global array initializers.
authorDevang Patel <dpatel@apple.com>
Fri, 26 Oct 2007 16:31:40 +0000 (16:31 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 26 Oct 2007 16:31:40 +0000 (16:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43383 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenModule.cpp
test/CodeGen/globalinit.c [new file with mode: 0644]

index 8cb138ebff536c6205ba74447a2fe60079f21284..00c262167c67c7c15352ecbf3af07f09d92f07fa 100644 (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);
   
diff --git a/test/CodeGen/globalinit.c b/test/CodeGen/globalinit.c
new file mode 100644 (file)
index 0000000..7087669
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: clang -emit-llvm %s
+
+int A[10] = { 1,2,3,4,5 };
+