]> git.ozlabs.org Git - ccan/blobdiff - tools/configurator/configurator.c
configurator: Return pointer difference as ptrdiff_t
[ccan] / tools / configurator / configurator.c
index 021fc0f9f183a711f67231625dc04da3c615440d..c7577c0cb661f028585d1aac397af363a6e7cb4e 100644 (file)
 #define OUTPUT_FILE "configurator.out"
 #define INPUT_FILE "configuratortest.c"
 
+#ifdef _WIN32
+#define DIR_SEP   "\\"
+#else
+#define DIR_SEP   "/"
+#endif
+
 static int verbose;
 
 enum test_style {
@@ -62,7 +68,7 @@ struct test {
 };
 
 static struct test tests[] = {
-       { "HAVE_32BIT_OFF_T", DEFINES_EVERYTHING|EXECUTE, NULL, NULL,
+       { "HAVE_32BIT_OFF_T", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE, NULL, NULL,
          "#include <sys/types.h>\n"
          "int main(void) {\n"
          "     return sizeof(off_t) == 4 ? 0 : 1;\n"
@@ -167,7 +173,7 @@ static struct test tests[] = {
        { "HAVE_COMPOUND_LITERALS", INSIDE_MAIN, NULL, NULL,
          "int *foo = (int[]) { 1, 2, 3, 4 };\n"
          "return foo[0] ? 0 : 1;" },
-       { "HAVE_FCHDIR", DEFINES_EVERYTHING|EXECUTE, NULL, NULL,
+       { "HAVE_FCHDIR", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE, NULL, NULL,
          "#include <sys/types.h>\n"
          "#include <sys/stat.h>\n"
          "#include <fcntl.h>\n"
@@ -188,7 +194,7 @@ static struct test tests[] = {
          "     if (arg == 4)\n"
          "             warnx(\"warn %u\", arg);\n"
          "}\n" },
-       { "HAVE_FILE_OFFSET_BITS", DEFINES_EVERYTHING|EXECUTE,
+       { "HAVE_FILE_OFFSET_BITS", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE,
          "HAVE_32BIT_OFF_T", NULL,
          "#define _FILE_OFFSET_BITS 64\n"
          "#include <sys/types.h>\n"
@@ -196,8 +202,9 @@ static struct test tests[] = {
          "     return sizeof(off_t) == 8 ? 0 : 1;\n"
          "}\n" },
        { "HAVE_FOR_LOOP_DECLARATION", INSIDE_MAIN, NULL, NULL,
-         "for (int i = 0; i < argc; i++) { return 0; };\n"
-         "return 1;" },
+         "int ret = 1;\n"
+         "for (int i = 0; i < argc; i++) { ret = 0; };\n"
+         "return ret;" },
        { "HAVE_FLEXIBLE_ARRAY_MEMBER", OUTSIDE_MAIN, NULL, NULL,
          "struct foo { unsigned int x; int arr[]; };" },
        { "HAVE_GETPAGESIZE", DEFINES_FUNC, NULL, NULL,
@@ -234,7 +241,7 @@ static struct test tests[] = {
          "static void *func(int fd) {\n"
          "     return mmap(0, 65536, PROT_READ, MAP_SHARED, fd, 0);\n"
          "}" },
-       { "HAVE_PROC_SELF_MAPS", DEFINES_EVERYTHING|EXECUTE, NULL, NULL,
+       { "HAVE_PROC_SELF_MAPS", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE, NULL, NULL,
          "#include <sys/types.h>\n"
          "#include <sys/stat.h>\n"
          "#include <fcntl.h>\n"
@@ -271,7 +278,8 @@ static struct test tests[] = {
          "     return __stop_mysec - __start_mysec;\n"
          "}\n" },
        { "HAVE_STACK_GROWS_UPWARDS", DEFINES_EVERYTHING|EXECUTE, NULL, NULL,
-         "static long nest(const void *base, unsigned int i)\n"
+         "#include <stddef.h>\n"
+         "static ptrdiff_t nest(const void *base, unsigned int i)\n"
          "{\n"
          "     if (i == 0)\n"
          "             return (const char *)&i - (const char *)base;\n"
@@ -319,6 +327,52 @@ static struct test tests[] = {
          "-Werror -fopenmp" },
        { "HAVE_VALGRIND_MEMCHECK_H", OUTSIDE_MAIN, NULL, NULL,
          "#include <valgrind/memcheck.h>\n" },
+       { "HAVE_UCONTEXT", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE,
+         NULL, NULL,
+         "#include <ucontext.h>\n"
+         "static int x = 0;\n"
+         "static char stack[2048];\n"
+         "static ucontext_t a, b;\n"
+         "static void fn(void) {\n"
+         "     x |= 2;\n"
+         "     setcontext(&b);\n"
+         "     x |= 4;\n"
+         "}\n"
+         "int main(void) {\n"
+         "     x |= 1;\n"
+         "     getcontext(&a);\n"
+         "     a.uc_stack.ss_sp = stack;\n"
+         "     a.uc_stack.ss_size = sizeof(stack);\n"
+         "     makecontext(&a, fn, 0);\n"
+         "     swapcontext(&b, &a);\n"
+         "     return (x == 3) ? 0 : 1;\n"
+         "}\n"
+       },
+       { "HAVE_POINTER_SAFE_MAKECONTEXT", DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE,
+         "HAVE_UCONTEXT", NULL,
+         "#include <stddef.h>\n"
+         "#include <ucontext.h>\n"
+         "static int worked = 0;\n"
+         "static char stack[1024];\n"
+         "static ucontext_t a, b;\n"
+         "static void fn(void *p, void *q) {\n"
+         "     void *cp = &worked;\n"
+         "     void *cq = (void *)(~((ptrdiff_t)cp));\n"
+         "     if ((p == cp) && (q == cq))\n"
+         "             worked = 1;\n"
+         "     setcontext(&b);\n"
+         "}\n"
+         "int main(void) {\n"
+         "     void *ap = &worked;\n"
+         "     void *aq = (void *)(~((ptrdiff_t)ap));\n"
+         "     getcontext(&a);\n"
+         "     a.uc_stack.ss_sp = stack;\n"
+         "     a.uc_stack.ss_size = sizeof(stack);\n"
+         "     makecontext(&a, (void (*)(void))fn, 2, ap, aq);\n"
+         "     swapcontext(&b, &a);\n"
+         "     return worked ? 0 : 1;\n"
+         "}\n"
+       },
 };
 
 static char *grab_fd(int fd)
@@ -437,7 +491,7 @@ static bool run_test(const char *cmd, struct test *test)
                char *dep;
 
                /* Space-separated dependencies, could be ! for inverse. */
-               while ((len = strcspn(deps, " "))) {
+               while ((len = strcspn(deps, " ")) != 0) {
                        bool positive = true;
                        if (deps[len]) {
                                dep = strdup(deps);
@@ -539,7 +593,7 @@ static bool run_test(const char *cmd, struct test *test)
                free(output);
                /* We run INSIDE_MAIN tests for sanity checking. */
                if ((test->style & EXECUTE) || (test->style & INSIDE_MAIN)) {
-                       output = run("./" OUTPUT_FILE, &status);
+                       output = run("." DIR_SEP OUTPUT_FILE, &status);
                        if (!(test->style & EXECUTE) && status != 0)
                                errx(1, "Test for %s failed with %i:\n%s",
                                     test->name, status, output);
@@ -593,8 +647,8 @@ int main(int argc, const char *argv[])
                run_test(cmd, &tests[i]);
        free(cmd);
 
-       unlink(OUTPUT_FILE);
-       unlink(INPUT_FILE);
+       remove(OUTPUT_FILE);
+       remove(INPUT_FILE);
 
        printf("/* Generated by CCAN configurator */\n"
               "#ifndef CCAN_CONFIG_H\n"