From ab1d559aee05873f70494514922ad4b767c6a709 Mon Sep 17 00:00:00 2001 From: Santiago Aboy Solanes Date: Fri, 24 Jun 2022 11:16:35 +0100 Subject: Runtime implementation of try catch inlining The main differences in the runtime are: 1) We now use a list of dex_pcs to find the correct catch handler instead of a single dex pc 2) We now need to restore vregs of the whole frame, which may be an inline frame. Bug: 227283224 Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b Change-Id: I95d2f32088e1d420c83962a1693be18f3b63f8b4 --- compiler/optimizing/stack_map_stream.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'compiler/optimizing/stack_map_stream.cc') diff --git a/compiler/optimizing/stack_map_stream.cc b/compiler/optimizing/stack_map_stream.cc index c13a35567b..31428d5c2a 100644 --- a/compiler/optimizing/stack_map_stream.cc +++ b/compiler/optimizing/stack_map_stream.cc @@ -20,6 +20,7 @@ #include #include "art_method-inl.h" +#include "base/globals.h" #include "base/stl_util.h" #include "class_linker.h" #include "dex/dex_file.h" @@ -101,16 +102,21 @@ void StackMapStream::EndMethod(size_t code_size) { } } -void StackMapStream::BeginStackMapEntry(uint32_t dex_pc, - uint32_t native_pc_offset, - uint32_t register_mask, - BitVector* stack_mask, - StackMap::Kind kind, - bool needs_vreg_info) { +void StackMapStream::BeginStackMapEntry( + uint32_t dex_pc, + uint32_t native_pc_offset, + uint32_t register_mask, + BitVector* stack_mask, + StackMap::Kind kind, + bool needs_vreg_info, + const std::vector& dex_pc_list_for_catch_verification) { DCHECK(in_method_) << "Call BeginMethod first"; DCHECK(!in_stack_map_) << "Mismatched Begin/End calls"; in_stack_map_ = true; + DCHECK_IMPLIES(!dex_pc_list_for_catch_verification.empty(), kind == StackMap::Kind::Catch); + DCHECK_IMPLIES(!dex_pc_list_for_catch_verification.empty(), kIsDebugBuild); + current_stack_map_ = BitTableBuilder::Entry(); current_stack_map_[StackMap::kKind] = static_cast(kind); current_stack_map_[StackMap::kPackedNativePc] = @@ -151,7 +157,8 @@ void StackMapStream::BeginStackMapEntry(uint32_t dex_pc, instruction_set_); CHECK_EQ(stack_map.Row(), stack_map_index); } else if (kind == StackMap::Kind::Catch) { - StackMap stack_map = code_info.GetCatchStackMapForDexPc(dex_pc); + StackMap stack_map = code_info.GetCatchStackMapForDexPc( + ArrayRef(dex_pc_list_for_catch_verification)); CHECK_EQ(stack_map.Row(), stack_map_index); } StackMap stack_map = code_info.GetStackMapAt(stack_map_index); -- cgit v1.2.3-59-g8ed1b