summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-11 23:37:08 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-11 23:37:08 +0000
commitbd7d11f7704cde8419aac2945ed86455ff5914b1 (patch)
tree3066e35ac8250c31a09683bf5bdcdad0b03eb8bf /clang/lib/CodeGen
parent25421bb8f6a22cac7e08055a0b5017275c7f844c (diff)
downloadbcm5719-llvm-bd7d11f7704cde8419aac2945ed86455ff5914b1.tar.gz
bcm5719-llvm-bd7d11f7704cde8419aac2945ed86455ff5914b1.zip
Factor code that's common to EmitCXXMemberCallExpr and EmitCXXConstructorCall out into a EmitCXXMemberCall function.
llvm-svn: 71514
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGCXX.cpp61
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.h7
2 files changed, 41 insertions, 27 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp
index da3cd3ca10a..f4eae6678f3 100644
--- a/clang/lib/CodeGen/CGCXX.cpp
+++ b/clang/lib/CodeGen/CGCXX.cpp
@@ -77,38 +77,51 @@ CodeGenFunction::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D,
EmitBlock(EndBlock);
}
-RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
- const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
- const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
+RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
+ llvm::Value *Callee,
+ llvm::Value *This,
+ CallExpr::const_arg_iterator ArgBeg,
+ CallExpr::const_arg_iterator ArgEnd) {
assert(MD->isInstance() &&
"Trying to emit a member call expr on a static method!");
+
+ const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
+
+ CallArgList Args;
+
+ // Push the this ptr.
+ Args.push_back(std::make_pair(RValue::get(This),
+ MD->getThisType(getContext())));
+
+ // And the rest of the call args
+ EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
+ QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
+ return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
+ Callee, Args, MD);
+}
+
+RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
+ const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
+ const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
+
const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
const llvm::Type *Ty =
CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
FPT->isVariadic());
llvm::Constant *Callee = CGM.GetAddrOfFunction(MD, Ty);
- llvm::Value *BaseValue = 0;
+ llvm::Value *This;
if (ME->isArrow())
- BaseValue = EmitScalarExpr(ME->getBase());
+ This = EmitScalarExpr(ME->getBase());
else {
LValue BaseLV = EmitLValue(ME->getBase());
- BaseValue = BaseLV.getAddress();
+ This = BaseLV.getAddress();
}
- CallArgList Args;
-
- // Push the 'this' pointer.
- Args.push_back(std::make_pair(RValue::get(BaseValue),
- MD->getThisType(getContext())));
-
- EmitCallArgs(Args, FPT, CE->arg_begin(), CE->arg_end());
-
- QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
- return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
- Callee, Args, MD);
+ return EmitCXXMemberCall(MD, Callee, This,
+ CE->arg_begin(), CE->arg_end());
}
llvm::Value *CodeGenFunction::LoadCXXThis() {
@@ -127,16 +140,9 @@ CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
llvm::Value *This,
CallExpr::const_arg_iterator ArgBeg,
CallExpr::const_arg_iterator ArgEnd) {
- CallArgList Args;
-
- // Push the 'this' pointer.
- Args.push_back(std::make_pair(RValue::get(This),
- D->getThisType(getContext())));
-
- EmitCallArgs(Args, D->getType()->getAsFunctionProtoType(), ArgBeg, ArgEnd);
-
- EmitCall(CGM.getTypes().getFunctionInfo(getContext().VoidTy, Args),
- CGM.GetAddrOfCXXConstructor(D, Type), Args, D);
+ llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type);
+
+ EmitCXXMemberCall(D, Callee, This, ArgBeg, ArgEnd);
}
void
@@ -198,6 +204,7 @@ CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
const char *Name = getMangledCXXCtorName(D, Type);
+
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, D));
}
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index 0729ae2d695..964f92123ba 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -668,6 +668,13 @@ public:
const Decl *TargetDecl = 0);
RValue EmitCallExpr(const CallExpr *E);
+
+ RValue EmitCXXMemberCall(const CXXMethodDecl *MD,
+ llvm::Value *Callee,
+ llvm::Value *This,
+ CallExpr::const_arg_iterator ArgBeg,
+ CallExpr::const_arg_iterator ArgEnd);
+
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E);
RValue EmitCallExpr(llvm::Value *Callee, QualType FnType,
OpenPOWER on IntegriCloud