[cfe-commits] r82091 - /cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m

Fariborz Jahanian fjahanian at apple.com
Wed Sep 16 16:30:59 PDT 2009


Author: fjahanian
Date: Wed Sep 16 18:30:59 2009
New Revision: 82091

URL: http://llvm.org/viewvc/llvm-project?rev=82091&view=rev
Log:
Test for variety of write-barriers.


Added:
    cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m

Added: cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m?rev=82091&view=auto

==============================================================================
--- cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m (added)
+++ cfe/trunk/test/CodeGenObjC/objc2-write-barrier.m Wed Sep 16 18:30:59 2009
@@ -0,0 +1,114 @@
+// RUN: clang-cc -fnext-runtime -fobjc-gc -fobjc-newgc-api -emit-llvm -o %t %s &&
+// RUN: grep -F '@objc_assign_global' %t  | count 21 &&
+// RUN: grep -F '@objc_assign_ivar' %t  | count 11 &&
+// RUN: true
+
+
+typedef const struct __CFDictionary * CFDictionaryRef;
+
+// callouts to these are generated with cc -fobjc-gc
+
+int GlobalAssigns;
+int IvarAssigns;
+int StrongCastAssigns;
+
+
+// The test case elements;
+ at class NSObject;
+ at class NSString;
+
+typedef struct {
+  id  element;
+  id elementArray[10];
+  __strong CFDictionaryRef cfElement;
+  __strong CFDictionaryRef cfElementArray[10];
+} struct_with_ids_t;
+
+ at interface Foo  {
+ at public
+// assignments to any/all of these fields should generate objc_assign_ivar
+  __strong CFDictionaryRef dict;
+  __strong CFDictionaryRef dictArray[3];
+  id ivar;
+  id array[10];
+  NSObject *nsobject;
+  NSString *stringArray[10];
+  struct_with_ids_t inner;
+}
+
+ at end
+
+// assignments to these should generate objc_assign_global
+id GlobalId;
+id GlobalArray[20];
+NSObject *GlobalObject;
+NSObject *GlobalObjectArray[20];
+__strong CFDictionaryRef Gdict;
+__strong CFDictionaryRef Gdictarray[10];
+struct_with_ids_t GlobalStruct;
+struct_with_ids_t GlobalStructArray[10];
+
+
+// The test cases
+void *rhs = 0;
+
+#define ASSIGNTEST(expr, global) expr = rhs
+
+int testGlobals() {
+  // Everything in this function generates assign_global intercepts
+  int counter = 0;
+
+  static id staticGlobalId;
+  static id staticGlobalArray[20];
+  static NSObject *staticGlobalObject;
+  static NSObject *staticGlobalObjectArray[20];
+  static __strong CFDictionaryRef staticGdict;
+  static __strong CFDictionaryRef staticGdictarray[10];
+  static struct_with_ids_t staticGlobalStruct;
+  static struct_with_ids_t staticGlobalStructArray[10];
+
+  ASSIGNTEST(GlobalId, GlobalAssigns);				// objc_assign_global
+  ASSIGNTEST(GlobalArray[0], GlobalAssigns);			// objc_assign_global
+  ASSIGNTEST(GlobalObject, GlobalAssigns);			// objc_assign_global
+  ASSIGNTEST(GlobalObjectArray[0], GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(Gdict, GlobalAssigns);				// objc_assign_global
+  ASSIGNTEST(Gdictarray[1], GlobalAssigns);			// objc_assign_global
+
+  ASSIGNTEST(GlobalStruct.element, GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(GlobalStruct.elementArray[0], GlobalAssigns);	// objc_assign_global
+  ASSIGNTEST(GlobalStruct.cfElement, GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(GlobalStruct.cfElementArray[0], GlobalAssigns);	// objc_assign_global
+
+  ASSIGNTEST(staticGlobalId, GlobalAssigns);			// objc_assign_global
+  ASSIGNTEST(staticGlobalArray[0], GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(staticGlobalObject, GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(staticGlobalObjectArray[0], GlobalAssigns);	// objc_assign_global
+  ASSIGNTEST(staticGdict, GlobalAssigns);			// objc_assign_global
+  ASSIGNTEST(staticGdictarray[1], GlobalAssigns);		// objc_assign_global
+
+  ASSIGNTEST(staticGlobalStruct.element, GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(staticGlobalStruct.elementArray[0], GlobalAssigns);	// objc_assign_global
+  ASSIGNTEST(staticGlobalStruct.cfElement, GlobalAssigns);		// objc_assign_global
+  ASSIGNTEST(staticGlobalStruct.cfElementArray[0], GlobalAssigns);	// objc_assign_global
+    
+  return counter;
+}
+
+
+int testIvars() {
+  Foo *foo;
+  int counter = 0;
+
+  ASSIGNTEST(foo->ivar, IvarAssigns);					// objc_assign_ivar
+  ASSIGNTEST(foo->dict, IvarAssigns);					// objc_assign_ivar
+  ASSIGNTEST(foo->dictArray[0], IvarAssigns);				// objc_assign_ivar
+  ASSIGNTEST(foo->array[0], IvarAssigns);				// objc_assign_ivar
+  ASSIGNTEST(foo->nsobject, IvarAssigns);				// objc_assign_ivar
+  ASSIGNTEST(foo->stringArray[0], IvarAssigns);				// objc_assign_ivar
+  ASSIGNTEST(foo->inner.element, IvarAssigns);				// objc_assign_ivar
+  ASSIGNTEST(foo->inner.elementArray[0], IvarAssigns);			// objc_assign_ivar
+  ASSIGNTEST(foo->inner.cfElement, IvarAssigns);			// objc_assign_ivar
+  ASSIGNTEST(foo->inner.cfElementArray[0], IvarAssigns);		// objc_assign_ivar
+
+  return counter;
+}





More information about the cfe-commits mailing list