diff mbox

tests/test-int128: Don't use __noclone__ attribute on clang

Message ID 1393457987-24791-1-git-send-email-peter.maydell@linaro.org
State New
Headers show

Commit Message

Peter Maydell Feb. 26, 2014, 11:39 p.m. UTC
clang doesn't support the __noclone__ attribute and emits a warning about
it. Fortunately clang also implements a mechanism for asking if a particular
attribute is implemented; use it. We assume that if the compiler doesn't
support __has_attribute() then it must be GCC and must support __noclone__.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
__has_attribute and friends are a clang feature it would be nice if
the GCC devs stole :-)  If they'd had it from the start it would have
obviated all the horrible specific-version-of-gcc checks that compiler.h
has to do...

This is the only file in the tree using __noclone__ so it seems simplest
to fix this here rather than putting it in compiler.h.

 tests/test-int128.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

Comments

Michael Tokarev March 2, 2014, 1:20 p.m. UTC | #1
27.02.2014 03:39, Peter Maydell wrote:
> clang doesn't support the __noclone__ attribute and emits a warning about
> it. Fortunately clang also implements a mechanism for asking if a particular
> attribute is implemented; use it. We assume that if the compiler doesn't
> support __has_attribute() then it must be GCC and must support __noclone__.

Applied to -trivial, thank you!

/mjt
diff mbox

Patch

diff --git a/tests/test-int128.c b/tests/test-int128.c
index 5aca032..0772ef7 100644
--- a/tests/test-int128.c
+++ b/tests/test-int128.c
@@ -11,6 +11,19 @@ 
 #include "qemu/int128.h"
 #include "qemu/osdep.h"
 
+/* clang doesn't support __noclone__ but it does have a mechanism for
+ * telling us this. We assume that if we don't have __has_attribute()
+ * then this is GCC and that GCC always supports __noclone__.
+ */
+#if defined(__has_attribute)
+#if !__has_attribute(__noclone__)
+#define ATTRIBUTE_NOCLONE
+#endif
+#endif
+#ifndef ATTRIBUTE_NOCLONE
+#define ATTRIBUTE_NOCLONE __attribute__((__noclone__))
+#endif
+
 static uint32_t tests[8] = {
     0x00000000, 0x00000001, 0x7FFFFFFE, 0x7FFFFFFF,
     0x80000000, 0x80000001, 0xFFFFFFFE, 0xFFFFFFFF,
@@ -164,7 +177,7 @@  static void test_gt(void)
 
 /* Make sure to test undefined behavior at runtime! */
 
-static void __attribute__((__noinline__, __noclone__))
+static void __attribute__((__noinline__)) ATTRIBUTE_NOCLONE
 test_rshift_one(uint32_t x, int n, uint64_t h, uint64_t l)
 {
     Int128 a = expand(x);