[commit: ghc] master: rts/sm/Storage.c: tweak __clear_cache proto for clang (3eeb55e)

git at git.haskell.org git at git.haskell.org
Wed Jul 5 08:15:51 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/3eeb55e9578f6eaebccf27170eb1324990affb51/ghc

>---------------------------------------------------------------

commit 3eeb55e9578f6eaebccf27170eb1324990affb51
Author: Sergei Trofimovich <slyfox at gentoo.org>
Date:   Wed Jul 5 08:36:08 2017 +0100

    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 at gentoo.org>


>---------------------------------------------------------------

3eeb55e9578f6eaebccf27170eb1324990affb51
 rts/sm/Storage.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index e243517..7b97c01 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.
    */



More information about the ghc-commits mailing list