diff options
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r-- | compiler/optimizing/code_generator.cc | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index bd8db30d44..1c5912d87e 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -15,6 +15,7 @@ */ #include "code_generator.h" +#include "base/globals.h" #ifdef ART_ENABLE_CODEGEN_arm #include "code_generator_arm_vixl.h" @@ -1339,8 +1340,11 @@ void CodeGenerator::RecordCatchBlockInfo() { continue; } - // Get the outer dex_pc - uint32_t outer_dex_pc = block->GetDexPc(); + // Get the outer dex_pc. We save the full environment list for DCHECK purposes in kIsDebugBuild. + std::vector<uint32_t> dex_pc_list_for_verification; + if (kIsDebugBuild) { + dex_pc_list_for_verification.push_back(block->GetDexPc()); + } DCHECK(block->GetFirstInstruction()->IsNop()); DCHECK(block->GetFirstInstruction()->AsNop()->NeedsEnvironment()); HEnvironment* const environment = block->GetFirstInstruction()->GetEnvironment(); @@ -1348,15 +1352,26 @@ void CodeGenerator::RecordCatchBlockInfo() { HEnvironment* outer_environment = environment; while (outer_environment->GetParent() != nullptr) { outer_environment = outer_environment->GetParent(); + if (kIsDebugBuild) { + dex_pc_list_for_verification.push_back(outer_environment->GetDexPc()); + } + } + + if (kIsDebugBuild) { + // dex_pc_list_for_verification is set from innnermost to outermost. Let's reverse it + // since we are expected to pass from outermost to innermost. + std::reverse(dex_pc_list_for_verification.begin(), dex_pc_list_for_verification.end()); + DCHECK_EQ(dex_pc_list_for_verification.front(), outer_environment->GetDexPc()); } - outer_dex_pc = outer_environment->GetDexPc(); uint32_t native_pc = GetAddressOf(block); - stack_map_stream->BeginStackMapEntry(outer_dex_pc, + stack_map_stream->BeginStackMapEntry(outer_environment->GetDexPc(), native_pc, /* register_mask= */ 0, /* sp_mask= */ nullptr, - StackMap::Kind::Catch); + StackMap::Kind::Catch, + /* needs_vreg_info= */ true, + dex_pc_list_for_verification); EmitEnvironment(environment, /* slow_path= */ nullptr, |