diff options
author | Sergei Trofimovich <slyfox@gentoo.org> | 2017-06-21 21:17:51 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyfox@gentoo.org> | 2017-06-21 21:26:50 +0100 |
commit | 6dd1257fdd4d18e84d32e89bf0ec664b3c8f7b93 (patch) | |
tree | 4b05e4ebca13d770e006b3d56cf1c3b511256146 /rts/sm | |
parent | b1fa386cdae1af45fdd3519014be850f83414ab3 (diff) | |
download | haskell-6dd1257fdd4d18e84d32e89bf0ec664b3c8f7b93.tar.gz |
UNREG: use __builtin___clear_cache where available
Noticed when was building UNREG ghc with -optc{-Wall,-Werror}:
rts/sm/Storage.c:1359:3: error:
error: implicit declaration of function '__clear_cache'
[-Werror=implicit-function-declaration]
__clear_cache((void*)begin, (void*)end);
^~~~~~~~~~~~~
|
1359 | __clear_cache((void*)begin, (void*)end);
| ^
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Diffstat (limited to 'rts/sm')
-rw-r--r-- | rts/sm/Storage.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c index 4aa4b12868..2e2834b4d7 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -1341,6 +1341,26 @@ StgWord calcTotalCompactW (void) #include <libkern/OSCacheControl.h> #endif +#if defined(__GNUC__) +/* __clear_cache is a libgcc function. + * It existed before __builtin___clear_cache was introduced. + * See Trac #8562. + */ +extern void __clear_cache(char * begin, char * end); + +STATIC_INLINE void gcc_clear_cache(void * begin, void * end) +{ + /* __builtin___clear_cache is supported since GNU C 4.3.6. + * We pick 4.4 to simplify condition a bit. + */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) + __builtin___clear_cache(begin, end); +#else + __clear_cache(begin, end); +#endif +} +#endif /* __GNUC__ */ + /* On ARM and other platforms, we need to flush the cache after writing code into memory, so the processor reliably sees it. */ void flushExec (W_ len, AdjustorExecutable exec_addr) @@ -1356,7 +1376,7 @@ void flushExec (W_ len, AdjustorExecutable exec_addr) /* For all other platforms, fall back to a libgcc builtin. */ unsigned char* begin = (unsigned char*)exec_addr; unsigned char* end = begin + len; - __clear_cache((void*)begin, (void*)end); + gcc_clear_cache((void*)begin, (void*)end); #else #error Missing support to flush the instruction cache #endif |