Handle mutation while enumerating correctly. Fix some bugs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55583 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index ef4196e..798c9d3 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -130,6 +130,7 @@
/// MethodListPtrTy - LLVM type for struct objc_method_list *.
const llvm::Type *MethodListPtrTy;
+ llvm::Function *EnumerationMutationFn;
public:
ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
~ObjCTypesHelper();
@@ -370,6 +371,7 @@
virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
virtual llvm::Function *ModuleInitFunction();
+ virtual llvm::Function *EnumerationMutationFunction();
};
} // end anonymous namespace
@@ -1379,6 +1381,11 @@
return NULL;
}
+llvm::Function *CGObjCMac::EnumerationMutationFunction()
+{
+ return ObjCTypes.EnumerationMutationFn;
+}
+
/* *** Private Interface *** */
/// EmitImageInfo - Emit the image info marker used to encode some module
@@ -1934,6 +1941,18 @@
llvm::Function::ExternalLinkage,
"objc_msgSendSuper_stret",
&CGM.getModule());
+
+ // Enumeration mutation.
+
+ Params.clear();
+ Params.push_back(ObjectPtrTy);
+ EnumerationMutationFn =
+ llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
+ Params,
+ false),
+ llvm::Function::ExternalLinkage,
+ "objc_enumerationMutation",
+ &CGM.getModule());
}
ObjCTypesHelper::~ObjCTypesHelper() {