Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(587)

Unified Diff: runtime/vm/dart.cc

Issue 1938653002: JIT precompilated snapshots. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart.cc
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index cd7dbde9f15319d29d4dfcf006c73250d589489d..8f5fcfeaa0249c0822c43dec450d0b4bd7eef527 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -47,6 +47,7 @@ int64_t Dart::start_time_ = 0;
ThreadPool* Dart::thread_pool_ = NULL;
DebugInfo* Dart::pprof_symbol_generator_ = NULL;
ReadOnlyHandles* Dart::predefined_handles_ = NULL;
+Snapshot::Kind Dart::snapshot_kind_ = Snapshot::kInvalid;
const uint8_t* Dart::instructions_snapshot_buffer_ = NULL;
const uint8_t* Dart::data_snapshot_buffer_ = NULL;
Dart_ThreadExitCallback Dart::thread_exit_callback_ = NULL;
@@ -131,15 +132,6 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
if (vm_isolate_ != NULL || !Flags::Initialized()) {
return "VM already initialized or flags not initialized.";
}
-#if defined(DART_PRECOMPILED_RUNTIME)
- if (instructions_snapshot == NULL) {
- return "Precompiled runtime requires a precompiled snapshot";
- }
-#else
- if (instructions_snapshot != NULL) {
- return "JIT runtime cannot run a precompiled snapshot";
- }
-#endif
set_thread_exit_callback(thread_exit);
SetFileCallbacks(file_open, file_read, file_write, file_close);
set_entropy_source_callback(entropy_source);
@@ -178,14 +170,12 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
ASSERT(vm_isolate_ == NULL);
ASSERT(Flags::Initialized());
const bool is_vm_isolate = true;
- const bool precompiled = instructions_snapshot != NULL;
// Setup default flags for the VM isolate.
Dart_IsolateFlags api_flags;
Isolate::FlagsInitialize(&api_flags);
vm_isolate_ = Isolate::Init("vm-isolate", api_flags, is_vm_isolate);
start_time_ = vm_isolate_->start_time();
- vm_isolate_->set_compilation_allowed(!precompiled);
// Verify assumptions about executing in the VM isolate.
ASSERT(vm_isolate_ == Isolate::Current());
ASSERT(vm_isolate_ == Thread::Current()->isolate());
@@ -200,24 +190,48 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
Object::InitOnce(vm_isolate_);
ArgumentsDescriptor::InitOnce();
ICData::InitOnce();
- // When precompiled the stub code is initialized from the snapshot.
- if (!precompiled) {
- StubCode::InitOnce();
- }
if (vm_isolate_snapshot != NULL) {
NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
"VMIsolateSnapshot"));
- if (instructions_snapshot != NULL) {
- vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
- }
- if (data_snapshot != NULL) {
- vm_isolate_->SetupDataSnapshotPage(data_snapshot);
- }
const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
if (snapshot == NULL) {
- return "Invalid vm isolate snapshot seen.";
+ return "Invalid vm isolate snapshot seen";
+ }
+ snapshot_kind_ = snapshot->kind();
+ if (Snapshot::IncludesCode(snapshot_kind_)) {
+ if (snapshot_kind_ == Snapshot::kAppNoJIT) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+ vm_isolate_->set_compilation_allowed(false);
+ if (!FLAG_precompiled_runtime) {
+ return "Flag --precompilation was not specified";
+ }
+#else
+ return "JIT runtime cannot run a precompiled snapshot";
+#endif
+ }
+ if (instructions_snapshot == NULL) {
+ return "Missing instructions snapshot";
+ }
+ if (data_snapshot == NULL) {
+ return "Missing rodata snapshot";
+ }
+ vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
+ vm_isolate_->SetupDataSnapshotPage(data_snapshot);
+ } else if (Snapshot::IsFull(snapshot_kind_)) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+ return "Precompiled runtime requires a precompiled snapshot";
+#else
+ if (instructions_snapshot != NULL) {
+ return "Unexpected instructions snapshot";
+ }
+ if (data_snapshot != NULL) {
+ return "Unexpected rodata snapshot";
+ }
+ StubCode::InitOnce();
+#endif
+ } else {
+ return "Invalid vm isolate snapshot seen";
}
- ASSERT(Snapshot::IsFull(snapshot->kind()));
VmIsolateSnapshotReader reader(snapshot->kind(),
snapshot->content(),
snapshot->length(),
@@ -226,7 +240,7 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
T);
const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot());
if (!error.IsNull()) {
- return error.ToCString();
+ return error.ToErrorCString();
}
NOT_IN_PRODUCT(if (tds.enabled()) {
tds.SetNumArguments(2);
@@ -247,7 +261,13 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", capacity);
}
} else {
+#if defined(DART_PRECOMPILED_RUNTIME)
+ return "Precompiled runtime requires a precompiled snapshot";
+#else
+ snapshot_kind_ = Snapshot::kNone;
+ StubCode::InitOnce();
Symbols::InitOnce(vm_isolate_);
+#endif
}
// We need to initialize the constants here for the vm isolate thread due to
// bootstrapping issues.
@@ -487,6 +507,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
return ApiError::New(message);
}
ASSERT(Snapshot::IsFull(snapshot->kind()));
+ ASSERT(snapshot->kind() == snapshot_kind_);
if (FLAG_trace_isolates) {
OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length());
}
@@ -511,6 +532,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
MegamorphicCacheTable::PrintSizes(I);
}
} else {
+ ASSERT(snapshot_kind_ == Snapshot::kNone);
// Populate the isolate's symbol table with all symbols from the
// VM isolate. We do this so that when we generate a full snapshot
// for the isolate we have a unified symbol table that we can then
@@ -530,7 +552,7 @@ RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
#if !defined(DART_PRECOMPILED_RUNTIME)
// When running precompiled, the megamorphic miss function/code comes from the
// snapshot.
- if (!Dart::IsRunningPrecompiledCode()) {
+ if (!Snapshot::IncludesCode(Dart::snapshot_kind())) {
MegamorphicCacheTable::InitMissHandler(I);
}
#endif
« no previous file with comments | « runtime/vm/dart.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698