diff options
author | 2015-09-21 23:29:32 +0000 | |
---|---|---|
committer | 2015-09-21 23:29:32 +0000 | |
commit | a28cae4d38020ea5c42c203414eaa667743ffd1e (patch) | |
tree | e76a781160bb2b70337c630b463761679ee00b57 /runtime/stack.cc | |
parent | beb5d85bec2f2e001fa89a79c0dfccbc9290986c (diff) | |
parent | 356412e2b7ba3fde164bc08a44fee0ddc19c54e1 (diff) |
Merge "Add one LinearAlloc per ClassLoader"
Diffstat (limited to 'runtime/stack.cc')
-rw-r--r-- | runtime/stack.cc | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/runtime/stack.cc b/runtime/stack.cc index d739743151..7f72f8ab61 100644 --- a/runtime/stack.cc +++ b/runtime/stack.cc @@ -840,23 +840,30 @@ void StackVisitor::SanityCheckFrame() const { } else { CHECK(declaring_class == nullptr); } - auto* runtime = Runtime::Current(); - auto* la = runtime->GetLinearAlloc(); - if (!la->Contains(method)) { - // Check image space. - bool in_image = false; - for (auto& space : runtime->GetHeap()->GetContinuousSpaces()) { - if (space->IsImageSpace()) { - auto* image_space = space->AsImageSpace(); - const auto& header = image_space->GetImageHeader(); - const auto* methods = &header.GetMethodsSection(); - if (methods->Contains(reinterpret_cast<const uint8_t*>(method) - image_space->Begin())) { - in_image = true; - break; + Runtime* const runtime = Runtime::Current(); + LinearAlloc* const linear_alloc = runtime->GetLinearAlloc(); + if (!linear_alloc->Contains(method)) { + // Check class linker linear allocs. + mirror::Class* klass = method->GetDeclaringClass(); + LinearAlloc* const class_linear_alloc = (klass != nullptr) + ? ClassLinker::GetAllocatorForClassLoader(klass->GetClassLoader()) + : linear_alloc; + if (!class_linear_alloc->Contains(method)) { + // Check image space. + bool in_image = false; + for (auto& space : runtime->GetHeap()->GetContinuousSpaces()) { + if (space->IsImageSpace()) { + auto* image_space = space->AsImageSpace(); + const auto& header = image_space->GetImageHeader(); + const auto* methods = &header.GetMethodsSection(); + if (methods->Contains(reinterpret_cast<const uint8_t*>(method) - image_space->Begin())) { + in_image = true; + break; + } } } + CHECK(in_image) << PrettyMethod(method) << " not in linear alloc or image"; } - CHECK(in_image) << PrettyMethod(method) << " not in linear alloc or image"; } if (cur_quick_frame_ != nullptr) { method->AssertPcIsWithinQuickCode(cur_quick_frame_pc_); |