// Copyright (c) 2019, 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/bss_relocs.h"
#include "vm/runtime_entry.h"
#include "vm/thread.h"

namespace dart {

static void InitializeBSSEntry(BSS::Relocation relocation,
                               uword function_address,
                               uword* bss_start) {
  std::atomic<uword>* slot = reinterpret_cast<std::atomic<uword>*>(
      &bss_start[BSS::RelocationIndex(relocation)]);
  uword old_value = slot->load(std::memory_order_relaxed);
  uword new_value = function_address;
  if (!slot->compare_exchange_strong(old_value, new_value,
                                     std::memory_order_relaxed)) {
    RELEASE_ASSERT(old_value == new_value);
  }
}

void BSS::Initialize(Thread* current, uword* bss_start) {
  InitializeBSSEntry(BSS::Relocation::DRT_GetThreadForNativeCallback,
                     reinterpret_cast<uword>(DLRT_GetThreadForNativeCallback),
                     bss_start);
}

}  // namespace dart
