// 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) {
  return Code::PayloadStartOf(code);
}

static uword EndPcFromCode(const RawCode* code) {
  return Code::PayloadStartOf(code) + Code::PayloadSizeOf(code);
}

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<RawCode*>(array.At(0)));
      const uword end =
          EndPcFromCode(reinterpret_cast<RawCode*>(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<RawCode*>(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
