summaryrefslogtreecommitdiff
path: root/compiler/optimizing/optimizing_compiler.cc
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2015-08-19 12:49:41 +0000
committer Vladimir Marko <vmarko@google.com> 2015-08-19 18:54:36 +0100
commit581550137ee3a068a14224870e71aeee924a0646 (patch)
treef62dd0d07c66a8ce4d7d994ee0e9c27bd8014bb1 /compiler/optimizing/optimizing_compiler.cc
parent32f264e67afa8654a5570d38b627515fb73fc333 (diff)
Revert "Revert "Optimizing: Better invoke-static/-direct dispatch.""
Fixed kCallArtMethod to use correct callee location for kRecursive. This combination is used when compiling with debuggable flag set. This reverts commit b2c431e80e92eb6437788cc544cee6c88c3156df. Change-Id: Idee0f2a794199ebdf24892c60f8a5dcf057db01c
Diffstat (limited to 'compiler/optimizing/optimizing_compiler.cc')
-rw-r--r--compiler/optimizing/optimizing_compiler.cc21
1 files changed, 19 insertions, 2 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 6a50b7d4a4..b18c921b2c 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -488,6 +488,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,
@@ -502,6 +515,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);
@@ -527,7 +542,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;
}
@@ -540,6 +555,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;
@@ -567,7 +584,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;
}