diff options
Diffstat (limited to 'runtime/jit/jit.cc')
| -rw-r--r-- | runtime/jit/jit.cc | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/runtime/jit/jit.cc b/runtime/jit/jit.cc index 05668a97b3..8f4d24f385 100644 --- a/runtime/jit/jit.cc +++ b/runtime/jit/jit.cc @@ -56,7 +56,8 @@ void Jit::DumpInfo(std::ostream& os) { os << "JIT code cache size=" << PrettySize(code_cache_->CodeCacheSize()) << "\n" << "JIT data cache size=" << PrettySize(code_cache_->DataCacheSize()) << "\n" << "JIT current capacity=" << PrettySize(code_cache_->GetCurrentCapacity()) << "\n" - << "JIT number of compiled code=" << code_cache_->NumberOfCompiledCode() << "\n"; + << "JIT number of compiled code=" << code_cache_->NumberOfCompiledCode() << "\n" + << "JIT total number of compilations=" << code_cache_->NumberOfCompilations() << "\n"; cumulative_timings_.Dump(os); } @@ -127,6 +128,13 @@ bool Jit::LoadCompiler(std::string* error_msg) { *error_msg = "JIT couldn't find jit_compile_method entry point"; return false; } + jit_types_loaded_ = reinterpret_cast<void (*)(void*, mirror::Class**, size_t)>( + dlsym(jit_library_handle_, "jit_types_loaded")); + if (jit_types_loaded_ == nullptr) { + dlclose(jit_library_handle_); + *error_msg = "JIT couldn't find jit_types_loaded entry point"; + return false; + } CompilerCallbacks* callbacks = nullptr; bool will_generate_debug_symbols = false; VLOG(jit) << "Calling JitLoad interpreter_only=" @@ -214,5 +222,31 @@ void Jit::CreateInstrumentationCache(size_t compile_threshold, size_t warmup_thr new jit::JitInstrumentationCache(compile_threshold, warmup_threshold)); } +void Jit::NewTypeLoadedIfUsingJit(mirror::Class* type) { + jit::Jit* jit = Runtime::Current()->GetJit(); + if (jit != nullptr && jit->generate_debug_info_) { + DCHECK(jit->jit_types_loaded_ != nullptr); + jit->jit_types_loaded_(jit->jit_compiler_handle_, &type, 1); + } +} + +void Jit::DumpTypeInfoForLoadedTypes(ClassLinker* linker) { + struct CollectClasses : public ClassVisitor { + bool Visit(mirror::Class* klass) override { + classes_.push_back(klass); + return true; + } + std::vector<mirror::Class*> classes_; + }; + + if (generate_debug_info_) { + ScopedObjectAccess so(Thread::Current()); + + CollectClasses visitor; + linker->VisitClasses(&visitor); + jit_types_loaded_(jit_compiler_handle_, visitor.classes_.data(), visitor.classes_.size()); + } +} + } // namespace jit } // namespace art |