diff options
author | 2014-03-18 11:25:25 +0000 | |
---|---|---|
committer | 2014-03-18 11:25:25 +0000 | |
commit | a48850ba1f48066785768d2dd296448cd430d494 (patch) | |
tree | bb1107ba6496180ad09508285acb2b7a71623ed1 /compiler/optimizing/optimizing_compiler.cc | |
parent | 728d495f8536dc622f5b5b6772a8c0adec05d381 (diff) | |
parent | 787c3076635cf117eb646c5a89a9014b2072fb44 (diff) |
Merge "Plug new optimizing compiler in compilation pipeline."
Diffstat (limited to 'compiler/optimizing/optimizing_compiler.cc')
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 73323a4846..cc36bbeb0a 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -14,10 +14,41 @@ * limitations under the License. */ +#include <stdint.h> + +#include "builder.h" +#include "code_generator.h" #include "compilers.h" +#include "driver/compiler_driver.h" +#include "nodes.h" +#include "utils/arena_allocator.h" namespace art { +/** + * Used by the code generator, to allocate the code in a vector. + */ +class CodeVectorAllocator FINAL : public CodeAllocator { + public: + CodeVectorAllocator() { } + + virtual uint8_t* Allocate(size_t size) { + size_ = size; + memory_.reserve(size); + return &memory_[0]; + } + + size_t GetSize() const { return size_; } + std::vector<uint8_t>* GetMemory() { return &memory_; } + + private: + std::vector<uint8_t> memory_; + size_t size_; + + DISALLOW_COPY_AND_ASSIGN(CodeVectorAllocator); +}; + + CompiledMethod* OptimizingCompiler::TryCompile(CompilerDriver& driver, const DexFile::CodeItem* code_item, uint32_t access_flags, @@ -26,7 +57,40 @@ CompiledMethod* OptimizingCompiler::TryCompile(CompilerDriver& driver, uint32_t method_idx, jobject class_loader, const DexFile& dex_file) const { - return nullptr; + ArenaPool pool; + ArenaAllocator arena(&pool); + HGraphBuilder builder(&arena); + HGraph* graph = builder.BuildGraph(*code_item); + if (graph == nullptr) { + return nullptr; + } + + InstructionSet instruction_set = driver.GetInstructionSet(); + CodeGenerator* codegen = CodeGenerator::Create(&arena, graph, instruction_set); + if (codegen == nullptr) { + return nullptr; + } + + CodeVectorAllocator allocator; + codegen->Compile(&allocator); + + std::vector<uint8_t> mapping_table; + codegen->BuildMappingTable(&mapping_table); + std::vector<uint8_t> vmap_table; + codegen->BuildVMapTable(&vmap_table); + std::vector<uint8_t> gc_map; + codegen->BuildNativeGCMap(&gc_map); + + return new CompiledMethod(driver, + instruction_set, + *allocator.GetMemory(), + codegen->GetFrameSize(), + 0, /* GPR spill mask, unused */ + 0, /* FPR spill mask, unused */ + mapping_table, + vmap_table, + gc_map, + nullptr); } } // namespace art |