diff options
| -rw-r--r-- | src/compiler.cc | 22 | ||||
| -rw-r--r-- | src/compiler/Compiler.h | 48 | ||||
| -rw-r--r-- | src/compiler/Frontend.cc | 28 | ||||
| -rw-r--r-- | src/compiler/codegen/MethodBitcode.cc | 29 |
4 files changed, 106 insertions, 21 deletions
diff --git a/src/compiler.cc b/src/compiler.cc index 091aad90f7..b05e688fd2 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -331,6 +331,16 @@ Compiler::Compiler(InstructionSet instruction_set, bool image, size_t thread_cou "ArtInitCompilerContext"); init_compiler_context(*this); +#elif defined(ART_USE_QUICK_COMPILER) + // Initialize compiler_context_ + typedef void (*InitCompilerContextFn)(Compiler&); + + InitCompilerContextFn init_compiler_context = + FindFunction<void (*)(Compiler&)>(compiler_so_name, + compiler_library_, + "ArtInitQuickCompilerContext"); + + init_compiler_context(*this); #endif compiler_ = FindFunction<CompilerFn>(compiler_so_name, compiler_library_, "ArtCompileMethod"); @@ -387,6 +397,18 @@ Compiler::~Compiler() { "ArtUnInitCompilerContext"); uninit_compiler_context(*this); +#elif defined(ART_USE_QUICK_COMPILER) + // Uninitialize compiler_context_ + typedef void (*UninitCompilerContextFn)(Compiler&); + + std::string compiler_so_name(MakeCompilerSoName(instruction_set_)); + + UninitCompilerContextFn uninit_compiler_context = + FindFunction<void (*)(Compiler&)>(compiler_so_name, + compiler_library_, + "ArtUnInitQuickCompilerContext"); + + uninit_compiler_context(*this); #endif if (compiler_library_ != NULL) { VLOG(compiler) << "dlclose(" << compiler_library_ << ")"; diff --git a/src/compiler/Compiler.h b/src/compiler/Compiler.h index 659b5a6579..9ac6016fd3 100644 --- a/src/compiler/Compiler.h +++ b/src/compiler/Compiler.h @@ -20,7 +20,20 @@ #include "dex_file.h" #include "dex_instruction.h" +#if defined(ART_USE_QUICK_COMPILER) +namespace llvm { + class Module; + class LLVMContext; +} +#endif + namespace art { +#if defined(ART_USE_QUICK_COMPILER) +namespace greenland { + class IntrinsicHelper; + class IRBuilder; +} +#endif #define COMPILER_TRACED(X) #define COMPILER_TRACEE(X) @@ -163,6 +176,41 @@ enum DataFlowAnalysisMode { kReversePostOrderTraversal, // Depth-First-Search / reverse Post-Order }; +#if defined(ART_USE_QUICK_COMPILER) +class QuickCompiler { + public: + QuickCompiler(art::Compiler* compiler); + ~QuickCompiler(); + + const art::Compiler* GetCompiler() const { + return compiler_; + } + + llvm::LLVMContext* GetLLVMContext() { + return llvm_context_.get(); + } + + llvm::Module* GetLLVMModule() { + return llvm_module_.get(); + } + + art::greenland::IntrinsicHelper* GetIntrinsicHelper() { + return intrinsic_helper_.get(); + } + + art::greenland::IRBuilder* GetIRBuilder() { + return ir_builder_.get(); + } + + private: + const art::Compiler* const compiler_; + UniquePtr<llvm::LLVMContext> llvm_context_; + UniquePtr<llvm::Module> llvm_module_; + UniquePtr<art::greenland::IntrinsicHelper> intrinsic_helper_; + UniquePtr<art::greenland::IRBuilder> ir_builder_; +}; +#endif + struct CompilationUnit; struct BasicBlock; struct SSARepresentation; diff --git a/src/compiler/Frontend.cc b/src/compiler/Frontend.cc index 3c579c4064..8c403c599e 100644 --- a/src/compiler/Frontend.cc +++ b/src/compiler/Frontend.cc @@ -23,6 +23,34 @@ namespace art { +#if defined(ART_USE_QUICK_COMPILER) +QuickCompiler::QuickCompiler(art::Compiler* compiler) + : compiler_(compiler) { + // Create context, module, intrinsic helper & ir builder + llvm_context_.reset(new llvm::LLVMContext()); + llvm_module_.reset(new llvm::Module("art", *llvm_context_)); + llvm::StructType::create(*llvm_context_, "JavaObject"); + llvm::StructType::create(*llvm_context_, "Method"); + llvm::StructType::create(*llvm_context_, "Thread"); + intrinsic_helper_.reset( new greenland::IntrinsicHelper(*llvm_context_, *llvm_module_)); + ir_builder_.reset(new greenland::IRBuilder(*llvm_context_, *llvm_module_, *intrinsic_helper_)); +} + +QuickCompiler::~QuickCompiler() { +} + +extern "C" void ArtInitQuickCompilerContext(art::Compiler& compiler) { + CHECK(compiler.GetCompilerContext() == NULL); + QuickCompiler* quickCompiler = new QuickCompiler(&compiler); + compiler.SetCompilerContext(quickCompiler); +} + +extern "C" void ArtUnInitQuickCompilerContext(art::Compiler& compiler) { + delete reinterpret_cast<QuickCompiler*>(compiler.GetCompilerContext()); + compiler.SetCompilerContext(NULL); +} +#endif + /* Default optimizer/debug setting for the compiler. */ static uint32_t kCompilerOptimizerDisableFlags = 0 | // Disable specific optimizations //(1 << kLoadStoreElimination) | diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc index c84d6d3ddb..cfe6e6a517 100644 --- a/src/compiler/codegen/MethodBitcode.cc +++ b/src/compiler/codegen/MethodBitcode.cc @@ -166,27 +166,14 @@ void createLocFromValue(CompilationUnit* cUnit, llvm::Value* val) } cUnit->locMap.Put(val, loc); } - void initIR(CompilationUnit* cUnit) { - cUnit->context = new llvm::LLVMContext(); - cUnit->module = new llvm::Module("art", *cUnit->context); - llvm::StructType::create(*cUnit->context, "JavaObject"); - llvm::StructType::create(*cUnit->context, "Method"); - llvm::StructType::create(*cUnit->context, "Thread"); - cUnit->intrinsic_helper = - new greenland::IntrinsicHelper(*cUnit->context, *cUnit->module); - cUnit->irb = - new greenland::IRBuilder(*cUnit->context, *cUnit->module, - *cUnit->intrinsic_helper); -} - -void freeIR(CompilationUnit* cUnit) -{ - delete cUnit->irb; - delete cUnit->intrinsic_helper; - delete cUnit->module; - delete cUnit->context; + QuickCompiler* quick = + reinterpret_cast<QuickCompiler*>(cUnit->compiler->GetCompilerContext()); + cUnit->context = quick->GetLLVMContext(); + cUnit->module = quick->GetLLVMModule(); + cUnit->intrinsic_helper = quick->GetIntrinsicHelper(); + cUnit->irb = quick->GetIRBuilder(); } const char* llvmSSAName(CompilationUnit* cUnit, int ssaReg) { @@ -840,7 +827,6 @@ bool convertMIRNode(CompilationUnit* cUnit, MIR* mir, BasicBlock* bb, RegLocation rlSrc[3]; RegLocation rlDest = badLoc; Instruction::Code opcode = mir->dalvikInsn.opcode; - uint32_t vA = mir->dalvikInsn.vA; uint32_t vB = mir->dalvikInsn.vB; uint32_t vC = mir->dalvikInsn.vC; int optFlags = mir->optimizationFlags; @@ -3480,7 +3466,8 @@ void oatMethodBitcode2LIR(CompilationUnit* cUnit) handleIntrinsicLaunchpads(cUnit); - freeIR(cUnit); + cUnit->func->eraseFromParent(); + cUnit->func = NULL; } |