summaryrefslogtreecommitdiffstats
path: root/compiler-rt
diff options
context:
space:
mode:
authorRainer Orth <ro@gcc.gnu.org>2019-07-23 16:33:54 +0000
committerRainer Orth <ro@gcc.gnu.org>2019-07-23 16:33:54 +0000
commit569f92f1e1011947ae830c5d8f5313f3cadcc586 (patch)
tree9ae73716fe4b98d9bb35de4508b5fc3c555116d4 /compiler-rt
parent2b7f3a2b33524de62011a507a0c9521698c57f8d (diff)
downloadbcm5719-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.c10
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
OpenPOWER on IntegriCloud