diff options
| author | 2018-06-11 16:25:29 +0100 | |
|---|---|---|
| committer | 2018-06-21 13:45:25 +0100 | |
| commit | 0b4e5a3a1275a4aa6955a0576ab9d57eedd5bdd2 (patch) | |
| tree | da1f910ee6c4d38a535c59eca934c394d6fc7363 /runtime/stack_map.cc | |
| parent | c046a45aabc2a244ea2595692feb97238b568701 (diff) | |
Binary search stack maps by native pc.
Test: test.py --host -r -b -t 018 -t 510
Change-Id: I07042e8dfd82adcd24fdfe1a1970a7ccdc09ce46
Diffstat (limited to 'runtime/stack_map.cc')
| -rw-r--r-- | runtime/stack_map.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/runtime/stack_map.cc b/runtime/stack_map.cc index f2418d0f1a..f40168b8b8 100644 --- a/runtime/stack_map.cc +++ b/runtime/stack_map.cc @@ -26,6 +26,27 @@ namespace art { +BitTable<StackMap>::const_iterator CodeInfo::BinarySearchNativePc(uint32_t packed_pc) const { + return std::partition_point( + stack_maps_.begin(), + stack_maps_.end(), + [packed_pc](const StackMap& sm) { + return sm.GetPackedNativePc() < packed_pc && sm.GetKind() != StackMap::Kind::Catch; + }); +} + +StackMap CodeInfo::GetStackMapForNativePcOffset(uint32_t pc, InstructionSet isa) const { + auto it = BinarySearchNativePc(StackMap::PackNativePc(pc, isa)); + // Start at the lower bound and iterate over all stack maps with the given native pc. + for (; it != stack_maps_.end() && (*it).GetNativePcOffset(isa) == pc; ++it) { + StackMap::Kind kind = static_cast<StackMap::Kind>((*it).GetKind()); + if (kind == StackMap::Kind::Default || kind == StackMap::Kind::OSR) { + return *it; + } + } + return StackMap(); +} + // Scan backward to determine dex register locations at given stack map. // All registers for a stack map are combined - inlined registers are just appended, // therefore 'first_dex_register' allows us to select a sub-range to decode. |