diff options
| -rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 3 | ||||
| -rw-r--r-- | runtime/jit/jit_code_cache.cc | 23 | ||||
| -rw-r--r-- | runtime/jit/jit_code_cache.h | 15 | ||||
| -rw-r--r-- | runtime/utils.h | 6 |
4 files changed, 34 insertions, 13 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index ba7012ab1a..0d0f62a55c 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -1193,7 +1193,7 @@ bool OptimizingCompiler::JitCompile(Thread* self, } uint8_t* stack_map_data = nullptr; uint8_t* roots_data = nullptr; - code_cache->ReserveData( + uint32_t data_size = code_cache->ReserveData( self, stack_map_size, number_of_roots, method, &stack_map_data, &roots_data); if (stack_map_data == nullptr || roots_data == nullptr) { return false; @@ -1212,6 +1212,7 @@ bool OptimizingCompiler::JitCompile(Thread* self, codegen->GetFpuSpillMask(), code_allocator.GetMemory().data(), code_allocator.GetSize(), + data_size, osr, roots, codegen->GetGraph()->HasShouldDeoptimizeFlag(), diff --git a/runtime/jit/jit_code_cache.cc b/runtime/jit/jit_code_cache.cc index 1b0ad8341b..f43e30dd6f 100644 --- a/runtime/jit/jit_code_cache.cc +++ b/runtime/jit/jit_code_cache.cc @@ -217,6 +217,7 @@ uint8_t* JitCodeCache::CommitCode(Thread* self, size_t fp_spill_mask, const uint8_t* code, size_t code_size, + size_t data_size, bool osr, Handle<mirror::ObjectArray<mirror::Object>> roots, bool has_should_deoptimize_flag, @@ -230,6 +231,7 @@ uint8_t* JitCodeCache::CommitCode(Thread* self, fp_spill_mask, code, code_size, + data_size, osr, roots, has_should_deoptimize_flag, @@ -246,6 +248,7 @@ uint8_t* JitCodeCache::CommitCode(Thread* self, fp_spill_mask, code, code_size, + data_size, osr, roots, has_should_deoptimize_flag, @@ -513,6 +516,7 @@ uint8_t* JitCodeCache::CommitCodeInternal(Thread* self, size_t fp_spill_mask, const uint8_t* code, size_t code_size, + size_t data_size, bool osr, Handle<mirror::ObjectArray<mirror::Object>> roots, bool has_should_deoptimize_flag, @@ -547,6 +551,11 @@ uint8_t* JitCodeCache::CommitCodeInternal(Thread* self, core_spill_mask, fp_spill_mask, code_size); + DCHECK_EQ(FromStackMapToRoots(stack_map), roots_data); + DCHECK_LE(roots_data, stack_map); + // Flush data cache, as compiled code references literals in it. + FlushDataCache(reinterpret_cast<char*>(roots_data), + reinterpret_cast<char*>(roots_data + data_size)); // Flush caches before we remove write permission because on some ARMv8 hardware, // flushing caches require write permissions. // @@ -657,12 +666,12 @@ void JitCodeCache::ClearData(Thread* self, FreeData(reinterpret_cast<uint8_t*>(roots_data)); } -void JitCodeCache::ReserveData(Thread* self, - size_t stack_map_size, - size_t number_of_roots, - ArtMethod* method, - uint8_t** stack_map_data, - uint8_t** roots_data) { +size_t JitCodeCache::ReserveData(Thread* self, + size_t stack_map_size, + size_t number_of_roots, + ArtMethod* method, + uint8_t** stack_map_data, + uint8_t** roots_data) { size_t table_size = ComputeRootTableSize(number_of_roots); size_t size = RoundUp(stack_map_size + table_size, sizeof(void*)); uint8_t* result = nullptr; @@ -695,9 +704,11 @@ void JitCodeCache::ReserveData(Thread* self, *roots_data = result; *stack_map_data = result + table_size; FillRootTableLength(*roots_data, number_of_roots); + return size; } else { *roots_data = nullptr; *stack_map_data = nullptr; + return 0; } } diff --git a/runtime/jit/jit_code_cache.h b/runtime/jit/jit_code_cache.h index 30e2efbac5..d97742d00b 100644 --- a/runtime/jit/jit_code_cache.h +++ b/runtime/jit/jit_code_cache.h @@ -106,6 +106,7 @@ class JitCodeCache { size_t fp_spill_mask, const uint8_t* code, size_t code_size, + size_t data_size, bool osr, Handle<mirror::ObjectArray<mirror::Object>> roots, bool has_should_deoptimize_flag, @@ -121,12 +122,13 @@ class JitCodeCache { // Allocate a region of data that contain `size` bytes, and potentially space // for storing `number_of_roots` roots. Returns null if there is no more room. - void ReserveData(Thread* self, - size_t size, - size_t number_of_roots, - ArtMethod* method, - uint8_t** stack_map_data, - uint8_t** roots_data) + // Return the number of bytes allocated. + size_t ReserveData(Thread* self, + size_t size, + size_t number_of_roots, + ArtMethod* method, + uint8_t** stack_map_data, + uint8_t** roots_data) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!lock_); @@ -237,6 +239,7 @@ class JitCodeCache { size_t fp_spill_mask, const uint8_t* code, size_t code_size, + size_t data_size, bool osr, Handle<mirror::ObjectArray<mirror::Object>> roots, bool has_should_deoptimize_flag, diff --git a/runtime/utils.h b/runtime/utils.h index 04e0dded27..16ef706159 100644 --- a/runtime/utils.h +++ b/runtime/utils.h @@ -284,6 +284,12 @@ inline void FlushInstructionCache(char* begin, char* end) { __builtin___clear_cache(begin, end); } +inline void FlushDataCache(char* begin, char* end) { + // Same as FlushInstructionCache for lack of other builtin. __builtin___clear_cache + // flushes both caches. + __builtin___clear_cache(begin, end); +} + template <typename T> constexpr PointerSize ConvertToPointerSize(T any) { if (any == 4 || any == 8) { |