diff options
author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-02-19 19:27:31 +0000 |
---|---|---|
committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-02-19 19:27:31 +0000 |
commit | e2162c65498bd9e0403222da199737fb6acad610 (patch) | |
tree | bba93ce373b3f717ecbb62faa87a1a385865bcc6 /clang/CodeGen | |
parent | 9fd2531b5ecb5a2e84ef3501d9412d32e10e1177 (diff) | |
download | bcm5719-llvm-e2162c65498bd9e0403222da199737fb6acad610.tar.gz bcm5719-llvm-e2162c65498bd9e0403222da199737fb6acad610.zip |
Simplify aggregate initilizer implementation. Use the CodeGenModule::EmitConstantExpr method when
possible.
Fix mediabench/mpeg2/mpeg2dec test.
llvm-svn: 47336
Diffstat (limited to 'clang/CodeGen')
-rw-r--r-- | clang/CodeGen/CGExprAgg.cpp | 57 |
1 files changed, 14 insertions, 43 deletions
diff --git a/clang/CodeGen/CGExprAgg.cpp b/clang/CodeGen/CGExprAgg.cpp index 71f96aa675c..0324ebf6329 100644 --- a/clang/CodeGen/CGExprAgg.cpp +++ b/clang/CodeGen/CGExprAgg.cpp @@ -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); + } } //===----------------------------------------------------------------------===// |