aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-07-20 22:35:22 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-07-20 22:35:22 +0000
commitab3c0a2c879569bb00fa664ebaccf9442c0a9c5f (patch)
treebcdfd5cbd0951adf5bfaced57be70b9bc451e3a7 /lib/CodeGen/CodeGenFunction.cpp
parent75f1af02091235a21180cf22ac9f7dd0025577f6 (diff)
Early ir-gen for constructor prologue. This is on going.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76493 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 3a689a4306..4bfebe5c31 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -141,6 +141,39 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
Ptr->eraseFromParent();
}
+/// EmitCtorPrologue - This routine generates necessary code to initialize
+/// base classes and non-static data members belonging to this constructor.
+void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
+ for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
+ E = CD->init_end();
+ B != E; ++B) {
+ CXXBaseOrMemberInitializer *Member = (*B);
+ if (Member->isBaseInitializer()) {
+ // FIXME. Added base initialilzers here.
+ ;
+ }
+ else {
+ // non-static data member initilaizers.
+ FieldDecl *Field = Member->getMember();
+ QualType FieldType = getContext().getCanonicalType((Field)->getType());
+ assert(!getContext().getAsArrayType(FieldType)
+ && "Field arrays initialization unsupported");
+ assert(!FieldType->getAsRecordType()
+ && "Field class initialization unsupported");
+ llvm::Value *LoadOfThis = LoadCXXThis();
+ LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
+
+ assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only");
+ Expr *RhsExpr = *Member->begin();
+ llvm::Value *RHS = EmitScalarExpr(RhsExpr, true);
+ if (LHS.isBitfield())
+ EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, FieldType, 0);
+ else
+ EmitStoreThroughLValue(RValue::get(RHS), LHS, FieldType);
+ }
+ }
+}
+
void CodeGenFunction::StartFunction(const Decl *D, QualType RetTy,
llvm::Function *Fn,
const FunctionArgList &Args,
@@ -229,6 +262,8 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD,
// FIXME: Support CXXTryStmt here, too.
if (const CompoundStmt *S = FD->getCompoundBody()) {
StartFunction(FD, FD->getResultType(), Fn, Args, S->getLBracLoc());
+ if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
+ EmitCtorPrologue(CD);
EmitStmt(S);
FinishFunction(S->getRBracLoc());
}