Index: runtime/bin/gen_snapshot.cc |
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc |
index 0e9f1ff53914a2856086e0b72bf15001dcbeab34..5d4811c92dfe11e14e166a09d62263e6c5d57698 100644 |
--- a/runtime/bin/gen_snapshot.cc |
+++ b/runtime/bin/gen_snapshot.cc |
@@ -61,12 +61,14 @@ static const int kErrorExitCode = 255; |
// The core snapshot to use when creating isolates. Normally NULL, but loaded |
// from a file when creating script snapshots. |
const uint8_t* isolate_snapshot_data = NULL; |
+const uint8_t* isolate_snapshot_instructions = NULL; |
// Global state that indicates whether a snapshot is to be created and |
// if so which file to write the snapshot into. |
enum SnapshotKind { |
kCore, |
+ kCoreJIT, |
kScript, |
kAppAOTBlobs, |
kAppAOTAssembly, |
@@ -213,7 +215,10 @@ static bool ProcessSnapshotKindOption(const char* option) { |
if (kind == NULL) { |
return false; |
} |
- if (strcmp(kind, "core") == 0) { |
+ if (strcmp(kind, "core-jit") == 0) { |
+ snapshot_kind = kCoreJIT; |
+ return true; |
+ } else if (strcmp(kind, "core") == 0) { |
snapshot_kind = kCore; |
return true; |
} else if (strcmp(kind, "script") == 0) { |
@@ -456,6 +461,19 @@ static int ParseArguments(int argc, |
} |
break; |
} |
+ case kCoreJIT: { |
+ if ((vm_snapshot_data_filename == NULL) || |
+ (vm_snapshot_instructions_filename == NULL) || |
+ (isolate_snapshot_data_filename == NULL) || |
+ (isolate_snapshot_instructions_filename == NULL)) { |
+ Log::PrintErr( |
+ "Building a core JIT snapshot requires specifying output " |
+ "files for --vm_snapshot_data, --vm_snapshot_instructions, " |
+ "--isolate_snapshot_data and --isolate_snapshot_instructions.\n\n"); |
+ return -1; |
+ } |
+ break; |
+ } |
case kScript: { |
if ((vm_snapshot_data_filename == NULL) || |
(isolate_snapshot_data_filename == NULL) || |
@@ -693,6 +711,7 @@ static void CreateAndWriteDependenciesFile() { |
case kAppAOTAssembly: |
success &= file->Print("%s ", assembly_filename); |
break; |
+ case kCoreJIT: |
case kAppAOTBlobs: |
success &= file->Print("%s ", vm_snapshot_data_filename); |
success &= file->Print("%s ", vm_snapshot_instructions_filename); |
@@ -1275,8 +1294,55 @@ static void CreateAndWriteCoreSnapshot() { |
// specified file and exit. |
WriteSnapshotFile(vm_snapshot_data_filename, vm_snapshot_data_buffer, |
vm_snapshot_data_size); |
+ if (vm_snapshot_instructions_filename != NULL) { |
+ WriteSnapshotFile(vm_snapshot_instructions_filename, NULL, 0); |
+ } |
WriteSnapshotFile(isolate_snapshot_data_filename, |
isolate_snapshot_data_buffer, isolate_snapshot_data_size); |
+ if (isolate_snapshot_instructions_filename != NULL) { |
+ WriteSnapshotFile(isolate_snapshot_instructions_filename, NULL, 0); |
+ } |
+} |
+ |
+ |
+static void CreateAndWriteCoreJITSnapshot() { |
+ ASSERT(snapshot_kind == kCoreJIT); |
+ ASSERT(vm_snapshot_data_filename != NULL); |
+ ASSERT(vm_snapshot_instructions_filename != NULL); |
+ ASSERT(isolate_snapshot_data_filename != NULL); |
+ ASSERT(isolate_snapshot_instructions_filename != NULL); |
+ |
+ Dart_Handle result; |
+ uint8_t* vm_snapshot_data_buffer = NULL; |
+ intptr_t vm_snapshot_data_size = 0; |
+ uint8_t* vm_snapshot_instructions_buffer = NULL; |
+ intptr_t vm_snapshot_instructions_size = 0; |
+ uint8_t* isolate_snapshot_data_buffer = NULL; |
+ intptr_t isolate_snapshot_data_size = 0; |
+ uint8_t* isolate_snapshot_instructions_buffer = NULL; |
+ intptr_t isolate_snapshot_instructions_size = 0; |
+ |
+ // First create a snapshot. |
+ result = Dart_CreateCoreJITSnapshotAsBlobs( |
+ &vm_snapshot_data_buffer, &vm_snapshot_data_size, |
+ &vm_snapshot_instructions_buffer, &vm_snapshot_instructions_size, |
+ &isolate_snapshot_data_buffer, &isolate_snapshot_data_size, |
+ &isolate_snapshot_instructions_buffer, |
+ &isolate_snapshot_instructions_size); |
+ CHECK_RESULT(result); |
+ |
+ // Now write the vm isolate and isolate snapshots out to the |
+ // specified file and exit. |
+ WriteSnapshotFile(vm_snapshot_data_filename, vm_snapshot_data_buffer, |
+ vm_snapshot_data_size); |
+ WriteSnapshotFile(vm_snapshot_instructions_filename, |
+ vm_snapshot_instructions_buffer, |
+ vm_snapshot_instructions_size); |
+ WriteSnapshotFile(isolate_snapshot_data_filename, |
+ isolate_snapshot_data_buffer, isolate_snapshot_data_size); |
+ WriteSnapshotFile(isolate_snapshot_instructions_filename, |
+ isolate_snapshot_instructions_buffer, |
+ isolate_snapshot_instructions_size); |
} |
@@ -1391,8 +1457,9 @@ static Dart_Isolate CreateServiceIsolate(const char* script_uri, |
IsolateData* isolate_data = |
new IsolateData(script_uri, package_root, package_config, NULL); |
Dart_Isolate isolate = NULL; |
- isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, NULL, |
- NULL, isolate_data, error); |
+ isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, |
+ isolate_snapshot_instructions, NULL, |
+ isolate_data, error); |
if (isolate == NULL) { |
Log::PrintErr("Error: Could not create service isolate\n"); |
@@ -1427,6 +1494,22 @@ static Dart_Isolate CreateServiceIsolate(const char* script_uri, |
} |
+static MappedMemory* MapFile(const char* filename, File::MapType type) { |
+ File* file = File::Open(filename, File::kRead); |
+ if (file == NULL) { |
+ Log::PrintErr("Failed to open: %s\n", filename); |
+ exit(kErrorExitCode); |
+ } |
+ MappedMemory* mapping = file->Map(type, 0, file->Length()); |
+ if (mapping == NULL) { |
+ Log::PrintErr("Failed to read: %s\n", vm_snapshot_data_filename); |
+ exit(kErrorExitCode); |
+ } |
+ file->Release(); |
+ return mapping; |
+} |
+ |
+ |
int main(int argc, char** argv) { |
const int EXTRA_VM_ARGUMENTS = 2; |
CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); |
@@ -1460,6 +1543,13 @@ int main(int argc, char** argv) { |
if (IsSnapshottingForPrecompilation()) { |
vm_options.AddArgument("--precompilation"); |
} |
+ if (snapshot_kind == kCoreJIT) { |
+ vm_options.AddArgument("--fields_may_be_reset"); |
+ vm_options.AddArgument("--link_natives_lazily"); |
+#if !defined(PRODUCT) |
+ vm_options.AddArgument("--collect_code=false"); |
+#endif |
+ } |
Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
@@ -1482,36 +1572,33 @@ int main(int argc, char** argv) { |
init_params.entropy_source = DartUtils::EntropySource; |
MappedMemory* mapped_vm_snapshot_data = NULL; |
+ MappedMemory* mapped_vm_snapshot_instructions = NULL; |
MappedMemory* mapped_isolate_snapshot_data = NULL; |
+ MappedMemory* mapped_isolate_snapshot_instructions = NULL; |
if (snapshot_kind == kScript) { |
- File* file = File::Open(vm_snapshot_data_filename, File::kRead); |
- if (file == NULL) { |
- Log::PrintErr("Failed to open: %s\n", vm_snapshot_data_filename); |
- return kErrorExitCode; |
- } |
- mapped_vm_snapshot_data = file->Map(File::kReadOnly, 0, file->Length()); |
- if (mapped_vm_snapshot_data == NULL) { |
- Log::PrintErr("Failed to read: %s\n", vm_snapshot_data_filename); |
- return kErrorExitCode; |
- } |
- file->Release(); |
+ mapped_vm_snapshot_data = |
+ MapFile(vm_snapshot_data_filename, File::kReadOnly); |
init_params.vm_snapshot_data = |
reinterpret_cast<const uint8_t*>(mapped_vm_snapshot_data->address()); |
- file = File::Open(isolate_snapshot_data_filename, File::kRead); |
- if (file == NULL) { |
- Log::PrintErr("Failed to open: %s\n", isolate_snapshot_data_filename); |
- return kErrorExitCode; |
+ if (vm_snapshot_instructions_filename != NULL) { |
+ mapped_vm_snapshot_instructions = |
+ MapFile(vm_snapshot_instructions_filename, File::kReadExecute); |
+ init_params.vm_snapshot_instructions = reinterpret_cast<const uint8_t*>( |
+ mapped_vm_snapshot_instructions->address()); |
} |
+ |
mapped_isolate_snapshot_data = |
- file->Map(File::kReadOnly, 0, file->Length()); |
- if (mapped_isolate_snapshot_data == NULL) { |
- Log::PrintErr("Failed to read: %s\n", isolate_snapshot_data_filename); |
- return kErrorExitCode; |
- } |
- file->Release(); |
+ MapFile(isolate_snapshot_data_filename, File::kReadOnly); |
isolate_snapshot_data = reinterpret_cast<const uint8_t*>( |
mapped_isolate_snapshot_data->address()); |
+ |
+ if (isolate_snapshot_instructions_filename != NULL) { |
+ mapped_isolate_snapshot_instructions = |
+ MapFile(isolate_snapshot_instructions_filename, File::kReadExecute); |
+ isolate_snapshot_instructions = reinterpret_cast<const uint8_t*>( |
+ mapped_isolate_snapshot_instructions->address()); |
+ } |
} |
char* error = Dart_Initialize(&init_params); |
@@ -1524,7 +1611,8 @@ int main(int argc, char** argv) { |
IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root, |
commandline_packages_file, NULL); |
Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, |
- NULL, NULL, isolate_data, &error); |
+ isolate_snapshot_instructions, NULL, |
+ isolate_data, &error); |
if (isolate == NULL) { |
Log::PrintErr("Error: %s\n", error); |
free(error); |
@@ -1589,7 +1677,8 @@ int main(int argc, char** argv) { |
is_kernel_file |
? Dart_CreateIsolateFromKernel(NULL, NULL, kernel_program, NULL, |
isolate_data, &error) |
- : Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, NULL, NULL, |
+ : Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, |
+ isolate_snapshot_instructions, NULL, |
isolate_data, &error); |
if (isolate == NULL) { |
Log::PrintErr("%s\n", error); |
@@ -1643,6 +1732,9 @@ int main(int argc, char** argv) { |
case kCore: |
CreateAndWriteCoreSnapshot(); |
break; |
+ case kCoreJIT: |
+ CreateAndWriteCoreJITSnapshot(); |
+ break; |
case kScript: |
CreateAndWriteScriptSnapshot(); |
break; |
@@ -1666,7 +1758,17 @@ int main(int argc, char** argv) { |
Dart_ShutdownIsolate(); |
} else { |
SetupForGenericSnapshotCreation(); |
- CreateAndWriteCoreSnapshot(); |
+ switch (snapshot_kind) { |
+ case kCore: |
+ CreateAndWriteCoreSnapshot(); |
+ break; |
+ case kCoreJIT: |
+ CreateAndWriteCoreJITSnapshot(); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ break; |
+ } |
Dart_ExitScope(); |
Dart_ShutdownIsolate(); |