diff options
author | Roland Levillain <rpl@google.com> | 2015-02-17 15:40:09 +0000 |
---|---|---|
committer | Roland Levillain <rpl@google.com> | 2015-02-19 12:13:09 +0000 |
commit | aa9b7c48069699e2aabedc6c0f62cb131fee0c73 (patch) | |
tree | dafc6b514825490e65ecee4385f08f066add8c95 | |
parent | cf3fb94a90d74361b13e7bae5aa6e0e4ae58479d (diff) | |
download | art-aa9b7c48069699e2aabedc6c0f62cb131fee0c73.tar.gz art-aa9b7c48069699e2aabedc6c0f62cb131fee0c73.tar.bz2 art-aa9b7c48069699e2aabedc6c0f62cb131fee0c73.zip |
Have the opt. compiler set the size of "empty" frames to zero.
This is to mimic Quick's behavior and honor stack frame
alignment constraints after changes introduced by Change-Id
I0fdb31e8c631e99091b818874a558c9aa04b1628.
This issue use to make oatdump crash on oat files produced by
the optimized compiler (e.g.
out/host/linux-x86/framework/x86_64/core-optimizing.oat).
Change-Id: I8ba52601edb0a0993eaf8923eba55aafdce5043e
-rw-r--r-- | compiler/optimizing/code_generator.h | 11 | ||||
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 31 |
2 files changed, 26 insertions, 16 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index 6c78f1050..0310877f1 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -238,6 +238,13 @@ class CodeGenerator { void AllocateLocations(HInstruction* instruction); + // Tells whether the stack frame of the compiled method is + // considered "empty", that is either actually having a size of zero, + // or just containing the saved return address register. + bool HasEmptyFrame() const { + return GetFrameSize() == (CallPushesPC() ? GetWordSize() : 0); + } + protected: CodeGenerator(HGraph* graph, size_t number_of_core_registers, @@ -312,10 +319,6 @@ class CodeGenerator { return instruction_set == kX86 || instruction_set == kX86_64; } - bool HasEmptyFrame() const { - return GetFrameSize() == (CallPushesPC() ? GetWordSize() : 0); - } - // Arm64 has its own type for a label, so we need to templatize this method // to share the logic. template <typename T> diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index c518f33f5..0ece77d2d 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -376,7 +376,10 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, compiler_driver, codegen->GetInstructionSet(), ArrayRef<const uint8_t>(allocator.GetMemory()), - codegen->GetFrameSize(), + // Follow Quick's behavior and set the frame size to zero if it is + // considered "empty" (see the definition of + // art::CodeGenerator::HasEmptyFrame). + codegen->HasEmptyFrame() ? 0 : codegen->GetFrameSize(), codegen->GetCoreSpillMask(), codegen->GetFpuSpillMask(), ArrayRef<const uint8_t>(stack_map)); @@ -400,17 +403,21 @@ CompiledMethod* OptimizingCompiler::CompileBaseline( codegen->BuildNativeGCMap(&gc_map, dex_compilation_unit); compilation_stats_.RecordStat(MethodCompilationStat::kCompiledBaseline); - return CompiledMethod::SwapAllocCompiledMethod(compiler_driver, - codegen->GetInstructionSet(), - ArrayRef<const uint8_t>(allocator.GetMemory()), - codegen->GetFrameSize(), - codegen->GetCoreSpillMask(), - codegen->GetFpuSpillMask(), - &src_mapping_table, - AlignVectorSize(mapping_table), - AlignVectorSize(vmap_table), - AlignVectorSize(gc_map), - ArrayRef<const uint8_t>()); + return CompiledMethod::SwapAllocCompiledMethod( + compiler_driver, + codegen->GetInstructionSet(), + ArrayRef<const uint8_t>(allocator.GetMemory()), + // Follow Quick's behavior and set the frame size to zero if it is + // considered "empty" (see the definition of + // art::CodeGenerator::HasEmptyFrame). + codegen->HasEmptyFrame() ? 0 : codegen->GetFrameSize(), + codegen->GetCoreSpillMask(), + codegen->GetFpuSpillMask(), + &src_mapping_table, + AlignVectorSize(mapping_table), + AlignVectorSize(vmap_table), + AlignVectorSize(gc_map), + ArrayRef<const uint8_t>()); } CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, |