| Index: runtime/bin/main.cc
|
| diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
|
| index fb8b33844d5bb108525de5c6ed0a05c5a2d40223..07365e18362baeeef432dcae4c7b90c0fa55bd52 100644
|
| --- a/runtime/bin/main.cc
|
| +++ b/runtime/bin/main.cc
|
| @@ -76,11 +76,13 @@ static bool compile_all = false;
|
| // Global flag that is used to indicate that we want to compile all the
|
| // dart functions before running main and not compile anything thereafter.
|
| static bool gen_precompiled_snapshot = false;
|
| +static bool gen_precompiled_jit_snapshot = false;
|
|
|
|
|
| // Global flag that is used to indicate that we want to run from a precompiled
|
| // snapshot.
|
| static bool run_precompiled_snapshot = false;
|
| +static bool run_precompiled_jit_snapshot = false;
|
|
|
|
|
| // Global flag that is used to indicate that we want to use blobs/mmap instead
|
| @@ -366,6 +368,20 @@ static bool ProcessGenPrecompiledSnapshotOption(
|
| }
|
|
|
|
|
| +static bool ProcessGenPrecompiledJITSnapshotOption(
|
| + const char* arg,
|
| + CommandLineOptions* vm_options) {
|
| + ASSERT(arg != NULL);
|
| + if ((arg[0] == '=') || (arg[0] == ':')) {
|
| + precompiled_snapshot_directory = &arg[1];
|
| + } else {
|
| + precompiled_snapshot_directory = arg;
|
| + }
|
| + gen_precompiled_jit_snapshot = true;
|
| + return true;
|
| +}
|
| +
|
| +
|
| static bool ProcessRunPrecompiledSnapshotOption(
|
| const char* arg,
|
| CommandLineOptions* vm_options) {
|
| @@ -381,6 +397,20 @@ static bool ProcessRunPrecompiledSnapshotOption(
|
| }
|
|
|
|
|
| +static bool ProcessRunPrecompiledJITSnapshotOption(
|
| + const char* arg,
|
| + CommandLineOptions* vm_options) {
|
| + ASSERT(arg != NULL);
|
| + precompiled_snapshot_directory = arg;
|
| + if ((precompiled_snapshot_directory[0] == '=') ||
|
| + (precompiled_snapshot_directory[0] == ':')) {
|
| + precompiled_snapshot_directory = &precompiled_snapshot_directory[1];
|
| + }
|
| + run_precompiled_jit_snapshot = true;
|
| + return true;
|
| +}
|
| +
|
| +
|
| static bool ProcessSnapshotOptionHelper(const char* filename,
|
| bool* snapshot_option) {
|
| ASSERT((filename != NULL) && (strlen(filename) != 0));
|
| @@ -535,8 +565,10 @@ static struct {
|
| { "--use_blobs", ProcessUseBlobsOption },
|
| { "--enable-vm-service", ProcessEnableVmServiceOption },
|
| { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption },
|
| + { "--gen-precompiled-jit-snapshot", ProcessGenPrecompiledJITSnapshotOption },
|
| { "--observe", ProcessObserveOption },
|
| { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption },
|
| + { "--run-precompiled-jit-snapshot", ProcessRunPrecompiledJITSnapshotOption },
|
| { "--shutdown", ProcessShutdownOption },
|
| { "--snapshot=", ProcessScriptSnapshotOption },
|
| { "--full-snapshot-after-run=", ProcessFullSnapshotAfterRunOption },
|
| @@ -807,9 +839,11 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
|
|
| if (Dart_IsServiceIsolate(isolate)) {
|
| // If this is the service isolate, load embedder specific bits and return.
|
| + bool skip_library_load = run_precompiled_snapshot ||
|
| + run_precompiled_jit_snapshot;
|
| if (!VmService::Setup(vm_service_server_ip,
|
| vm_service_server_port,
|
| - run_precompiled_snapshot)) {
|
| + skip_library_load)) {
|
| *error = strdup(VmService::GetErrorMessage());
|
| return NULL;
|
| }
|
| @@ -828,7 +862,9 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
| result = DartUtils::PrepareForScriptLoading(false, trace_loading);
|
| CHECK_RESULT(result);
|
|
|
| - if (!run_precompiled_snapshot && !run_full_snapshot) {
|
| + if (!run_precompiled_snapshot &&
|
| + !run_precompiled_jit_snapshot &&
|
| + !run_full_snapshot) {
|
| // Set up the load port provided by the service isolate so that we can
|
| // load scripts.
|
| // With a full snapshot or a precompiled snapshot in product mode, there is
|
| @@ -845,7 +881,12 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
| result = Dart_SetEnvironmentCallback(EnvironmentCallback);
|
| CHECK_RESULT(result);
|
|
|
| - if (!run_precompiled_snapshot && !run_full_snapshot) {
|
| + if (run_precompiled_snapshot) {
|
| + // No setup.
|
| + } else if (run_full_snapshot || run_precompiled_jit_snapshot) {
|
| + result = DartUtils::SetupIOLibrary(script_uri);
|
| + CHECK_RESULT(result);
|
| + } else {
|
| // Load the specified application script into the newly created isolate.
|
| result = DartUtils::LoadScript(script_uri);
|
| CHECK_RESULT(result);
|
| @@ -862,9 +903,6 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
|
|
| result = DartUtils::SetupIOLibrary(script_uri);
|
| CHECK_RESULT(result);
|
| - } else if (run_full_snapshot) {
|
| - result = DartUtils::SetupIOLibrary(script_uri);
|
| - CHECK_RESULT(result);
|
| }
|
|
|
| // Make the isolate runnable so that it is ready to handle messages.
|
| @@ -1248,6 +1286,115 @@ static void ComputeSnapshotFilenames(const char* filename,
|
| }
|
|
|
|
|
| +static void GeneratePrecompiledSnapshot() {
|
| + uint8_t* vm_isolate_buffer = NULL;
|
| + intptr_t vm_isolate_size = 0;
|
| + uint8_t* isolate_buffer = NULL;
|
| + intptr_t isolate_size = 0;
|
| + uint8_t* assembly_buffer = NULL;
|
| + intptr_t assembly_size = 0;
|
| + uint8_t* instructions_blob_buffer = NULL;
|
| + intptr_t instructions_blob_size = 0;
|
| + uint8_t* rodata_blob_buffer = NULL;
|
| + intptr_t rodata_blob_size = 0;
|
| + Dart_Handle result;
|
| + if (use_blobs) {
|
| + result = Dart_CreatePrecompiledSnapshotBlob(
|
| + &vm_isolate_buffer,
|
| + &vm_isolate_size,
|
| + &isolate_buffer,
|
| + &isolate_size,
|
| + &instructions_blob_buffer,
|
| + &instructions_blob_size,
|
| + &rodata_blob_buffer,
|
| + &rodata_blob_size);
|
| + } else {
|
| + result = Dart_CreatePrecompiledSnapshotAssembly(
|
| + &vm_isolate_buffer,
|
| + &vm_isolate_size,
|
| + &isolate_buffer,
|
| + &isolate_size,
|
| + &assembly_buffer,
|
| + &assembly_size);
|
| + }
|
| + if (Dart_IsError(result)) {
|
| + ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
|
| + }
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledVmIsolateName,
|
| + false,
|
| + vm_isolate_buffer,
|
| + vm_isolate_size);
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledIsolateName,
|
| + false,
|
| + isolate_buffer,
|
| + isolate_size);
|
| + if (use_blobs) {
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledInstructionsBlobName,
|
| + false,
|
| + instructions_blob_buffer,
|
| + instructions_blob_size);
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledRodataBlobName,
|
| + false,
|
| + rodata_blob_buffer,
|
| + rodata_blob_size);
|
| + } else {
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledAssemblyName,
|
| + false,
|
| + assembly_buffer,
|
| + assembly_size);
|
| + }
|
| +}
|
| +
|
| +
|
| +static void GeneratePrecompiledJITSnapshot() {
|
| + uint8_t* vm_isolate_buffer = NULL;
|
| + intptr_t vm_isolate_size = 0;
|
| + uint8_t* isolate_buffer = NULL;
|
| + intptr_t isolate_size = 0;
|
| + uint8_t* instructions_blob_buffer = NULL;
|
| + intptr_t instructions_blob_size = 0;
|
| + uint8_t* rodata_blob_buffer = NULL;
|
| + intptr_t rodata_blob_size = 0;
|
| + Dart_Handle result = Dart_CreatePrecompiledJITSnapshotBlob(
|
| + &vm_isolate_buffer,
|
| + &vm_isolate_size,
|
| + &isolate_buffer,
|
| + &isolate_size,
|
| + &instructions_blob_buffer,
|
| + &instructions_blob_size,
|
| + &rodata_blob_buffer,
|
| + &rodata_blob_size);
|
| + if (Dart_IsError(result)) {
|
| + ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
|
| + }
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledVmIsolateName,
|
| + false,
|
| + vm_isolate_buffer,
|
| + vm_isolate_size);
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledIsolateName,
|
| + false,
|
| + isolate_buffer,
|
| + isolate_size);
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledInstructionsBlobName,
|
| + false,
|
| + instructions_blob_buffer,
|
| + instructions_blob_size);
|
| + WriteSnapshotFile(precompiled_snapshot_directory,
|
| + kPrecompiledRodataBlobName,
|
| + false,
|
| + rodata_blob_buffer,
|
| + rodata_blob_size);
|
| +}
|
| +
|
| +
|
| static void GenerateFullSnapshot() {
|
| // Create a full snapshot of the script.
|
| Dart_Handle result;
|
| @@ -1351,7 +1498,7 @@ bool RunMainIsolate(const char* script_name,
|
| result = Dart_LibraryImportLibrary(
|
| isolate_data->builtin_lib(), root_lib, Dart_Null());
|
| #if !defined(PRODUCT)
|
| - if (is_noopt || gen_precompiled_snapshot) {
|
| + if (is_noopt || gen_precompiled_snapshot || gen_precompiled_jit_snapshot) {
|
| // Load the embedder's portion of the VM service's Dart code so it will
|
| // be included in the precompiled snapshot.
|
| if (!VmService::LoadForGenPrecompiled()) {
|
| @@ -1410,65 +1557,7 @@ bool RunMainIsolate(const char* script_name,
|
| }
|
|
|
| if (gen_precompiled_snapshot) {
|
| - uint8_t* vm_isolate_buffer = NULL;
|
| - intptr_t vm_isolate_size = 0;
|
| - uint8_t* isolate_buffer = NULL;
|
| - intptr_t isolate_size = 0;
|
| - uint8_t* assembly_buffer = NULL;
|
| - intptr_t assembly_size = 0;
|
| - uint8_t* instructions_blob_buffer = NULL;
|
| - intptr_t instructions_blob_size = 0;
|
| - uint8_t* rodata_blob_buffer = NULL;
|
| - intptr_t rodata_blob_size = 0;
|
| - if (use_blobs) {
|
| - result = Dart_CreatePrecompiledSnapshotBlob(
|
| - &vm_isolate_buffer,
|
| - &vm_isolate_size,
|
| - &isolate_buffer,
|
| - &isolate_size,
|
| - &instructions_blob_buffer,
|
| - &instructions_blob_size,
|
| - &rodata_blob_buffer,
|
| - &rodata_blob_size);
|
| - CHECK_RESULT(result);
|
| - } else {
|
| - result = Dart_CreatePrecompiledSnapshotAssembly(
|
| - &vm_isolate_buffer,
|
| - &vm_isolate_size,
|
| - &isolate_buffer,
|
| - &isolate_size,
|
| - &assembly_buffer,
|
| - &assembly_size);
|
| - CHECK_RESULT(result);
|
| - }
|
| - WriteSnapshotFile(precompiled_snapshot_directory,
|
| - kPrecompiledVmIsolateName,
|
| - false,
|
| - vm_isolate_buffer,
|
| - vm_isolate_size);
|
| - WriteSnapshotFile(precompiled_snapshot_directory,
|
| - kPrecompiledIsolateName,
|
| - false,
|
| - isolate_buffer,
|
| - isolate_size);
|
| - if (use_blobs) {
|
| - WriteSnapshotFile(precompiled_snapshot_directory,
|
| - kPrecompiledInstructionsBlobName,
|
| - false,
|
| - instructions_blob_buffer,
|
| - instructions_blob_size);
|
| - WriteSnapshotFile(precompiled_snapshot_directory,
|
| - kPrecompiledRodataBlobName,
|
| - false,
|
| - rodata_blob_buffer,
|
| - rodata_blob_size);
|
| - } else {
|
| - WriteSnapshotFile(precompiled_snapshot_directory,
|
| - kPrecompiledAssemblyName,
|
| - false,
|
| - assembly_buffer,
|
| - assembly_size);
|
| - }
|
| + GeneratePrecompiledSnapshot();
|
| } else {
|
| if (Dart_IsNull(root_lib)) {
|
| ErrorExit(kErrorExitCode,
|
| @@ -1500,10 +1589,16 @@ bool RunMainIsolate(const char* script_name,
|
| // Keep handling messages until the last active receive port is closed.
|
| result = Dart_RunLoop();
|
| // Generate a full snapshot after execution if specified.
|
| - if (generate_full_snapshot_after_run) {
|
| + if (generate_full_snapshot_after_run || gen_precompiled_jit_snapshot) {
|
| if (!Dart_IsCompilationError(result) &&
|
| !Dart_IsVMRestartRequest(result)) {
|
| - GenerateFullSnapshot();
|
| + if (generate_full_snapshot_after_run) {
|
| + GenerateFullSnapshot();
|
| + } else {
|
| + Dart_Handle prepare_result = Dart_PrecompileJIT();
|
| + CHECK_RESULT(prepare_result);
|
| + GeneratePrecompiledJITSnapshot();
|
| + }
|
| }
|
| }
|
| CHECK_RESULT(result);
|
| @@ -1665,7 +1760,9 @@ void main(int argc, char** argv) {
|
| // Constant true in PRODUCT mode.
|
| if (generate_script_snapshot ||
|
| generate_full_snapshot_after_run ||
|
| - run_full_snapshot) {
|
| + run_full_snapshot ||
|
| + gen_precompiled_jit_snapshot ||
|
| + run_precompiled_jit_snapshot) {
|
| vm_options.AddArgument("--load_deferred_eagerly");
|
| }
|
| #endif
|
| @@ -1684,7 +1781,7 @@ void main(int argc, char** argv) {
|
|
|
| const uint8_t* instructions_snapshot = NULL;
|
| const uint8_t* data_snapshot = NULL;
|
| - if (run_precompiled_snapshot) {
|
| + if (run_precompiled_snapshot || run_precompiled_jit_snapshot) {
|
| ReadSnapshotFile(precompiled_snapshot_directory,
|
| kPrecompiledVmIsolateName,
|
| &vm_isolate_snapshot_buffer);
|
|
|