[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