[PATCH] D64496: [compiler-rt][builtins] Provide __clear_cache for SPARC

Rainer Orth via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 10 07:38:23 PDT 2019


ro created this revision.
ro added reviewers: fedor.sergeev, venkatra.
Herald added subscribers: Sanitizers, dberris, jyknight.
Herald added projects: LLVM, Sanitizers.

While working on https://reviews.llvm.org/D40900 (which now is effectively about
enabling compiler-rt on sparc in general, 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`.  Ok for trunk?


Repository:
  rCRT Compiler Runtime

https://reviews.llvm.org/D64496

Files:
  lib/builtins/clear_cache.c


Index: lib/builtins/clear_cache.c
===================================================================
--- lib/builtins/clear_cache.c
+++ lib/builtins/clear_cache.c
@@ -173,6 +173,16 @@
   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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64496.208959.patch
Type: text/x-patch
Size: 864 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190710/e76f09fe/attachment.bin>


More information about the llvm-commits mailing list