diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-13 00:42:52 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-13 00:42:52 +0000 |
| commit | 1b074a3eb769d900d45ff56b8aca057c910399ed (patch) | |
| tree | 42ceccab14a004e2a602cc7f96d88a78fb23955a /clang | |
| parent | a1e619330fd141067bb56b2513af9d9f4c058e7e (diff) | |
| download | bcm5719-llvm-1b074a3eb769d900d45ff56b8aca057c910399ed.tar.gz bcm5719-llvm-1b074a3eb769d900d45ff56b8aca057c910399ed.zip | |
Fixed an ir-gen bug related to strong-cast generation of
source being a non-pointer.
llvm-svn: 66854
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 32 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/objc2-strong-cast.m | 17 |
2 files changed, 49 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index a64b1af4f2e..10c874f5050 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -2239,6 +2239,10 @@ llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignWeakFn, @@ -2252,6 +2256,10 @@ void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignGlobalFn, @@ -2265,6 +2273,10 @@ void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignIvarFn, @@ -2278,6 +2290,10 @@ void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignStrongCastFn, @@ -5096,6 +5112,10 @@ llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CGBuilderTy &Builder, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignIvarFn, @@ -5110,6 +5130,10 @@ void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign( CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dst) { + if (!isa<llvm::PointerType>(src->getType())) { + src = CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignStrongCastFn, @@ -5139,6 +5163,10 @@ llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead( 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignWeakFn, @@ -5152,6 +5180,10 @@ void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 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); + src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); + } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); CGF.Builder.CreateCall2(ObjCTypes.GcAssignGlobalFn, diff --git a/clang/test/CodeGenObjC/objc2-strong-cast.m b/clang/test/CodeGenObjC/objc2-strong-cast.m new file mode 100644 index 00000000000..acc5d3f9816 --- /dev/null +++ b/clang/test/CodeGenObjC/objc2-strong-cast.m @@ -0,0 +1,17 @@ +// RUN: clang -fnext-runtime -emit-llvm -o %t %s + +@interface I { + __attribute__((objc_gc(strong))) signed long *_documentIDs; + __attribute__((objc_gc(strong))) id *IdocumentIDs; +} +- (void) _getResultsOfMatches; +@end + +@implementation I +-(void) _getResultsOfMatches { + _documentIDs[2] = _documentIDs[3]; + IdocumentIDs[2] = IdocumentIDs[3]; +} + +@end + |

