diff options
author | Rainer Orth <ro@gcc.gnu.org> | 2019-07-23 16:33:54 +0000 |
---|---|---|
committer | Rainer Orth <ro@gcc.gnu.org> | 2019-07-23 16:33:54 +0000 |
commit | 569f92f1e1011947ae830c5d8f5313f3cadcc586 (patch) | |
tree | 9ae73716fe4b98d9bb35de4508b5fc3c555116d4 /compiler-rt | |
parent | 2b7f3a2b33524de62011a507a0c9521698c57f8d (diff) | |
download | bcm5719-llvm-569f92f1e1011947ae830c5d8f5313f3cadcc586.tar.gz bcm5719-llvm-569f92f1e1011947ae830c5d8f5313f3cadcc586.zip |
[compiler-rt][builtins] Provide __clear_cache for SPARC
While working on https://reviews.llvm.org/D40900, two tests were failing since __clear_cache
aborted. While libgcc's __clear_cache is just empty, this only happens because
gcc (in gcc/config/sparc/sparc.c (sparc32_initialize_trampoline, sparc64_initialize_trampoline))
emits flush insns directly.
The following patch mimics that.
Tested on sparcv9-sun-solaris2.11.
Differential Revision: https://reviews.llvm.org/D64496
llvm-svn: 366822
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/lib/builtins/clear_cache.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/compiler-rt/lib/builtins/clear_cache.c b/compiler-rt/lib/builtins/clear_cache.c index 76dc1968cc7..079b245c3fa 100644 --- a/compiler-rt/lib/builtins/clear_cache.c +++ b/compiler-rt/lib/builtins/clear_cache.c @@ -173,6 +173,16 @@ void __clear_cache(void *start, void *end) { for (uintptr_t line = start_line; line < end_line; line += line_size) __asm__ volatile("icbi 0, %0" : : "r"(line)); __asm__ volatile("isync"); +#elif defined(__sparc__) + const size_t dword_size = 8; + const size_t len = (uintptr_t)end - (uintptr_t)start; + + const uintptr_t mask = ~(dword_size - 1); + const uintptr_t start_dword = ((uintptr_t)start) & mask; + const uintptr_t end_dword = ((uintptr_t)start + len + dword_size - 1) & mask; + + for (uintptr_t dword = start_dword; dword < end_dword; dword += dword_size) + __asm__ volatile("flush %0" : : "r"(dword)); #else #if __APPLE__ // On Darwin, sys_icache_invalidate() provides this functionality |