[cfe-commits] r71514 - in /cfe/trunk/lib/CodeGen: CGCXX.cpp CodeGenFunction.h
Anders Carlsson
andersca at mac.com
Mon May 11 16:37:08 PDT 2009
Author: andersca
Date: Mon May 11 18:37:08 2009
New Revision: 71514
URL: http://llvm.org/viewvc/llvm-project?rev=71514&view=rev
Log:
Factor code that's common to EmitCXXMemberCallExpr and EmitCXXConstructorCall out into a EmitCXXMemberCall function.
Modified:
cfe/trunk/lib/CodeGen/CGCXX.cpp
cfe/trunk/lib/CodeGen/CodeGenFunction.h
Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=71514&r1=71513&r2=71514&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Mon May 11 18:37:08 2009
@@ -77,38 +77,51 @@
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 @@
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 @@
getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
const char *Name = getMangledCXXCtorName(D, Type);
+
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, D));
}
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=71514&r1=71513&r2=71514&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon May 11 18:37:08 2009
@@ -668,6 +668,13 @@
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,
More information about the cfe-commits
mailing list