Support code generation of 'this' exprs
authorAnders Carlsson <andersca@mac.com>
Tue, 14 Apr 2009 16:58:56 +0000 (16:58 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 14 Apr 2009 16:58:56 +0000 (16:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69050 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CodeGenFunction.h

index b491854af9ec9f5fb5bd6d937eb0b702de6e4dcc..4df760d59329b1d9fbe6a804f1037bfeeeb1334f 100644 (file)
@@ -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<CXXMethodDecl>(CurFuncDecl) && 
+         "Must be in a C++ member function decl to load 'this'");
+  assert(cast<CXXMethodDecl>(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");
+}
index 928ad29ab7982da4f73d3da5b3587632bd56496a..98c41e24b6a45d1a6f1c2f0747f25e4438865d15 100644 (file)
@@ -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) {
index 4342332de2a188ae7ec5791b051e916fca80de74..e96b815dd5e33c0ff0726e32336d4871f7c3138c 100644 (file)
@@ -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
   //===--------------------------------------------------------------------===//