[cfe-commits] r84800 - in /cfe/trunk: lib/CodeGen/CGExprScalar.cpp test/CodeGenCXX/ptr-to-datamember.cpp

Fariborz Jahanian fjahanian at apple.com
Wed Oct 21 16:45:42 PDT 2009


Author: fjahanian
Date: Wed Oct 21 18:45:42 2009
New Revision: 84800

URL: http://llvm.org/viewvc/llvm-project?rev=84800&view=rev
Log:
Code gen for '.*' binary expressions - WIP.


Modified:
    cfe/trunk/lib/CodeGen/CGExprScalar.cpp
    cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp

Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=84800&r1=84799&r2=84800&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Wed Oct 21 18:45:42 2009
@@ -106,6 +106,8 @@
     return 0;
   }
   Value *VisitExpr(Expr *S);
+  Value *VisitPointerToDataMemberBinaryExpr(const BinaryOperator *BExpr);
+  
   Value *VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
 
   // Leaves.
@@ -536,12 +538,37 @@
 //===----------------------------------------------------------------------===//
 
 Value *ScalarExprEmitter::VisitExpr(Expr *E) {
+  if (const BinaryOperator *BExpr = dyn_cast<BinaryOperator>(E))
+    if (BExpr->getOpcode() == BinaryOperator::PtrMemD)
+      return VisitPointerToDataMemberBinaryExpr(BExpr);
+  
   CGF.ErrorUnsupported(E, "scalar expression");
   if (E->getType()->isVoidType())
     return 0;
   return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
 }
 
+Value *ScalarExprEmitter::VisitPointerToDataMemberBinaryExpr(
+                                                    const BinaryOperator *E) {
+  Value *BaseV = EmitLValue(E->getLHS()).getAddress();
+  const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
+  BaseV = Builder.CreateBitCast(BaseV, i8Ty);
+  Value *OffsetV = EmitLoadOfLValue(E->getRHS());
+  const llvm::Type* ResultType = ConvertType(
+                                        CGF.getContext().getPointerDiffType());
+  OffsetV = Builder.CreateBitCast(OffsetV, ResultType);
+  Value *AddV = Builder.CreateInBoundsGEP(BaseV, OffsetV, "add.ptr");
+  QualType Ty = E->getRHS()->getType();
+  const MemberPointerType *MemPtrType = Ty->getAs<MemberPointerType>();
+  Ty = MemPtrType->getPointeeType();
+  const llvm::Type* PType = 
+  ConvertType(CGF.getContext().getPointerType(Ty));
+  AddV = Builder.CreateBitCast(AddV, PType);
+  LValue LV = LValue::MakeAddr(AddV, CGF.MakeQualifiers(Ty));
+  Value *InVal = CGF.EmitLoadOfLValue(LV, Ty).getScalarVal();
+  return InVal;
+}
+
 Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
   llvm::SmallVector<llvm::Constant*, 32> indices;
   for (unsigned i = 2; i < E->getNumSubExprs(); i++) {

Modified: cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp?rev=84800&r1=84799&r2=84800&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp Wed Oct 21 18:45:42 2009
@@ -19,6 +19,7 @@
 
 class A  : public B, public B1 {
 public:
+  A() : f(1.0), d(2.0), Ai(3) {}
   float f;
   double d;
   int Ai;
@@ -38,6 +39,5 @@
   printf("%d\n", &A::B1::iV);
   printf("%d\n", &A::B::V::iV);
   printf("%d\n", &A::B1::V::iV);
-  // FIXME. NYI
-  //  printf(" %d, %f, %f  \n", a1.*pa, a1.f, a1.d);
+  printf("%d, %f, %f  \n", a1.*pa, a1.*pf, a1.*pd);
 }





More information about the cfe-commits mailing list