[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