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 fce6ab0a33..34612766d6 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 |