summaryrefslogtreecommitdiff
path: root/runtime/stack_map.cc
diff options
context:
space:
mode:
author David Srbecky <dsrbecky@google.com> 2018-06-11 16:25:29 +0100
committer David Srbecky <dsrbecky@google.com> 2018-06-21 13:45:25 +0100
commit0b4e5a3a1275a4aa6955a0576ab9d57eedd5bdd2 (patch)
treeda1f910ee6c4d38a535c59eca934c394d6fc7363 /runtime/stack_map.cc
parentc046a45aabc2a244ea2595692feb97238b568701 (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.cc21
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.