From: Chris Lattner Date: Fri, 17 Apr 2009 22:12:36 +0000 (+0000) Subject: fix a crash compiling code with its own definition of objc_assign_weak. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96508e1fea58347b6401ca9a4728c0b268174603;p=clang fix a crash compiling code with its own definition of objc_assign_weak. rdar://6800430 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69392 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 5bb48e4e94..1f12d85a9f 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -92,7 +92,14 @@ public: llvm::Constant *GcReadWeakFn; /// GcAssignWeakFn -- LLVM objc_assign_weak function. - llvm::Constant *GcAssignWeakFn; + llvm::Constant *getGcAssignWeakFn() { + // id objc_assign_weak (id, id *) + std::vector Args(1, ObjectPtrTy); + Args.push_back(ObjectPtrTy->getPointerTo()); + llvm::FunctionType *FTy = + llvm::FunctionType::get(ObjectPtrTy, Args, false); + return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak"); + } /// GcAssignGlobalFn -- LLVM objc_assign_global function. llvm::Constant *GcAssignGlobalFn; @@ -2282,7 +2289,7 @@ void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - CGF.Builder.CreateCall2(ObjCTypes.GcAssignWeakFn, + CGF.Builder.CreateCall2(ObjCTypes.getGcAssignWeakFn(), src, dst, "weakassign"); return; } @@ -3278,13 +3285,12 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false); GcReadWeakFn = CGM.CreateRuntimeFunction(FTy, "objc_read_weak"); - // id objc_assign_weak (id, id *) + // id objc_assign_global (id, id *) Params.clear(); Params.push_back(IdType); Params.push_back(Ctx.getPointerType(IdType)); FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false); - GcAssignWeakFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_weak"); GcAssignGlobalFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_global"); GcAssignIvarFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar"); GcAssignStrongCastFn = @@ -5248,7 +5254,7 @@ void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - CGF.Builder.CreateCall2(ObjCTypes.GcAssignWeakFn, + CGF.Builder.CreateCall2(ObjCTypes.getGcAssignWeakFn(), src, dst, "weakassign"); return; } diff --git a/test/CodeGenObjC/runtime-fns.m b/test/CodeGenObjC/runtime-fns.m index c53b0a3213..0d85707999 100644 --- a/test/CodeGenObjC/runtime-fns.m +++ b/test/CodeGenObjC/runtime-fns.m @@ -25,4 +25,9 @@ void f0(id x) { id objc_msgSend(int x) { return 0; } + +// rdar://6800430 +void objc_assign_weak(id value, id *location) { +} + #endif