diff options
author | Andreas Gampe <agampe@google.com> | 2014-08-12 23:19:23 -0700 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-08-22 21:20:08 -0700 |
commit | 53c913bb71b218714823c8c87a1f92830c336f61 (patch) | |
tree | 96aebfc9ae62eb1454b78286236567e2b6f3e5c7 /compiler/optimizing/optimizing_compiler.cc | |
parent | e18aa4316eb9a15cd6b1051f27a1ce49967c170e (diff) | |
download | art-53c913bb71b218714823c8c87a1f92830c336f61.zip art-53c913bb71b218714823c8c87a1f92830c336f61.tar.gz art-53c913bb71b218714823c8c87a1f92830c336f61.tar.bz2 |
ART: Clean up compiler
Clean up the compiler: less extern functions, dis-entangle
compilers, hide some compiler specifics, lower global includes.
Change-Id: Ibaf88d02505d86994d7845cf0075be5041cc8438
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 |