diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-20 23:29:04 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-20 23:29:04 +0000 |
commit | 48620bafe4ba879f96c2d17caefeb79f3fae2eea (patch) | |
tree | fa5e799ee50437137a9aea09756a85ce808e4f93 /lib/CodeGen | |
parent | 705348544cdf9db2b88ebfa60966b62a5be1f3f1 (diff) |
Code-gen for CXXZeroInitValueExpr AST passed
as argument to a function call. Removes a FIXME.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84694 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 14 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 3 |
3 files changed, 16 insertions, 5 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 44e5207e53..cfa669dc4b 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -566,10 +566,6 @@ CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D, assert(!ClassDecl->hasUserDeclaredCopyConstructor() && "EmitCXXConstructorCall - user declared copy constructor"); const Expr *E = (*ArgBeg); - // FIXME. This may not be correct. But till now, we were skipping - // code gen of trivial copy constructors regardless of their arguments. - if (isa<CXXZeroInitValueExpr>(E)) - return; QualType Ty = E->getType(); llvm::Value *Src = EmitLValue(E).getAddress(); EmitAggregateCopy(This, Src, Ty); diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 29ca900ed3..d3d1c61fe9 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -303,6 +303,8 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) { case Expr::CXXReinterpretCastExprClass: case Expr::CXXConstCastExprClass: return EmitCastLValue(cast<CastExpr>(E)); + case Expr::CXXZeroInitValueExprClass: + return EmitNullInitializationLValue(cast<CXXZeroInitValueExpr>(E)); } } @@ -1313,6 +1315,18 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) { } } +LValue CodeGenFunction::EmitNullInitializationLValue( + const CXXZeroInitValueExpr *E) { + QualType Ty = E->getType(); + const llvm::Type *LTy = ConvertTypeForMem(Ty); + llvm::AllocaInst *Alloc = CreateTempAlloca(LTy); + unsigned Align = getContext().getTypeAlign(Ty)/8; + Alloc->setAlignment(Align); + LValue lvalue = LValue::MakeAddr(Alloc, Qualifiers()); + EmitMemSetToZero(lvalue.getAddress(), Ty); + return lvalue; +} + //===--------------------------------------------------------------------===// // Expression Emission //===--------------------------------------------------------------------===// diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 3048257d2c..a32a7eabad 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -817,7 +817,8 @@ public: LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E); LValue EmitConditionalOperatorLValue(const ConditionalOperator *E); LValue EmitCastLValue(const CastExpr *E); - + LValue EmitNullInitializationLValue(const CXXZeroInitValueExpr *E); + llvm::Value *EmitIvarOffset(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar); LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field, |