From b4924870f4b8302aba051a506bb499fad99b464e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 5 Sep 2019 14:35:28 -0700 Subject: [PATCH] misc/cgo/test: use __atomic intrinsics instead of __sync GCC has supported the __atomic intrinsics since 4.7, and clang supports them as well. They are better than the __sync intrinsics in that they specify a memory model and, more importantly for our purposes, they are reliably implemented either in the compiler or in libatomic. Change-Id: I5e0036ea3300f65c28b1c3d1f3b93fb61c1cd646 Reviewed-on: https://go-review.googlesource.com/c/go/+/193603 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Than McIntosh --- misc/cgo/test/testx.go | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go index 27c7040307..67def903ab 100644 --- a/misc/cgo/test/testx.go +++ b/misc/cgo/test/testx.go @@ -83,33 +83,18 @@ extern void f7665(void); void issue7978cb(void); -#if defined(__APPLE__) && defined(__arm__) -// on Darwin/ARM, libSystem doesn't provide implementation of the __sync_fetch_and_add -// primitive, and although gcc supports it, it doesn't inline its definition. -// Clang could inline its definition, so we require clang on Darwin/ARM. -#if defined(__clang__) -#define HAS_SYNC_FETCH_AND_ADD 1 -#else -#define HAS_SYNC_FETCH_AND_ADD 0 -#endif -#else -#define HAS_SYNC_FETCH_AND_ADD 1 -#endif - // use ugly atomic variable sync since that doesn't require calling back into // Go code or OS dependencies static void issue7978c(uint32_t *sync) { -#if HAS_SYNC_FETCH_AND_ADD - while(__sync_fetch_and_add(sync, 0) != 0) + while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 0) ; - __sync_fetch_and_add(sync, 1); - while(__sync_fetch_and_add(sync, 0) != 2) + __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST); + while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 2) ; issue7978cb(); - __sync_fetch_and_add(sync, 1); - while(__sync_fetch_and_add(sync, 0) != 6) + __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST); + while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 6) ; -#endif } // issue 8331 part 2 - part 1 in test.go @@ -496,9 +481,6 @@ func test7978(t *testing.T) { if runtime.Compiler == "gccgo" { t.Skip("gccgo can not do stack traces of C code") } - if C.HAS_SYNC_FETCH_AND_ADD == 0 { - t.Skip("clang required for __sync_fetch_and_add support on darwin/arm") - } debug.SetTraceback("2") issue7978sync = 0 go issue7978go() -- 2.50.0