1、Class jit
1.1 Jit* Jit::Create
Jit* Jit::Create(JitCodeCache* code_cache, JitOptions* options) {
if (jit_load_ == nullptr) {
LOG(WARNING) << "Not creating JIT: library not loaded";
return nullptr;
}
jit_compiler_handle_ = (jit_load_)();
if (jit_compiler_handle_ == nullptr) {
LOG(WARNING) << "Not creating JIT: failed to allocate a compiler";
return nullptr;
}
std::unique_ptr<Jit> jit(new Jit(code_cache, options));
// If the code collector is enabled, check if that still holds:
// With 'perf', we want a 1-1 mapping between an address and a method.
// We aren't able to keep method pointers live during the instrumentation method entry trampoline
// so we will just disable jit-gc if we are doing that.
if (code_cache->GetGarbageCollectCode()) {
code_cache->SetGarbageCollectCode(!jit_generate_debug_info_(jit_compiler_handle_) &&
!Runtime::Current()->GetInstrumentation()->AreExitStubsInstalled());
}
VLOG(jit) << "JIT created with initial_capacity="
<< PrettySize(options->GetCodeCacheInitialCapacity())
<< ", max_capacity=" << PrettySize(options->GetCodeCacheMaxCapacity())
<< ", compile_threshold=" << options->GetCompileThreshold()
<< ", profile_saver_options=" << options->GetProfileSaverOptions();
// Notify native debugger about the classes already loaded before the creation of the jit.
jit->DumpTypeInfoForLoadedTypes(Runtime::Current()->GetClassLinker());
return jit.release();
}
1.2 bool Jit::LoadCompilerLibrary
bool Jit::LoadCompilerLibrary(std::string* error_msg) {
jit_library_handle_ = dlopen( /*此函数用dlopen的方式加载动态库,从动态库中取出jit_load、
jit_compile_method等函数并赋值给jit对应的成员变量;*/
kIsDebugBuild ? "libartd-compiler.so" : "libart-compiler.so", RTLD_NOW);
if (jit_library_handle_ == nullptr) {
std::ostringstream oss;
oss << "JIT could not load libart-compiler.so: " << dlerror();
*error_msg = oss.str();
return false;
}
bool all_resolved = true;
all_resolved = all_resolved && LoadSymbol(&jit_load_, "jit_load", error_msg);
all_resolved = all_resolved && LoadSymbol(&jit_unload_, "jit_unload", error_msg);
all_resolved = all_resolved && LoadSymbol(&jit_compile_method_, "jit_compile_method", error_msg);
all_resolved = all_resolved && LoadSymbol(&jit_types_loaded_, "jit_types_loaded", error_msg);
all_resolved = all_resolved && LoadSymbol(&jit_update_options_, "jit_update_options", error_msg);
all_resolved = all_resolved &&
LoadSymbol(&jit_generate_debug_info_, "jit_generate_debug_info", error_msg);
if (!all_resolved) {
dlclose(jit_library_handle_);
return false;
}
return true;
}
这个函数的作用是,从动态库"libartd-compiler.so"中取出jit对象成员变量所需要的数据,并赋值给这些成员变量使用。
2、Class JitCompiler
2.1 jit_load
extern "C" void* jit_load() {
VLOG(jit) << "Create jit compiler";
auto* const jit_compiler = JitCompiler::Create(); //创建jitcompiler对象 ,关键词auto*
//const只知道大概意思,详细作用还需了解
CHECK(jit_compiler != nullptr);
VLOG(jit) << "Done creating jit compiler";
return jit_compiler;
}
该函数用来创建jitcompile对象。
2.2 JitCompiler::JitCompiler()
JitCompiler::JitCompiler() {
compiler_options_.reset(new CompilerOptions());
ParseCompilerOptions();
compiler_.reset(
Compiler::Create(*compiler_options_, /*storage=*/ nullptr, Compiler::kOptimizing));
}
此函数为jitcompiler 的构造函数。