From 9b688a095afbae21112df5d495487ac5231b12d0 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Wed, 6 May 2015 14:12:42 +0100 Subject: Optimizing: Better invoke-static/-direct dispatch. Add framework for different types of loading ArtMethod* and code pointer retrieval. Implement invoke-static and invoke-direct calls the same way as Quick. Document the dispatch kinds in HInvokeStaticOrDirect's new enumerations MethodLoadKind and CodePtrLocation. PC-relative loads from dex cache arrays are used only for x86-64 and arm64. The implementation for other architectures will be done in separate CLs. Change-Id: I468ca4d422dbd14748e1ba6b45289f0d31734d94 --- compiler/optimizing/optimizing_compiler.cc | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'compiler/optimizing/optimizing_compiler.cc') 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 EmitAndSortLinkerPatches(CodeGenerator* codegen) { + ArenaVector 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 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(stack_map), ArrayRef(), // native_gc_map. ArrayRef(*codegen->GetAssembler()->cfi().data()), - ArrayRef()); + ArrayRef(linker_patches)); pass_observer->DumpDisassembly(); return compiled_method; } @@ -540,6 +555,8 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( CodeVectorAllocator allocator; codegen->CompileBaseline(&allocator); + ArenaVector linker_patches = EmitAndSortLinkerPatches(codegen); + std::vector mapping_table; codegen->BuildMappingTable(&mapping_table); DefaultSrcMap src_mapping_table; @@ -567,7 +584,7 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( AlignVectorSize(vmap_table), AlignVectorSize(gc_map), ArrayRef(*codegen->GetAssembler()->cfi().data()), - ArrayRef()); + ArrayRef(linker_patches)); pass_observer->DumpDisassembly(); return compiled_method; } -- cgit v1.2.3-59-g8ed1b