Repository: lucy-clownfish Updated Branches: refs/heads/master 088a359d3 -> 3f3e9b461
Add support for C11 stdatomic.h Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/3f3e9b46 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/3f3e9b46 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/3f3e9b46 Branch: refs/heads/master Commit: 3f3e9b4613e02b6ba5caaa4524478f24c13e9106 Parents: 088a359 Author: Nick Wellnhofer <wellnho...@aevum.de> Authored: Wed Feb 8 15:42:30 2017 +0100 Committer: Nick Wellnhofer <wellnho...@aevum.de> Committed: Wed Feb 8 15:42:30 2017 +0100 ---------------------------------------------------------------------- compiler/common/charmonizer.c | 40 +++++++++++++------------------ runtime/common/charmonizer.c | 40 +++++++++++++------------------ runtime/core/Clownfish/Util/Atomic.h | 10 ++++++++ 3 files changed, 44 insertions(+), 46 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3f3e9b46/compiler/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/compiler/common/charmonizer.c b/compiler/common/charmonizer.c index ec8083c..dce8dd1 100644 --- a/compiler/common/charmonizer.c +++ b/compiler/common/charmonizer.c @@ -6519,32 +6519,21 @@ chaz_Probe_clean_up(void) { #include <stdio.h> #include <stdlib.h> - -static int -chaz_AtomicOps_osatomic_cas_ptr(void) { - static const char osatomic_casptr_code[] = - CHAZ_QUOTE( #include <libkern/OSAtomic.h> ) - CHAZ_QUOTE( #include <libkern/OSAtomic.h> ) - CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( int foo = 1; ) - CHAZ_QUOTE( int *foo_ptr = &foo; ) - CHAZ_QUOTE( int *target = NULL; ) - CHAZ_QUOTE( OSAtomicCompareAndSwapPtr(NULL, foo_ptr, (void**)&target); ) - CHAZ_QUOTE( return 0; ) - CHAZ_QUOTE( } ); - return chaz_CC_test_compile(osatomic_casptr_code); -} - void chaz_AtomicOps_run(void) { chaz_ConfWriter_start_module("AtomicOps"); + if (chaz_HeadCheck_check_header("stdatomic.h")) { + chaz_ConfWriter_add_def("HAS_STDATOMIC_H", NULL); + } if (chaz_HeadCheck_check_header("libkern/OSAtomic.h")) { chaz_ConfWriter_add_def("HAS_LIBKERN_OSATOMIC_H", NULL); /* Check for OSAtomicCompareAndSwapPtr, introduced in later versions * of OSAtomic.h. */ - if (chaz_AtomicOps_osatomic_cas_ptr()) { + if (chaz_HeadCheck_defines_symbol("OSAtomicCompareAndSwapPtr", + "#include <libkern/OSAtomic.h>") + ) { chaz_ConfWriter_add_def("HAS_OSATOMIC_CAS_PTR", NULL); } } @@ -7923,10 +7912,11 @@ chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { CHAZ_QUOTE( %s ) CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int a[sizeof(%s)==8?1:-1]; ) - CHAZ_QUOTE( void f() { ) + CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( FILE *f = %s("_charm_stdio64", "w"); ) CHAZ_QUOTE( %s pos = %s(f); ) CHAZ_QUOTE( %s(f, 0, SEEK_SET); ) + CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); char code_buf[sizeof(stdio64_code) + 200]; @@ -7937,7 +7927,7 @@ chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { combo->fseek_command); /* Verify compilation and that the offset type has 8 bytes. */ - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static void @@ -7969,12 +7959,15 @@ static int chaz_LargeFiles_probe_lseek(chaz_LargeFiles_unbuff_combo *combo) { static const char lseek_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( void f() { %s(0, 0, SEEK_SET); } ); + CHAZ_QUOTE( int main() { ) + CHAZ_QUOTE( %s(0, 0, SEEK_SET); ) + CHAZ_QUOTE( return 0; ) + CHAZ_QUOTE( } ); char code_buf[sizeof(lseek_code) + 100]; /* Verify compilation. */ sprintf(code_buf, lseek_code, combo->includes, combo->lseek_command); - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static int @@ -7983,15 +7976,16 @@ chaz_LargeFiles_probe_pread64(chaz_LargeFiles_unbuff_combo *combo) { * fine as long as it compiles. */ static const char pread64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( void f() { ) + CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( char buf[1]; ) CHAZ_QUOTE( %s(0, buf, 1, 1); ) + CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); char code_buf[sizeof(pread64_code) + 100]; /* Verify compilation. */ sprintf(code_buf, pread64_code, combo->includes, combo->pread64_command); - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static void http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3f3e9b46/runtime/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/runtime/common/charmonizer.c b/runtime/common/charmonizer.c index 9df40d7..0912e45 100644 --- a/runtime/common/charmonizer.c +++ b/runtime/common/charmonizer.c @@ -6519,32 +6519,21 @@ chaz_Probe_clean_up(void) { #include <stdio.h> #include <stdlib.h> - -static int -chaz_AtomicOps_osatomic_cas_ptr(void) { - static const char osatomic_casptr_code[] = - CHAZ_QUOTE( #include <libkern/OSAtomic.h> ) - CHAZ_QUOTE( #include <libkern/OSAtomic.h> ) - CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( int foo = 1; ) - CHAZ_QUOTE( int *foo_ptr = &foo; ) - CHAZ_QUOTE( int *target = NULL; ) - CHAZ_QUOTE( OSAtomicCompareAndSwapPtr(NULL, foo_ptr, (void**)&target); ) - CHAZ_QUOTE( return 0; ) - CHAZ_QUOTE( } ); - return chaz_CC_test_compile(osatomic_casptr_code); -} - void chaz_AtomicOps_run(void) { chaz_ConfWriter_start_module("AtomicOps"); + if (chaz_HeadCheck_check_header("stdatomic.h")) { + chaz_ConfWriter_add_def("HAS_STDATOMIC_H", NULL); + } if (chaz_HeadCheck_check_header("libkern/OSAtomic.h")) { chaz_ConfWriter_add_def("HAS_LIBKERN_OSATOMIC_H", NULL); /* Check for OSAtomicCompareAndSwapPtr, introduced in later versions * of OSAtomic.h. */ - if (chaz_AtomicOps_osatomic_cas_ptr()) { + if (chaz_HeadCheck_defines_symbol("OSAtomicCompareAndSwapPtr", + "#include <libkern/OSAtomic.h>") + ) { chaz_ConfWriter_add_def("HAS_OSATOMIC_CAS_PTR", NULL); } } @@ -7923,10 +7912,11 @@ chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { CHAZ_QUOTE( %s ) CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int a[sizeof(%s)==8?1:-1]; ) - CHAZ_QUOTE( void f() { ) + CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( FILE *f = %s("_charm_stdio64", "w"); ) CHAZ_QUOTE( %s pos = %s(f); ) CHAZ_QUOTE( %s(f, 0, SEEK_SET); ) + CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); char code_buf[sizeof(stdio64_code) + 200]; @@ -7937,7 +7927,7 @@ chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { combo->fseek_command); /* Verify compilation and that the offset type has 8 bytes. */ - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static void @@ -7969,12 +7959,15 @@ static int chaz_LargeFiles_probe_lseek(chaz_LargeFiles_unbuff_combo *combo) { static const char lseek_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( void f() { %s(0, 0, SEEK_SET); } ); + CHAZ_QUOTE( int main() { ) + CHAZ_QUOTE( %s(0, 0, SEEK_SET); ) + CHAZ_QUOTE( return 0; ) + CHAZ_QUOTE( } ); char code_buf[sizeof(lseek_code) + 100]; /* Verify compilation. */ sprintf(code_buf, lseek_code, combo->includes, combo->lseek_command); - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static int @@ -7983,15 +7976,16 @@ chaz_LargeFiles_probe_pread64(chaz_LargeFiles_unbuff_combo *combo) { * fine as long as it compiles. */ static const char pread64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( void f() { ) + CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( char buf[1]; ) CHAZ_QUOTE( %s(0, buf, 1, 1); ) + CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); char code_buf[sizeof(pread64_code) + 100]; /* Verify compilation. */ sprintf(code_buf, pread64_code, combo->includes, combo->pread64_command); - return chaz_CC_test_compile(code_buf); + return chaz_CC_test_link(code_buf); } static void http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3f3e9b46/runtime/core/Clownfish/Util/Atomic.h ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Util/Atomic.h b/runtime/core/Clownfish/Util/Atomic.h index 88d8de9..cfc369b 100644 --- a/runtime/core/Clownfish/Util/Atomic.h +++ b/runtime/core/Clownfish/Util/Atomic.h @@ -45,6 +45,16 @@ cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) { } } +/**************************** C11 stdatomic.h *****************************/ +#elif defined(CHY_HAS_STDATOMIC_H) +#include <stdatomic.h> + +static CFISH_INLINE bool +cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) { + return atomic_compare_exchange_strong((void *_Atomic *)target, &old_value, + new_value); +} + /************************** Mac OS X 10.4 and later ***********************/ #elif defined(CHY_HAS_OSATOMIC_CAS_PTR) #include <libkern/OSAtomic.h>