Files
sdk/runtime/vm/dart.h
Ryan Macnak d36adbacaf [vm] Remove the VM isolate.
The former contents of the VM isolate are now included into each isolate group. This makes each isolate group's heap independent, and in particular allows each heap to be allocated to a separate pointer cage (not done in this CL).

The duplicated stubs that allowed PC relative calls are removed, since the originals can now be the target of PC relative calls.

The bootstrapping needing to load an AppJIT or AppAOT snapshot is reduced to allocating the oddballs. The code is entirely dropped in the AOT runtime, but the JIT runtime still has it to allow for flags to affect the compilation of the stub code. Further refactoring might be able to remove this for the JIT runtime too, with only gen_snapshot knowing how to bootstrap.

Class serialization no longer distinguishes predefined classes.

The page containing null is marked as never-evacuate. null, false and true must not move because the compiler relies on their low bits having certain patterns for some optimizations. (Previously, the entire VM isolate heap never moved.)

Compaction is disabled for IA32. Due to register pressure, some stub calls must not use a scratch register and embed the address of Code.

The page containing the call-through-safepoint stub is frozen when running with --write-protect-code and the stub is created at runtime (instead of loaded from an AppJIT or AppAOT snapshot). This stub must remain executable even during a safepoint, as a foreign call might during return during a safepoint and only block after the stub directs it to the runtime.

The snapshot symbols are renamed to kDartSnapshotData and kDartSnapshotText. There is no need to distinguish the VM isolate's snapshot, and snaphots are per isolate group not per isolate. Aliases with the old names are added to ease migration.

Some global flags that were automatically set based on the VM isolate's snapshot are now isolate group flags and automatically set by the isolate group's snapshot.

TEST=ci
Change-Id: Iee82016057d609112e9b021d178fc3d4d18b5044
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/500621
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
SLSA-Policy-Verified: SLSA Policy Verification Service <devtools-gerritcodereview-exitgate@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2026-05-18 11:35:03 -07:00

154 lines
5.3 KiB
C++

// Copyright (c) 2011, 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.
#ifndef RUNTIME_VM_DART_H_
#define RUNTIME_VM_DART_H_
#include "include/dart_api.h"
#include "include/dart_tools_api.h"
#include "vm/allocation.h"
#include "vm/isolate.h"
#include "vm/lockers.h"
#include "vm/os_thread.h"
#include "vm/snapshot.h"
namespace dart {
// Forward declarations.
class Isolate;
class LocalHandle;
class ThreadPool;
namespace kernel {
class Program;
}
class Dart : public AllStatic {
public:
// Returns null if initialization succeeds, otherwise returns an error message
// (caller owns error message and has to free it).
static char* Init(const Dart_InitializeParams* params);
// Returns null if cleanup succeeds, otherwise returns an error message
// (caller owns error message and has to free it).
static char* Cleanup();
// Returns true if the VM is initialized.
static bool IsInitialized();
static bool IsShuttingDown();
// Used to Indicate that a Dart API call is active.
static bool SetActiveApiCall();
static void ResetActiveApiCall();
static Isolate* CreateIsolate(const char* name_prefix,
const Dart_IsolateFlags& api_flags,
IsolateGroup* isolate_group);
// Initialize an isolate group either from a snapshot or from a Kernel binary.
// On success, returns nullptr. On failure, returns an error message that the
// caller must free.
static char* InitializeIsolateGroup(Thread* T,
const uint8_t* snapshot_data,
const uint8_t* snapshot_text,
const uint8_t* kernel_buffer,
intptr_t kernel_buffer_size);
static char* InitIsolateGroupFromSnapshot(Thread* T,
const uint8_t* snapshot_data,
const uint8_t* snapshot_text,
const uint8_t* kernel_buffer,
intptr_t kernel_buffer_size);
static ErrorPtr InitializeIsolate(Thread* T,
bool is_first_isolate_in_group,
void* isolate_data);
static void RunShutdownCallback();
static void ShutdownIsolate(Thread* T);
static ThreadPool* thread_pool() { return thread_pool_; }
static int64_t UptimeMicros();
static int64_t UptimeMillis() {
return UptimeMicros() / kMicrosecondsPerMillisecond;
}
// The returned string has to be free()ed.
static char* FeaturesString(IsolateGroup* isolate_group, Snapshot::Kind kind);
static Dart_ThreadStartCallback thread_start_callback() {
return thread_start_callback_;
}
static void set_thread_start_callback(Dart_ThreadStartCallback cback) {
thread_start_callback_ = cback;
}
static Dart_ThreadExitCallback thread_exit_callback() {
return thread_exit_callback_;
}
static void set_thread_exit_callback(Dart_ThreadExitCallback cback) {
thread_exit_callback_ = cback;
}
static void SetFileCallbacks(Dart_FileOpenCallback file_open,
Dart_FileReadCallback file_read,
Dart_FileWriteCallback file_write,
Dart_FileCloseCallback file_close) {
file_open_callback_ = file_open;
file_read_callback_ = file_read;
file_write_callback_ = file_write;
file_close_callback_ = file_close;
}
static Dart_FileOpenCallback file_open_callback() {
return file_open_callback_;
}
static Dart_FileReadCallback file_read_callback() {
return file_read_callback_;
}
static Dart_FileWriteCallback file_write_callback() {
return file_write_callback_;
}
static Dart_FileCloseCallback file_close_callback() {
return file_close_callback_;
}
static void set_entropy_source_callback(Dart_EntropySource entropy_source) {
entropy_source_callback_ = entropy_source;
}
static Dart_EntropySource entropy_source_callback() {
return entropy_source_callback_;
}
static void set_dwarf_stacktrace_footnote_callback(
Dart_DwarfStackTraceFootnoteCallback cb) {
dwarf_stacktrace_footnote_callback_ = cb;
}
static Dart_DwarfStackTraceFootnoteCallback
dwarf_stacktrace_footnote_callback() {
return dwarf_stacktrace_footnote_callback_;
}
private:
static char* DartInit(const Dart_InitializeParams* params);
static constexpr const char* kVmIsolateName = "vm-isolate";
static void WaitForIsolateShutdown();
static void WaitForApplicationIsolateShutdown();
static int64_t start_time_micros_;
static ThreadPool* thread_pool_;
static Dart_ThreadStartCallback thread_start_callback_;
static Dart_ThreadExitCallback thread_exit_callback_;
static Dart_FileOpenCallback file_open_callback_;
static Dart_FileReadCallback file_read_callback_;
static Dart_FileWriteCallback file_write_callback_;
static Dart_FileCloseCallback file_close_callback_;
static Dart_EntropySource entropy_source_callback_;
static Dart_DwarfStackTraceFootnoteCallback
dwarf_stacktrace_footnote_callback_;
};
} // namespace dart
#endif // RUNTIME_VM_DART_H_