mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:47:36 +00:00
13ec07415b
More details about the design: https://docs.google.com/document/d/1QDjyY_6wOTOgURwpeYMKU9qEz0gKxx2MUrdruC6Kp6c/edit?usp=sharing Change-Id: Ie3985d86dca7f5010044ca46c33ca177588c0f69 Bug: #37022 CoreLibraryReviewExempt: Reviewed by vm and api groups. web and wasm groups not affected because FFI isn't on those platforms. TEST=async_void_function_callbacks_test.dart, ffi_callback_metadata_test.cc, other front end tests Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/305900 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
51 lines
2.2 KiB
C++
51 lines
2.2 KiB
C++
// 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/native_symbol.h"
|
|
#include "vm/runtime_entry.h"
|
|
#include "vm/thread.h"
|
|
|
|
namespace dart {
|
|
|
|
void BSS::InitializeBSSEntry(BSS::Relocation relocation,
|
|
uword new_value,
|
|
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);
|
|
// FullSnapshotReader::ReadProgramSnapshot, and thus BSS::Initialize, can
|
|
// get called multiple times for the same isolate in different threads, though
|
|
// the initialized value will be consistent and thus change only once. Avoid
|
|
// calling compare_exchange_strong unless we actually need to change the
|
|
// value, to avoid spurious read/write races by TSAN.
|
|
if (old_value == new_value) return;
|
|
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, bool vm) {
|
|
auto const instructions = reinterpret_cast<uword>(
|
|
current->isolate_group()->source()->snapshot_instructions);
|
|
uword dso_base;
|
|
// Needed for assembly snapshots. For ELF snapshots, we set up the relocated
|
|
// address information directly in the text segment InstructionsSection.
|
|
if (NativeSymbolResolver::LookupSharedObject(instructions, &dso_base)) {
|
|
InitializeBSSEntry(Relocation::InstructionsRelocatedAddress,
|
|
instructions - dso_base, bss_start);
|
|
}
|
|
|
|
// TODO(https://dartbug.com/52579): Remove.
|
|
InitializeBSSEntry(Relocation::DRT_GetFfiCallbackMetadata,
|
|
reinterpret_cast<uword>(DLRT_GetFfiCallbackMetadata),
|
|
bss_start);
|
|
InitializeBSSEntry(Relocation::DRT_ExitTemporaryIsolate,
|
|
reinterpret_cast<uword>(DLRT_ExitTemporaryIsolate),
|
|
bss_start);
|
|
}
|
|
|
|
} // namespace dart
|