]> granicus.if.org Git - clang/commitdiff
Simplify aggregate initilizer implementation. Use the CodeGenModule::EmitConstantExpr...
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Tue, 19 Feb 2008 19:27:31 +0000 (19:27 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Tue, 19 Feb 2008 19:27:31 +0000 (19:27 +0000)
possible.
Fix mediabench/mpeg2/mpeg2dec test.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47336 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExprAgg.cpp
test/CodeGen/init.c

index 71f96aa675c5b5dd5b301aa32b2ce08a936b8714..0324ebf63297b282dfa74aadf71b0afbd49498a9 100644 (file)
@@ -85,8 +85,6 @@ public:
 
 private:
 
-  llvm::Constant *GetConstantInit(InitListExpr *E,
-                                  const llvm::ArrayType *AType);
   void EmitNonConstInit(Expr *E, llvm::Value *Dest, const llvm::Type *DestType);
 };
 }  // end anonymous namespace.
@@ -236,35 +234,6 @@ void AggExprEmitter::VisitConditionalOperator(const ConditionalOperator *E) {
   CGF.EmitBlock(ContBlock);
 }
 
-llvm::Constant *AggExprEmitter::GetConstantInit(InitListExpr *E,
-                                                const llvm::ArrayType *AType) {
-  std::vector<llvm::Constant*> ArrayElts;
-  unsigned NumInitElements = E->getNumInits();
-  const llvm::Type *ElementType = AType->getElementType();
-  unsigned i;
-
-  for (i = 0; i != NumInitElements; ++i) {
-    if (InitListExpr *InitList = dyn_cast<InitListExpr>(E->getInit(i))) {
-      assert(isa<llvm::ArrayType>(ElementType) && "Invalid initilizer");
-      llvm::Constant *C =
-        GetConstantInit(InitList, cast<llvm::ArrayType>(ElementType));
-      if (!C) return NULL;
-      ArrayElts.push_back(C);
-    } else if (llvm::Constant *C =
-        dyn_cast<llvm::Constant>(CGF.EmitScalarExpr(E->getInit(i))))
-      ArrayElts.push_back(C);
-    else
-      return NULL;
-  }
-
-  // Remaining default initializers
-  unsigned NumArrayElements = AType->getNumElements();
-  for (/*Do not initialize i*/; i < NumArrayElements; ++i)
-      ArrayElts.push_back(llvm::Constant::getNullValue(ElementType));
-
-  return llvm::ConstantArray::get(AType, ArrayElts);
-}
-
 void AggExprEmitter::EmitNonConstInit(Expr *E, llvm::Value *DestPtr,
                                       const llvm::Type *DestType) {
 
@@ -309,17 +278,8 @@ void AggExprEmitter::EmitNonConstInit(Expr *E, llvm::Value *DestPtr,
 
 void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
 
-  if (!E->getType()->isArrayType()) {
-    CGF.WarnUnsupported(E, "aggregate init-list expression");
-    return;
-  }
-
-  const llvm::PointerType *APType = cast<llvm::PointerType>(DestPtr->getType());
-  const llvm::ArrayType *AType =
-    cast<llvm::ArrayType>(APType->getElementType());
-
-  llvm::Constant *V = GetConstantInit(E, AType);
-  if (V) {
+  if (E->isConstantExpr(CGF.CGM.getContext(), NULL)) {
+    llvm::Constant *V = CGF.CGM.EmitConstantExpr(E);
     // Create global value to hold this array.
     V = new llvm::GlobalVariable(V->getType(), true,
                                  llvm::GlobalValue::InternalLinkage,
@@ -328,8 +288,19 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
 
     EmitAggregateCopy(DestPtr, V , E->getType());
     return;
-  } else
+  } else {
+    if (!E->getType()->isArrayType()) {
+      CGF.WarnUnsupported(E, "aggregate init-list expression");
+      return;
+    }
+
+    const llvm::PointerType *APType =
+      cast<llvm::PointerType>(DestPtr->getType());
+    const llvm::ArrayType *AType =
+      cast<llvm::ArrayType>(APType->getElementType());
+
     EmitNonConstInit(E, DestPtr, AType);
+  }
 }
 
 //===----------------------------------------------------------------------===//
index f773b8b8dde17d15f113b34f614aabda1ccf0e23..fd0735b69effff740b8f095f96984cae3b17ccde 100644 (file)
@@ -11,4 +11,5 @@ void f2() {
   int *c[2] = { &a[1][1], &b[2][2] };
   int *d[2][2] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
   int *e[3][3] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
+  char ext[3][3] = {".Y",".U",".V"};
 }