[cfe-commits] r68412 - in /cfe/trunk/lib/CodeGen: CGCXX.cpp CGExpr.cpp CodeGenFunction.h
Anders Carlsson
andersca at mac.com
Fri Apr 3 15:50:25 PDT 2009
Author: andersca
Date: Fri Apr 3 17:50:24 2009
New Revision: 68412
URL: http://llvm.org/viewvc/llvm-project?rev=68412&view=rev
Log:
Add support for calling C++ member functions.
Modified:
cfe/trunk/lib/CodeGen/CGCXX.cpp
cfe/trunk/lib/CodeGen/CGExpr.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=68412&r1=68411&r2=68412&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Fri Apr 3 17:50:24 2009
@@ -17,6 +17,7 @@
#include "CodeGenModule.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
+#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "llvm/ADT/StringExtras.h"
using namespace clang;
@@ -135,3 +136,43 @@
EmitBlock(EndBlock);
}
+RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
+ const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
+ const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
+ assert(MD->isInstance() &&
+ "Trying to emit a member call expr on a static method!");
+
+ bool IsVariadic = MD->getType()->getAsFunctionProtoType()->isVariadic();
+ const llvm::Type *Ty =
+ CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
+ IsVariadic);
+
+ llvm::Constant *Callee = CGM.GetAddrOfFunction(MD, Ty);
+
+ llvm::Value *BaseValue = 0;
+
+ // There's a deref operator node added in Sema::BuildCallToMemberFunction
+ // that's giving the wrong type for -> call exprs so we just ignore them
+ // for now.
+ if (ME->isArrow())
+ return EmitUnsupportedRValue(CE, "C++ member call expr");
+ else {
+ LValue BaseLV = EmitLValue(ME->getBase());
+ BaseValue = BaseLV.getAddress();
+ }
+
+ CallArgList Args;
+
+ // Push the 'this' pointer.
+ Args.push_back(std::make_pair(RValue::get(BaseValue),
+ MD->getThisType(getContext())));
+
+ for (CallExpr::const_arg_iterator I = CE->arg_begin(), E = CE->arg_end();
+ I != E; ++I)
+ Args.push_back(std::make_pair(EmitAnyExprToTemp(*I), I->getType()));
+
+ QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
+ return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
+ Callee, Args, MD);
+ return EmitUnsupportedRValue(CE, "C++ member call expr");
+}
Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=68412&r1=68411&r2=68412&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Apr 3 17:50:24 2009
@@ -1062,6 +1062,9 @@
if (E->getCallee()->getType()->isBlockPointerType())
return EmitBlockCallExpr(E);
+ if (const CXXMemberCallExpr *CE = dyn_cast<CXXMemberCallExpr>(E))
+ return EmitCXXMemberCallExpr(CE);
+
const Decl *TargetDecl = 0;
if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E->getCallee())) {
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr())) {
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=68412&r1=68411&r2=68412&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Apr 3 17:50:24 2009
@@ -653,6 +653,7 @@
const Decl *TargetDecl = 0);
RValue EmitCallExpr(const CallExpr *E);
+ RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E);
RValue EmitCallExpr(llvm::Value *Callee, QualType FnType,
CallExpr::const_arg_iterator ArgBeg,
More information about the cfe-commits
mailing list