summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Trofimovich <slyfox@gentoo.org>2017-07-05 08:36:08 +0100
committerSergei Trofimovich <slyfox@gentoo.org>2017-07-05 09:15:08 +0100
commit3eeb55e9578f6eaebccf27170eb1324990affb51 (patch)
tree21757aa268ddfeca01d9c8c6366e2de8f4088bb0
parent7040660528f597c12f8bc49ca87f3697ab3d3653 (diff)
downloadhaskell-3eeb55e9578f6eaebccf27170eb1324990affb51.tar.gz
rts/sm/Storage.c: tweak __clear_cache proto for clang
clang defines '__clear_cache' slightly differently from gcc: rts/sm/Storage.c:1349:13: error: error: conflicting types for '__clear_cache' | 1349 | extern void __clear_cache(char * begin, char * end); | ^ extern void __clear_cache(char * begin, char * end); ^ note: '__clear_cache' is a builtin with type 'void (void *, void *)' Reported by Moritz Angermann. While at it used '__builtin___clear_cache' if advertised by clang. Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
-rw-r--r--rts/sm/Storage.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index e2435173c1..7b97c01fd8 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -1341,7 +1341,13 @@ StgWord calcTotalCompactW (void)
#include <libkern/OSCacheControl.h>
#endif
-#if defined(__GNUC__)
+#if defined(__CLANG__)
+/* clang defines __clear_cache as a builtin on some platforms.
+ * For example on armv7-linux-androideabi. The type slightly
+ * differs from gcc.
+ */
+extern void __clear_cache(void * begin, void * end);
+#elif defined(__GNUC__)
/* __clear_cache is a libgcc function.
* It existed before __builtin___clear_cache was introduced.
* See Trac #8562.
@@ -1360,11 +1366,18 @@ void flushExec (W_ len, AdjustorExecutable exec_addr)
#elif (defined(arm_HOST_ARCH) || defined(aarch64_HOST_ARCH)) && defined(ios_HOST_OS)
/* On iOS we need to use the special 'sys_icache_invalidate' call. */
sys_icache_invalidate(exec_addr, len);
+#elif defined(__CLANG__)
+ unsigned char* begin = (unsigned char*)exec_addr;
+ unsigned char* end = begin + len;
+# if __has_builtin(__builtin___clear_cache)
+ __builtin___clear_cache((void*)begin, (void*)end);
+# else
+ __clear_cache((void*)begin, (void*)end);
+# endif
#elif defined(__GNUC__)
/* For all other platforms, fall back to a libgcc builtin. */
unsigned char* begin = (unsigned char*)exec_addr;
unsigned char* end = begin + len;
-
/* __builtin___clear_cache is supported since GNU C 4.3.6.
* We pick 4.4 to simplify condition a bit.
*/