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
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 6a50b7d..b18c921 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -488,6 +488,19 @@
}
}
+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 @@
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 @@
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 @@
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 @@
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;
}