diff options
author | Vladimir Marko <vmarko@google.com> | 2015-08-19 18:05:46 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-08-19 18:05:46 +0000 |
commit | 99429ae0610e8d67d417542942c4befb35950bd3 (patch) | |
tree | 707a048ce213083edcf370a0a021e66a709d157c /compiler/optimizing/optimizing_compiler.cc | |
parent | a35d4c9d66b372e7ae1014357c48ddfa6104085b (diff) | |
parent | 581550137ee3a068a14224870e71aeee924a0646 (diff) |
Merge "Revert "Revert "Optimizing: Better invoke-static/-direct dispatch."""
Diffstat (limited to 'compiler/optimizing/optimizing_compiler.cc')
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 866e71705f..569522d34c 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -520,6 +520,19 @@ static void AllocateRegisters(HGraph* graph, } } +static ArenaVector<LinkerPatch> EmitAndSortLinkerPatches(CodeGenerator* codegen) { + ArenaVector<LinkerPatch> linker_patches(codegen->GetGraph()->GetArena()->Adapter()); + codegen->EmitLinkerPatches(&linker_patches); + + // Sort patches by literal offset. Required for .oat_patches encoding. + std::sort(linker_patches.begin(), linker_patches.end(), + [](const LinkerPatch& lhs, const LinkerPatch& rhs) { + return lhs.LiteralOffset() < rhs.LiteralOffset(); + }); + + return linker_patches; +} + CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, CodeGenerator* codegen, CompilerDriver* compiler_driver, @@ -534,6 +547,8 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, CodeVectorAllocator allocator; codegen->CompileOptimized(&allocator); + ArenaVector<LinkerPatch> linker_patches = EmitAndSortLinkerPatches(codegen); + DefaultSrcMap src_mapping_table; if (compiler_driver->GetCompilerOptions().GetGenerateDebugInfo()) { codegen->BuildSourceMap(&src_mapping_table); @@ -559,7 +574,7 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, ArrayRef<const uint8_t>(stack_map), ArrayRef<const uint8_t>(), // native_gc_map. ArrayRef<const uint8_t>(*codegen->GetAssembler()->cfi().data()), - ArrayRef<const LinkerPatch>()); + ArrayRef<const LinkerPatch>(linker_patches)); pass_observer->DumpDisassembly(); return compiled_method; } @@ -572,6 +587,8 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( CodeVectorAllocator allocator; codegen->CompileBaseline(&allocator); + ArenaVector<LinkerPatch> linker_patches = EmitAndSortLinkerPatches(codegen); + std::vector<uint8_t> mapping_table; codegen->BuildMappingTable(&mapping_table); DefaultSrcMap src_mapping_table; @@ -599,7 +616,7 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( AlignVectorSize(vmap_table), AlignVectorSize(gc_map), ArrayRef<const uint8_t>(*codegen->GetAssembler()->cfi().data()), - ArrayRef<const LinkerPatch>()); + ArrayRef<const LinkerPatch>(linker_patches)); pass_observer->DumpDisassembly(); return compiled_method; } |