[cfe-commits] r68445 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/try.m
Chris Lattner
sabre at nondot.org
Mon Apr 6 09:53:47 PDT 2009
Author: lattner
Date: Mon Apr 6 11:53:45 2009
New Revision: 68445
URL: http://llvm.org/viewvc/llvm-project?rev=68445&view=rev
Log:
Fix a couple of cases where Constant* pointers can dangle in
ObjCNonFragileABITypesHelper by converting them to dynamic
getters. This fixes a crash on rdar://6757213. The others
should be converted over as well.
Added:
cfe/trunk/test/CodeGenObjC/try.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=68445&r1=68444&r2=68445&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Apr 6 11:53:45 2009
@@ -107,7 +107,13 @@
llvm::Constant *ExceptionThrowFn;
/// SyncEnterFn - LLVM object_sync_enter function.
- llvm::Constant *SyncEnterFn;
+ llvm::Constant *getSyncEnterFn() {
+ // void objc_sync_enter (id)
+ std::vector<const llvm::Type*> Args(1, ObjectPtrTy);
+ llvm::FunctionType *FTy =
+ llvm::FunctionType::get(llvm::Type::VoidTy, Args, false);
+ return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
+ }
/// SyncExitFn - LLVM object_sync_exit function.
llvm::Constant *SyncExitFn;
@@ -295,7 +301,14 @@
/// EHPersonalityPtr - LLVM value for an i8* to the Objective-C
/// exception personality function.
- llvm::Value *EHPersonalityPtr;
+ llvm::Value *getEHPersonalityPtr() {
+ llvm::Constant *Personality =
+ CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
+ std::vector<const llvm::Type*>(),
+ true),
+ "__objc_personality_v0");
+ return llvm::ConstantExpr::getBitCast(Personality, Int8PtrTy);
+ }
llvm::Constant *UnwindResumeOrRethrowFn, *ObjCBeginCatchFn, *ObjCEndCatchFn;
@@ -2012,7 +2025,7 @@
SyncArg =
CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
- CGF.Builder.CreateCall(ObjCTypes.SyncEnterFn, SyncArg);
+ CGF.Builder.CreateCall(ObjCTypes.getSyncEnterFn(), SyncArg);
}
// Push an EH context entry, used for handling rethrows and jumps
@@ -3277,13 +3290,11 @@
CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
// synchronized APIs
- // void objc_sync_enter (id)
// void objc_sync_exit (id)
Params.clear();
Params.push_back(IdType);
FTy = Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
- SyncEnterFn = CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
SyncExitFn = CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
}
@@ -3875,14 +3886,6 @@
"objc_msgSendSuper2_stret_fixup");
Params.clear();
- llvm::Constant *Personality =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
- Params,
- true),
- "__objc_personality_v0");
- EHPersonalityPtr = llvm::ConstantExpr::getBitCast(Personality, Int8PtrTy);
-
- Params.clear();
Params.push_back(Int8PtrTy);
UnwindResumeOrRethrowFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
@@ -5280,7 +5283,7 @@
SyncArg =
CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
- CGF.Builder.CreateCall(ObjCTypes.SyncEnterFn, SyncArg);
+ CGF.Builder.CreateCall(ObjCTypes.getSyncEnterFn(), SyncArg);
}
// Push an EH context entry, used for handling rethrows and jumps
@@ -5309,7 +5312,7 @@
llvm::SmallVector<llvm::Value*, 8> SelectorArgs;
SelectorArgs.push_back(Exc);
- SelectorArgs.push_back(ObjCTypes.EHPersonalityPtr);
+ SelectorArgs.push_back(ObjCTypes.getEHPersonalityPtr());
// Construct the lists of (type, catch body) to handle.
llvm::SmallVector<std::pair<const ParmVarDecl*, const Stmt*>, 8> Handlers;
@@ -5427,7 +5430,7 @@
// though we don't use the result.
llvm::SmallVector<llvm::Value*, 8> Args;
Args.push_back(Exc);
- Args.push_back(ObjCTypes.EHPersonalityPtr);
+ Args.push_back(ObjCTypes.getEHPersonalityPtr());
Args.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty,
0));
CGF.Builder.CreateCall(llvm_eh_selector_i64, Args.begin(), Args.end());
@@ -5459,7 +5462,7 @@
// though we don't use the result.
Args.clear();
Args.push_back(Exc);
- Args.push_back(ObjCTypes.EHPersonalityPtr);
+ Args.push_back(ObjCTypes.getEHPersonalityPtr());
Args.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty,
0));
CGF.Builder.CreateCall(llvm_eh_selector_i64, Args.begin(), Args.end());
Added: cfe/trunk/test/CodeGenObjC/try.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/try.m?rev=68445&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/try.m (added)
+++ cfe/trunk/test/CodeGenObjC/try.m Mon Apr 6 11:53:45 2009
@@ -0,0 +1,9 @@
+// RUN: clang %s -S -o - -mtriple=i686-apple-darwin9 &&
+// RUN: clang %s -S -o - -mtriple=x86_64-apple-darwin9
+
+// rdar://6757213 - Don't crash if the internal proto for
+// __objc_personality_v0 mismatches with an actual one.
+void __objc_personality_v0() { }
+void test1(void) {
+ @try { } @catch (...) { }
+}
More information about the cfe-commits
mailing list