summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-11-18 20:18:11 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-11-18 20:18:11 +0000
commit406b117eea3b96fc13c9a2088ae305355dcf2e1e (patch)
tree78b1b697a30f531fe773d0a6a0de5de2b1828e05 /clang/lib/CodeGen/CGObjCMac.cpp
parent0b2732598c9beca83906644cdbb95040b7885aac (diff)
downloadbcm5719-llvm-406b117eea3b96fc13c9a2088ae305355dcf2e1e.tar.gz
bcm5719-llvm-406b117eea3b96fc13c9a2088ae305355dcf2e1e.zip
Some basic support toward objective-c's GC code gen.
llvm-svn: 59543
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjCMac.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index a8f6bbab9b4..15918314585 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -51,6 +51,10 @@ public:
/// ObjectPtrTy - LLVM type for object handles (typeof(id))
const llvm::Type *ObjectPtrTy;
+
+ /// PtrObjectPtrTy - LLVM type for id *
+ const llvm::Type *PtrObjectPtrTy;
+
/// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
const llvm::Type *SelectorPtrTy;
/// ProtocolPtrTy - LLVM type for external protocol handles
@@ -162,6 +166,18 @@ public:
/// SyncExitFn - LLVM object_sync_exit function.
llvm::Function *SyncExitFn;
+ /// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
+ llvm::Function *GcReadWeakFn;
+
+ /// GcAssignWeakFn -- LLVM objc_assign_weak function.
+ llvm::Function *GcAssignWeakFn;
+
+ /// GcAssignGlobalFn -- LLVM objc_assign_global function.
+ llvm::Function *GcAssignGlobalFn;
+
+ /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
+ llvm::Function *GcAssignStrongCastFn;
+
public:
ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
~ObjCTypesHelper();
@@ -2191,6 +2207,7 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
Int8PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
+ PtrObjectPtrTy = llvm::PointerType::getUnqual(ObjectPtrTy);
SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType());
// FIXME: It would be nice to unify this with the opaque type, so
@@ -2538,6 +2555,36 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
Params,
false),
"_setjmp");
+
+ // gc's API
+ // id objc_read_weak (id *)
+ Params.clear();
+ Params.push_back(PtrObjectPtrTy);
+ GcReadWeakFn =
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ "objc_read_weak");
+ // id objc_assign_weak (id, id *)
+ Params.clear();
+ Params.push_back(ObjectPtrTy);
+ Params.push_back(PtrObjectPtrTy);
+ GcAssignWeakFn =
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ "objc_assign_weak");
+ GcAssignGlobalFn =
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ "objc_assign_global");
+ GcAssignStrongCastFn =
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ "objc_assign_strongCast");
+
}
ObjCTypesHelper::~ObjCTypesHelper() {
OpenPOWER on IntegriCloud