diff options
Diffstat (limited to 'compiler/optimizing/optimizing_compiler.cc')
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 120 |
1 files changed, 118 insertions, 2 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index fce6ab0..3461276 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -14,12 +14,14 @@ * limitations under the License. */ +#include "optimizing_compiler.h" + #include <fstream> #include <stdint.h> #include "builder.h" #include "code_generator.h" -#include "compilers.h" +#include "compiler.h" #include "driver/compiler_driver.h" #include "driver/dex_compilation_unit.h" #include "graph_visualizer.h" @@ -65,12 +67,105 @@ static bool kIsVisualizerEnabled = false; */ static const char* kStringFilter = ""; -OptimizingCompiler::OptimizingCompiler(CompilerDriver* driver) : QuickCompiler(driver) { +class OptimizingCompiler FINAL : public Compiler { + public: + explicit OptimizingCompiler(CompilerDriver* driver); + + bool CanCompileMethod(uint32_t method_idx, const DexFile& dex_file, CompilationUnit* cu) const + OVERRIDE; + + CompiledMethod* Compile(const DexFile::CodeItem* code_item, + uint32_t access_flags, + InvokeType invoke_type, + uint16_t class_def_idx, + uint32_t method_idx, + jobject class_loader, + const DexFile& dex_file) const OVERRIDE; + + CompiledMethod* TryCompile(const DexFile::CodeItem* code_item, + uint32_t access_flags, + InvokeType invoke_type, + uint16_t class_def_idx, + uint32_t method_idx, + jobject class_loader, + const DexFile& dex_file) const; + + // For the following methods we will use the fallback. This is a delegation pattern. + CompiledMethod* JniCompile(uint32_t access_flags, + uint32_t method_idx, + const DexFile& dex_file) const OVERRIDE; + + uintptr_t GetEntryPointOf(mirror::ArtMethod* method) const OVERRIDE + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + bool WriteElf(art::File* file, + OatWriter* oat_writer, + const std::vector<const art::DexFile*>& dex_files, + const std::string& android_root, + bool is_host) const OVERRIDE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + Backend* GetCodeGenerator(CompilationUnit* cu, void* compilation_unit) const OVERRIDE; + + void InitCompilationUnit(CompilationUnit& cu) const OVERRIDE; + + void Init() const OVERRIDE; + + void UnInit() const OVERRIDE; + + private: + std::unique_ptr<std::ostream> visualizer_output_; + + // Delegate to another compiler in case the optimizing compiler cannot compile a method. + // Currently the fallback is the quick compiler. + std::unique_ptr<Compiler> delegate_; + + DISALLOW_COPY_AND_ASSIGN(OptimizingCompiler); +}; + +OptimizingCompiler::OptimizingCompiler(CompilerDriver* driver) : Compiler(driver, 100), + delegate_(Create(driver, Compiler::Kind::kQuick)) { if (kIsVisualizerEnabled) { visualizer_output_.reset(new std::ofstream("art.cfg")); } } +void OptimizingCompiler::Init() const { + delegate_->Init(); +} + +void OptimizingCompiler::UnInit() const { + delegate_->UnInit(); +} + +bool OptimizingCompiler::CanCompileMethod(uint32_t method_idx, const DexFile& dex_file, + CompilationUnit* cu) const { + return delegate_->CanCompileMethod(method_idx, dex_file, cu); +} + +CompiledMethod* OptimizingCompiler::JniCompile(uint32_t access_flags, + uint32_t method_idx, + const DexFile& dex_file) const { + return delegate_->JniCompile(access_flags, method_idx, dex_file); +} + +uintptr_t OptimizingCompiler::GetEntryPointOf(mirror::ArtMethod* method) const { + return delegate_->GetEntryPointOf(method); +} + +bool OptimizingCompiler::WriteElf(art::File* file, OatWriter* oat_writer, + const std::vector<const art::DexFile*>& dex_files, + const std::string& android_root, bool is_host) const { + return delegate_->WriteElf(file, oat_writer, dex_files, android_root, is_host); +} + +Backend* OptimizingCompiler::GetCodeGenerator(CompilationUnit* cu, void* compilation_unit) const { + return delegate_->GetCodeGenerator(cu, compilation_unit); +} + +void OptimizingCompiler::InitCompilationUnit(CompilationUnit& cu) const { + delegate_->InitCompilationUnit(cu); +} + CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_item, uint32_t access_flags, InvokeType invoke_type, @@ -183,4 +278,25 @@ CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_ite nullptr); } +CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, + uint32_t access_flags, + InvokeType invoke_type, + uint16_t class_def_idx, + uint32_t method_idx, + jobject class_loader, + const DexFile& dex_file) const { + CompiledMethod* method = TryCompile(code_item, access_flags, invoke_type, class_def_idx, + method_idx, class_loader, dex_file); + if (method != nullptr) { + return method; + } + + return delegate_->Compile(code_item, access_flags, invoke_type, class_def_idx, method_idx, + class_loader, dex_file); +} + +Compiler* CreateOptimizingCompiler(CompilerDriver* driver) { + return new OptimizingCompiler(driver); +} + } // namespace art |