diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-18 20:18:11 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-18 20:18:11 +0000 |
| commit | 406b117eea3b96fc13c9a2088ae305355dcf2e1e (patch) | |
| tree | 78b1b697a30f531fe773d0a6a0de5de2b1828e05 /clang/lib/CodeGen/CGObjCMac.cpp | |
| parent | 0b2732598c9beca83906644cdbb95040b7885aac (diff) | |
| download | bcm5719-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.cpp | 47 |
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() { |

