[llvm-commits] [llvm-gcc-4.2] r54399 - in /llvm-gcc-4.2/trunk/gcc/testsuite: g++.apple/block-blocks-test-2.C g++.apple/block-blocks-test-3.C gcc.apple/block-blocks-test-1.c gcc.apple/block-blocks-test-2.c gcc.apple/block-blocks-test-3.c gcc.apple/block-blocks-test-4.c gcc.apple/block-blocks-test-5.c gcc.apple/block-blocks-test-6.c gcc.apple/block-blocks-test-7.c gcc.apple/block-blocks-test-8.c

Bill Wendling isanbard at gmail.com
Tue Aug 5 22:57:28 PDT 2008


Author: void
Date: Wed Aug  6 00:57:28 2008
New Revision: 54399

URL: http://llvm.org/viewvc/llvm-project?rev=54399&view=rev
Log:
Adding blocks tests from Apple GCC mainline

Added:
    llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-2.C
    llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-3.C
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-1.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-2.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-3.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-4.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-5.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-6.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-7.c
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-8.c

Added: llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-2.C
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/g%2B%2B.apple/block-blocks-test-2.C?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-2.C (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-2.C Wed Aug  6 00:57:28 2008
@@ -0,0 +1,19 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+
+int main() {
+   __byref  int X = 1234;
+   __byref  const char * message = "HELLO";
+
+   X = X - 1234;
+
+   X += 1;
+
+   printf ("%s(%d)\n", message, X);
+   X -= 1;
+
+   return X;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-3.C
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/g%2B%2B.apple/block-blocks-test-3.C?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-3.C (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-blocks-test-3.C Wed Aug  6 00:57:28 2008
@@ -0,0 +1,15 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+
+int main() {
+   __byref  int X = 1234;
+   __byref  const char * message = "HELLO\n";
+
+   X = X - 1234;
+
+   printf ("%s\n", message);
+   return X;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-1.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-1.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-1.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-1.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,15 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do compile } */
+
+__byref  int X; /* { dg-warning "__byref attribute is only allowed on local variables - ignored" } */
+
+int foo(__byref int param) { /* { dg-warning "byref attribute can be specified on variables only - ignored" } */
+  __byref int OK = 1;
+
+  extern __byref double extern_var;	/* { dg-warning "__byref attribute is only allowed on local variables - ignored" } */
+  if (X) {
+	static __byref char * pch;	/* { dg-warning "__byref attribute is only allowed on local variables - ignored" } */
+  }
+  return OK - 1;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-2.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-2.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-2.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-2.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,20 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+void _Block_byref_release(void*src){}
+
+int main() {
+   __byref  int X = 1234;
+   __byref  const char * message = "HELLO";
+
+   X = X - 1234;
+
+   X += 1;
+
+   printf ("%s(%d)\n", message, X);
+   X -= 1;
+
+   return X;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-3.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-3.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-3.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-3.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,16 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+void _Block_byref_release(void*src){}
+
+int main() {
+   __byref  int X = 1234;
+   __byref  const char * message = "HELLO\n";
+
+   X = X - 1234;
+
+   printf ("%s\n", message);
+   return X;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-4.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-4.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-4.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-4.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,17 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+void * _NSConcreteStackBlock;
+void _Block_byref_assign_copy(void * dst, void *src){}
+void _Block_byref_release(void*src){}
+
+int main() {
+   __byref  int X = 1234;
+
+   int (^CP)(void) = ^{ |X| X = X+1;  return X; }; /* { dg-warning "has been deprecated in blocks" } */
+   CP();
+   printf ("X = %d\n", X);
+   return X - 1235;
+}

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-5.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-5.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-5.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-5.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,38 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+void * _NSConcreteStackBlock;
+void _Block_byref_assign_copy(void * dst, void *src){}
+void _Block_byref_release(void*src){}
+extern void exit(int);
+
+typedef double (^myblock)(int);
+
+
+double test(myblock I) {
+  return I(42);
+}
+
+int main() {
+  int x = 1;
+  __byref int y = 2;
+  __byref br_x;
+  int y1;
+  double res = test(^(int z){|y| y = x+z; return (double)x; }); /* { dg-warning "has been deprecated in blocks" } */
+  printf("result = %f  x = %d y = %d\n", res, x, y);
+  if (x != 1 || y != 43)
+   exit(1);
+
+  br_x = x;
+  y1 = y;
+
+  res = test(^(int z){|br_x| br_x = br_x+z; return (double)y1; }); /* { dg-warning "has been deprecated in blocks" } */
+  printf("result = %f  br_x = %d y1 = %d\n", res, br_x, y1);
+  if (br_x != 43 || y1 != 43)
+    exit(1);
+
+  return 0;
+}
+

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-6.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-6.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-6.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-6.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,32 @@
+/* APPLE LOCAL file 5932809 */
+/* { dg-options "-fblocks" } */
+/* { dg-do run } */
+
+#include <stdio.h>
+void * _NSConcreteStackBlock;
+void _Block_byref_assign_copy(void * dst, void *src){}
+void _Block_byref_release(void*src){}
+extern void exit(int);
+
+typedef double (^myblock)(int);
+
+
+double test(myblock I) {
+  return I(42);
+}
+
+int main() {
+  __byref int x = 1;
+  __byref int y = 2;
+  double res = test(^(int z){|y| y = x+z; return (double)x; }); /* { dg-warning "has been deprecated in blocks" } */
+  printf("result = %f  x = %d y = %d\n", res, x, y);
+  if (x != 1 || y != 43)
+   exit(1);
+
+  res = test(^(int z){|x| x = x+z; return (double)y; }); /* { dg-warning "has been deprecated in blocks" } */
+  printf("result = %f  x = %d y = %d\n", res, x, y);
+  if (x != 43 || y != 43)
+    exit(1);
+  return 0;
+}
+

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-7.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-7.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-7.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-7.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,41 @@
+/* APPLE LOCAL file radar 5932809 */
+/* { dg-do run } */
+/* { dg-options "-mmacosx-version-min=10.5 -ObjC -lobjc" { target *-*-darwin* } } */
+
+#include <stdio.h>
+
+void * _NSConcreteStackBlock;
+void _Block_byref_assign_copy(void * dst, void *src){}
+void _Block_byref_release(void*src){}
+
+
+int i;
+
+int foo() {
+   __byref  id FFFFFF;
+   __byref  id Q;
+   ^{ |FFFFFF| FFFFFF = 0; }; /* { dg-warning "has been deprecated in blocks" } */
+
+   if (i)
+   {
+     __byref  id FFFFFF;
+     __byref  id Q;
+     ^{ |FFFFFF| FFFFFF = 0; }; /* { dg-warning "has been deprecated in blocks" } */
+   }
+}
+
+int main() {
+   __byref  id X;
+   __byref  id X1;
+   ^{ |X| X = 0; }; /* { dg-warning "has been deprecated in blocks" } */
+
+   if (i)
+   {
+     __byref  id X;
+     __byref  id X1;
+     ^{ |X| X = 0; }; /* { dg-warning "has been deprecated in blocks" } */
+   }
+   return 0;
+}
+
+

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-8.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-8.c?rev=54399&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-8.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-blocks-test-8.c Wed Aug  6 00:57:28 2008
@@ -0,0 +1,123 @@
+/* APPLE LOCAL file radar 5932809 */
+/* Test the __byreg runtime features. */
+/* { dg-options "-mmacosx-version-min=10.5 -ObjC -framework Foundation" { target i?86-*-darwin*  } } */
+/* { dg-do run { target i?86-*-darwin* } } */
+/* { dg-skip-if "" { *-*-darwin* } { "-m64" } { "" } } */
+
+#import <Foundation/Foundation.h>
+
+void * _NSConcreteStackBlock;
+
+int CalledRetain = 0;
+
+id objc_msgSend(id target, SEL cmd) {
+    printf("[%p %s] called\n", target, sel_getName(cmd));
+    if (!strcmp(sel_getName(cmd), "retain")) {
+        CalledRetain = 1;
+    }
+    return target;
+}
+
+ at interface DumbObject {
+ at public
+    id isa;
+}
+ at end
+id newDumbObject() {
+    DumbObject *result = (DumbObject *)calloc(sizeof(DumbObject), 1);
+    result->isa = objc_getClass("DumbObject");
+    return result;
+}
+
+ at implementation DumbObject
++ new {
+    return newDumbObject();
+}
++ (void) initialize { }
+- forward:(SEL)msg :(long *)params {
+    printf("forward:: with %s called\n", sel_getName(msg));
+    return self;
+}
+ at end
+
+//#include <Block_private.h>
+
+enum {
+    BLOCK_NEEDS_FREE =        (1 << 24),
+    BLOCK_HAS_COPY_DISPOSE =  (1 << 25),
+    BLOCK_NO_COPY =           (1 << 26), // interim byref: no copies allowed
+    BLOCK_IS_GC =             (1 << 27),
+};
+
+struct Block_basic {
+    void *isa;
+    int Block_flags;  // int32_t
+    int Block_size; // XXX should be packed into Block_flags
+    void (*Block_invoke)(void *);
+    void (*Block_copy)(void *dst, void *src);
+    void (*Block_dispose)(void *);
+    //long params[0];  // generic space for const & byref hidden params, return value, variable on needs of course
+};
+struct Block_byref {
+    //long reserved;
+    struct Block_byref *forwarding;
+    int flags;//refcount;
+    int size;
+    void (*byref_keep)(struct Block_byref *dst, struct Block_byref *src);
+    void (*byref_destroy)(struct Block_byref *);
+    // long shared[0];
+};
+
+
+int ByrefAssignCopy = 0;
+
+void _Block_byref_assign_copy(void *destp, void *source) {
+    struct Block_byref *src = (struct Block_byref *)source;
+    ByrefAssignCopy = 1;
+    // lets look at the Block_byref
+    if ((src->flags & BLOCK_HAS_COPY_DISPOSE) == 0) {
+        printf("byref data block does not have bit saying that copy/dispose helper routines are present\n");
+        return;
+    }
+    printf("calling out to byref copy helper at %p\n", src->byref_keep);
+    int junk[100];
+    src->byref_keep((struct Block_byref *)junk, src);
+}
+
+void _Block_byref_release(void *source) {
+    struct Block_byref *src = source;
+    src->byref_destroy(src);
+}
+
+int main(int argc, char *argv[]) {
+    id __byref dumbo = newDumbObject(); //[DumbObject new];
+    void (^dummy)(void) = ^{ | dumbo | /* { dg-warning "has been deprecated in blocks" } */
+        [dumbo self];
+    };
+
+    struct Block_basic *aBlock = (struct Block_basic *)(void *)dummy;
+    if ((aBlock->Block_flags & BLOCK_HAS_COPY_DISPOSE) == 0) {
+        printf("Block should have a NON_POD copy/destroy helpers and flags to say so, but doesn't\n");
+        return 1;
+    }
+
+    char result[200];
+    printf("calling out to copy support helper at %p\n", aBlock->Block_copy);
+    (*aBlock->Block_copy)(result, aBlock); // do fixup
+
+    // The copy/destroy helper should have had a callout  to _Block_byref_assign_copy for its byref block
+    if (! ByrefAssignCopy) {
+        printf("_Block_copy_assign not called\n");
+        return 1;
+    }
+
+    // the copy/destroy helper of the byref should have done dst->object = [src->object retain]
+    if (! CalledRetain) {
+        printf("byref block support helper did not call retain\n");
+        return 1;
+    }
+
+    (*aBlock->Block_dispose)(aBlock);
+
+    return 0;
+}





More information about the llvm-commits mailing list