From: Anders Carlsson Date: Tue, 14 Apr 2009 16:58:56 +0000 (+0000) Subject: Support code generation of 'this' exprs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f4307b7ba164b03c853c8d3eb4674d33f8967a6;p=clang Support code generation of 'this' exprs git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69050 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index b491854af9..4df760d593 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -113,3 +113,14 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) { return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args), Callee, Args, MD); } + + +llvm::Value *CodeGenFunction::LoadCXXThis() { + assert(isa(CurFuncDecl) && + "Must be in a C++ member function decl to load 'this'"); + assert(cast(CurFuncDecl)->isInstance() && + "Must be in a C++ member function decl to load 'this'"); + + // FIXME: What if we're inside a block? + return Builder.CreateLoad(LocalDeclMap[CXXThisDecl], "this"); +} diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 928ad29ab7..98c41e24b6 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -256,9 +256,14 @@ public: return Visit(E->getSubExpr()); } Value *VisitUnaryOffsetOf(const UnaryOperator *E); + + // C++ Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { return Visit(DAE->getExpr()); } + Value *VisitCXXThisExpr(CXXThisExpr *TE) { + return CGF.LoadCXXThis(); + } // Binary Operators. Value *EmitMul(const BinOpInfo &Ops) { diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 4342332de2..e96b815dd5 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -454,6 +454,10 @@ public: // of a variable length array type. llvm::Value *GetVLASize(const VariableArrayType *); + /// LoadCXXThis - Load the value of 'this'. This function is only valid while + /// generating code for an C++ member function. + llvm::Value *LoadCXXThis(); + //===--------------------------------------------------------------------===// // Declaration Emission //===--------------------------------------------------------------------===//