// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "vm/reverse_pc_lookup_cache.h" #include "vm/isolate.h" namespace dart { #if defined(DART_PRECOMPILED_RUNTIME) static uword BeginPcFromCode(const RawCode* code) { auto instr = Code::InstructionsOf(code); return Instructions::PayloadStart(instr); } static uword EndPcFromCode(const RawCode* code) { auto instr = Code::InstructionsOf(code); return Instructions::PayloadStart(instr) + Instructions::Size(instr); } void ReversePcLookupCache::BuildAndAttachToIsolate(Isolate* isolate) { auto object_store = isolate->object_store(); auto& array = Array::Handle(object_store->code_order_table()); if (!array.IsNull()) { const intptr_t length = array.Length(); { NoSafepointScope no_safepoint_scope; const uword begin = BeginPcFromCode(reinterpret_cast(array.At(0))); const uword end = EndPcFromCode(reinterpret_cast(array.At(length - 1))); auto pc_array = new uint32_t[length]; for (intptr_t i = 0; i < length; i++) { const auto end_pc = EndPcFromCode(reinterpret_cast(array.At(i))); pc_array[i] = end_pc - begin; } #if defined(DEBUG) for (intptr_t i = 1; i < length; i++) { ASSERT(pc_array[i - 1] <= pc_array[i]); } #endif // defined(DEBUG) auto cache = new ReversePcLookupCache(isolate, pc_array, length, begin, end); isolate->set_reverse_pc_lookup_cache(cache); } } } #endif // defined(DART_PRECOMPILED_RUNTIME) } // namespace dart