diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-04-13 21:47:26 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-04-13 21:47:26 +0000 |
commit | 0f59312e7b625fa5821a63db65377d4b3b667e99 (patch) | |
tree | 8e41750fd4d4d1889dc297d609aac1c5b5dea200 /lib/CodeGen/CGExprConstant.cpp | |
parent | 8a3e0b1b8222d52df3d42ca345dc48f991e1908a (diff) |
Minor work related to removing the assumption that value initialization
implies an all-zero bit pattern.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68994 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 2373ad64e9..d7c6457ff8 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -102,6 +102,7 @@ public: } // Initialize remaining array elements. + // FIXME: This doesn't handle member pointers correctly! for (; i < NumElements; ++i) Elts.push_back(llvm::Constant::getNullValue(ElemTy)); @@ -187,6 +188,7 @@ public: std::vector<llvm::Constant*> Elts; // Initialize the whole structure to zero. + // FIXME: This doesn't handle member pointers correctly! for (unsigned i = 0; i < SType->getNumElements(); ++i) { const llvm::Type *FieldTy = SType->getElementType(i); Elts.push_back(llvm::Constant::getNullValue(FieldTy)); @@ -255,11 +257,6 @@ public: llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) { const llvm::Type *Ty = ConvertType(ILE->getType()); - // If this is an empty initializer list, we value-initialize the - // union. - if (ILE->getNumInits() == 0) - return llvm::Constant::getNullValue(Ty); - FieldDecl* curField = ILE->getInitializedFieldInUnion(); if (!curField) { // There's no field to initialize, so value-initialize the union. @@ -287,8 +284,14 @@ public: return llvm::ConstantArray::get(RetTy, Elts); } - Expr *Init = ILE->getInit(0); - return EmitUnion(CGM.EmitConstantExpr(Init, Init->getType(), CGF), Ty); + llvm::Constant *InitElem; + if (ILE->getNumInits() > 0) { + Expr *Init = ILE->getInit(0); + InitElem = CGM.EmitConstantExpr(Init, Init->getType(), CGF); + } else { + InitElem = CGM.EmitNullConstant(curField->getType()); + } + return EmitUnion(InitElem, Ty); } llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) { @@ -318,8 +321,7 @@ public: } llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) { - const llvm::Type* RetTy = CGM.getTypes().ConvertType(E->getType()); - return llvm::Constant::getNullValue(RetTy); + return CGM.EmitNullConstant(E->getType()); } llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { @@ -329,8 +331,7 @@ public: Expr *Init = ILE->getInit(0); return CGM.EmitConstantExpr(Init, Init->getType(), CGF); } - const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType()); - return llvm::Constant::getNullValue(RetTy); + return CGM.EmitNullConstant(ILE->getType()); } if (ILE->getType()->isArrayType()) @@ -590,3 +591,9 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, } return C; } + +llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) { + // Always return an LLVM null constant for now; this will change when we + // get support for IRGen of member pointers. + return llvm::Constant::getNullValue(getTypes().ConvertType(T)); +} |