[cfe-commits] r67551 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/objc2-strong-cast-1.m

Fariborz Jahanian fjahanian at apple.com
Mon Mar 23 12:10:40 PDT 2009


Author: fjahanian
Date: Mon Mar 23 14:10:40 2009
New Revision: 67551

URL: http://llvm.org/viewvc/llvm-project?rev=67551&view=rev
Log:
Must allow for strong cast of floats as well (objc2 gc).


Added:
    cfe/trunk/test/CodeGenObjC/objc2-strong-cast-1.m
Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Mar 23 14:10:40 2009
@@ -41,7 +41,7 @@
   CodeGen::CodeGenModule &CGM;
   
 public:
-  const llvm::Type *ShortTy, *IntTy, *LongTy;
+  const llvm::Type *ShortTy, *IntTy, *LongTy, *LongLongTy;
   const llvm::Type *Int8PtrTy;
   
   /// ObjectPtrTy - LLVM type for object handles (typeof(id))
@@ -2238,8 +2238,12 @@
 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
                                    llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+    : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -2255,8 +2259,12 @@
 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
                                      llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+    : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -2272,8 +2280,12 @@
 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
                                    llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+    : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -2289,8 +2301,12 @@
 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                          llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+                      : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -3087,6 +3103,7 @@
   ShortTy = Types.ConvertType(Ctx.ShortTy);
   IntTy = Types.ConvertType(Ctx.IntTy);
   LongTy = Types.ConvertType(Ctx.LongTy);
+  LongLongTy = Types.ConvertType(Ctx.LongLongTy);
   Int8PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
   
   ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
@@ -5112,8 +5129,12 @@
 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
                                    llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+           : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -5130,8 +5151,12 @@
                                          CodeGen::CodeGenFunction &CGF,
                                          llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+                     : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -5163,8 +5188,12 @@
 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
                                    llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+           : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
@@ -5180,8 +5209,12 @@
 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
                                      llvm::Value *src, llvm::Value *dst)
 {
-  if (!isa<llvm::PointerType>(src->getType())) {
-    src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy);
+  const llvm::Type * SrcTy = src->getType();
+  if (!isa<llvm::PointerType>(SrcTy)) {
+    unsigned Size = CGM.getTargetData().getTypePaddedSize(SrcTy);
+    assert(Size <= 8 && "does not support size > 8");
+    src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
+           : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   }
   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);

Added: cfe/trunk/test/CodeGenObjC/objc2-strong-cast-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/objc2-strong-cast-1.m?rev=67551&view=auto

==============================================================================
--- cfe/trunk/test/CodeGenObjC/objc2-strong-cast-1.m (added)
+++ cfe/trunk/test/CodeGenObjC/objc2-strong-cast-1.m Mon Mar 23 14:10:40 2009
@@ -0,0 +1,23 @@
+// RUN: clang -triple x86_64-unknown-unknown -fobjc-gc -emit-llvm -o %t %s
+
+ at interface I {
+  __attribute__((objc_gc(strong))) int *i_IdocumentIDs;
+  __attribute__((objc_gc(strong))) long *l_IdocumentIDs;
+  __attribute__((objc_gc(strong))) long long *ll_IdocumentIDs;
+  __attribute__((objc_gc(strong))) float *IdocumentIDs;
+  __attribute__((objc_gc(strong))) double *d_IdocumentIDs;
+}
+- (void) _getResultsOfMatches;
+ at end
+
+ at implementation I
+-(void) _getResultsOfMatches {
+    IdocumentIDs[2] = IdocumentIDs[3];
+    d_IdocumentIDs[2] = d_IdocumentIDs[3];
+    l_IdocumentIDs[2] = l_IdocumentIDs[3];
+    ll_IdocumentIDs[2] = ll_IdocumentIDs[3];
+    i_IdocumentIDs[2] = i_IdocumentIDs[3];
+}
+
+ at end
+





More information about the cfe-commits mailing list