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

Side by Side Diff: runtime/bin/main.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 unified diff | Download patch
« no previous file with comments | « no previous file | runtime/include/dart_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <string.h> 6 #include <string.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "include/dart_tools_api.h" 10 #include "include/dart_tools_api.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 69
70 70
71 // Global flag that is used to indicate that we want to compile all the 71 // Global flag that is used to indicate that we want to compile all the
72 // dart functions and not run anything. 72 // dart functions and not run anything.
73 static bool compile_all = false; 73 static bool compile_all = false;
74 74
75 75
76 // Global flag that is used to indicate that we want to compile all the 76 // Global flag that is used to indicate that we want to compile all the
77 // dart functions before running main and not compile anything thereafter. 77 // dart functions before running main and not compile anything thereafter.
78 static bool gen_precompiled_snapshot = false; 78 static bool gen_precompiled_snapshot = false;
79 static bool gen_precompiled_jit_snapshot = false;
79 80
80 81
81 // Global flag that is used to indicate that we want to run from a precompiled 82 // Global flag that is used to indicate that we want to run from a precompiled
82 // snapshot. 83 // snapshot.
83 static bool run_precompiled_snapshot = false; 84 static bool run_precompiled_snapshot = false;
85 static bool run_precompiled_jit_snapshot = false;
84 86
85 87
86 // Global flag that is used to indicate that we want to use blobs/mmap instead 88 // Global flag that is used to indicate that we want to use blobs/mmap instead
87 // of assembly/shared libraries for precompilation. 89 // of assembly/shared libraries for precompilation.
88 static bool use_blobs = false; 90 static bool use_blobs = false;
89 91
90 92
91 // Value of the --gen/run_precompiled_snapshot flag. 93 // Value of the --gen/run_precompiled_snapshot flag.
92 // (This pointer points into an argv buffer and does not need to be 94 // (This pointer points into an argv buffer and does not need to be
93 // free'd.) 95 // free'd.)
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 } else { 361 } else {
360 precompiled_snapshot_directory = arg; 362 precompiled_snapshot_directory = arg;
361 } 363 }
362 gen_precompiled_snapshot = true; 364 gen_precompiled_snapshot = true;
363 vm_options->AddArgument("--precompilation"); 365 vm_options->AddArgument("--precompilation");
364 return true; 366 return true;
365 #endif // defined(DART_PRECOMPILER) 367 #endif // defined(DART_PRECOMPILER)
366 } 368 }
367 369
368 370
371 static bool ProcessGenPrecompiledJITSnapshotOption(
372 const char* arg,
373 CommandLineOptions* vm_options) {
374 ASSERT(arg != NULL);
375 if ((arg[0] == '=') || (arg[0] == ':')) {
376 precompiled_snapshot_directory = &arg[1];
377 } else {
378 precompiled_snapshot_directory = arg;
379 }
380 gen_precompiled_jit_snapshot = true;
381 return true;
382 }
383
384
369 static bool ProcessRunPrecompiledSnapshotOption( 385 static bool ProcessRunPrecompiledSnapshotOption(
370 const char* arg, 386 const char* arg,
371 CommandLineOptions* vm_options) { 387 CommandLineOptions* vm_options) {
372 ASSERT(arg != NULL); 388 ASSERT(arg != NULL);
373 precompiled_snapshot_directory = arg; 389 precompiled_snapshot_directory = arg;
374 if ((precompiled_snapshot_directory[0] == '=') || 390 if ((precompiled_snapshot_directory[0] == '=') ||
375 (precompiled_snapshot_directory[0] == ':')) { 391 (precompiled_snapshot_directory[0] == ':')) {
376 precompiled_snapshot_directory = &precompiled_snapshot_directory[1]; 392 precompiled_snapshot_directory = &precompiled_snapshot_directory[1];
377 } 393 }
378 run_precompiled_snapshot = true; 394 run_precompiled_snapshot = true;
379 vm_options->AddArgument("--precompilation"); 395 vm_options->AddArgument("--precompilation");
380 return true; 396 return true;
381 } 397 }
382 398
383 399
400 static bool ProcessRunPrecompiledJITSnapshotOption(
401 const char* arg,
402 CommandLineOptions* vm_options) {
403 ASSERT(arg != NULL);
404 precompiled_snapshot_directory = arg;
405 if ((precompiled_snapshot_directory[0] == '=') ||
406 (precompiled_snapshot_directory[0] == ':')) {
407 precompiled_snapshot_directory = &precompiled_snapshot_directory[1];
408 }
409 run_precompiled_jit_snapshot = true;
410 return true;
411 }
412
413
384 static bool ProcessSnapshotOptionHelper(const char* filename, 414 static bool ProcessSnapshotOptionHelper(const char* filename,
385 bool* snapshot_option) { 415 bool* snapshot_option) {
386 ASSERT((filename != NULL) && (strlen(filename) != 0)); 416 ASSERT((filename != NULL) && (strlen(filename) != 0));
387 snapshot_filename = filename; 417 snapshot_filename = filename;
388 *snapshot_option = true; 418 *snapshot_option = true;
389 if (generate_script_snapshot && generate_full_snapshot_after_run) { 419 if (generate_script_snapshot && generate_full_snapshot_after_run) {
390 Log::PrintErr("--snapshot and --snapshot-after-run options" 420 Log::PrintErr("--snapshot and --snapshot-after-run options"
391 " cannot be specified at the same time\n"); 421 " cannot be specified at the same time\n");
392 *snapshot_option = false; 422 *snapshot_option = false;
393 return false; 423 return false;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 { "--package-root=", ProcessPackageRootOption }, 558 { "--package-root=", ProcessPackageRootOption },
529 { "-v", ProcessVerboseOption }, 559 { "-v", ProcessVerboseOption },
530 { "--verbose", ProcessVerboseOption }, 560 { "--verbose", ProcessVerboseOption },
531 { "--version", ProcessVersionOption }, 561 { "--version", ProcessVersionOption },
532 562
533 // VM specific options to the standalone dart program. 563 // VM specific options to the standalone dart program.
534 { "--compile_all", ProcessCompileAllOption }, 564 { "--compile_all", ProcessCompileAllOption },
535 { "--use_blobs", ProcessUseBlobsOption }, 565 { "--use_blobs", ProcessUseBlobsOption },
536 { "--enable-vm-service", ProcessEnableVmServiceOption }, 566 { "--enable-vm-service", ProcessEnableVmServiceOption },
537 { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption }, 567 { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption },
568 { "--gen-precompiled-jit-snapshot", ProcessGenPrecompiledJITSnapshotOption },
538 { "--observe", ProcessObserveOption }, 569 { "--observe", ProcessObserveOption },
539 { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption }, 570 { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption },
571 { "--run-precompiled-jit-snapshot", ProcessRunPrecompiledJITSnapshotOption },
540 { "--shutdown", ProcessShutdownOption }, 572 { "--shutdown", ProcessShutdownOption },
541 { "--snapshot=", ProcessScriptSnapshotOption }, 573 { "--snapshot=", ProcessScriptSnapshotOption },
542 { "--full-snapshot-after-run=", ProcessFullSnapshotAfterRunOption }, 574 { "--full-snapshot-after-run=", ProcessFullSnapshotAfterRunOption },
543 { "--run-full-snapshot=", ProcessRunFullSnapshotOption }, 575 { "--run-full-snapshot=", ProcessRunFullSnapshotOption },
544 { "--trace-loading", ProcessTraceLoadingOption }, 576 { "--trace-loading", ProcessTraceLoadingOption },
545 { NULL, NULL } 577 { NULL, NULL }
546 }; 578 };
547 579
548 580
549 static bool ProcessMainOptions(const char* option, 581 static bool ProcessMainOptions(const char* option,
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); 832 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
801 Builtin::SetNativeResolver(Builtin::kIOLibrary); 833 Builtin::SetNativeResolver(Builtin::kIOLibrary);
802 } 834 }
803 835
804 // Set up the library tag handler for this isolate. 836 // Set up the library tag handler for this isolate.
805 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler); 837 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
806 CHECK_RESULT(result); 838 CHECK_RESULT(result);
807 839
808 if (Dart_IsServiceIsolate(isolate)) { 840 if (Dart_IsServiceIsolate(isolate)) {
809 // If this is the service isolate, load embedder specific bits and return. 841 // If this is the service isolate, load embedder specific bits and return.
842 bool skip_library_load = run_precompiled_snapshot ||
843 run_precompiled_jit_snapshot;
810 if (!VmService::Setup(vm_service_server_ip, 844 if (!VmService::Setup(vm_service_server_ip,
811 vm_service_server_port, 845 vm_service_server_port,
812 run_precompiled_snapshot)) { 846 skip_library_load)) {
813 *error = strdup(VmService::GetErrorMessage()); 847 *error = strdup(VmService::GetErrorMessage());
814 return NULL; 848 return NULL;
815 } 849 }
816 if (compile_all) { 850 if (compile_all) {
817 result = Dart_CompileAll(); 851 result = Dart_CompileAll();
818 CHECK_RESULT(result); 852 CHECK_RESULT(result);
819 } 853 }
820 Dart_ExitScope(); 854 Dart_ExitScope();
821 Dart_ExitIsolate(); 855 Dart_ExitIsolate();
822 return isolate; 856 return isolate;
823 } 857 }
824 858
825 // Prepare builtin and other core libraries for use to resolve URIs. 859 // Prepare builtin and other core libraries for use to resolve URIs.
826 // Set up various closures, e.g: printing, timers etc. 860 // Set up various closures, e.g: printing, timers etc.
827 // Set up 'package root' for URI resolution. 861 // Set up 'package root' for URI resolution.
828 result = DartUtils::PrepareForScriptLoading(false, trace_loading); 862 result = DartUtils::PrepareForScriptLoading(false, trace_loading);
829 CHECK_RESULT(result); 863 CHECK_RESULT(result);
830 864
831 if (!run_precompiled_snapshot && !run_full_snapshot) { 865 if (!run_precompiled_snapshot &&
866 !run_precompiled_jit_snapshot &&
867 !run_full_snapshot) {
832 // Set up the load port provided by the service isolate so that we can 868 // Set up the load port provided by the service isolate so that we can
833 // load scripts. 869 // load scripts.
834 // With a full snapshot or a precompiled snapshot in product mode, there is 870 // With a full snapshot or a precompiled snapshot in product mode, there is
835 // no service isolate. A precompiled snapshot in release or debug mode does 871 // no service isolate. A precompiled snapshot in release or debug mode does
836 // have the service isolate, but it doesn't use it for loading. 872 // have the service isolate, but it doesn't use it for loading.
837 result = DartUtils::SetupServiceLoadPort(); 873 result = DartUtils::SetupServiceLoadPort();
838 CHECK_RESULT(result); 874 CHECK_RESULT(result);
839 } 875 }
840 876
841 // Setup package root if specified. 877 // Setup package root if specified.
842 result = DartUtils::SetupPackageRoot(package_root, packages_config); 878 result = DartUtils::SetupPackageRoot(package_root, packages_config);
843 CHECK_RESULT(result); 879 CHECK_RESULT(result);
844 880
845 result = Dart_SetEnvironmentCallback(EnvironmentCallback); 881 result = Dart_SetEnvironmentCallback(EnvironmentCallback);
846 CHECK_RESULT(result); 882 CHECK_RESULT(result);
847 883
848 if (!run_precompiled_snapshot && !run_full_snapshot) { 884 if (run_precompiled_snapshot) {
885 // No setup.
886 } else if (run_full_snapshot || run_precompiled_jit_snapshot) {
887 result = DartUtils::SetupIOLibrary(script_uri);
888 CHECK_RESULT(result);
889 } else {
849 // Load the specified application script into the newly created isolate. 890 // Load the specified application script into the newly created isolate.
850 result = DartUtils::LoadScript(script_uri); 891 result = DartUtils::LoadScript(script_uri);
851 CHECK_RESULT(result); 892 CHECK_RESULT(result);
852 893
853 // Run event-loop and wait for script loading to complete. 894 // Run event-loop and wait for script loading to complete.
854 result = Dart_RunLoop(); 895 result = Dart_RunLoop();
855 CHECK_RESULT(result); 896 CHECK_RESULT(result);
856 897
857 Dart_TimelineEvent("LoadScript", 898 Dart_TimelineEvent("LoadScript",
858 Dart_TimelineGetMicros(), 899 Dart_TimelineGetMicros(),
859 Dart_GetMainPortId(), 900 Dart_GetMainPortId(),
860 Dart_Timeline_Event_Async_End, 901 Dart_Timeline_Event_Async_End,
861 0, NULL, NULL); 902 0, NULL, NULL);
862 903
863 result = DartUtils::SetupIOLibrary(script_uri); 904 result = DartUtils::SetupIOLibrary(script_uri);
864 CHECK_RESULT(result); 905 CHECK_RESULT(result);
865 } else if (run_full_snapshot) {
866 result = DartUtils::SetupIOLibrary(script_uri);
867 CHECK_RESULT(result);
868 } 906 }
869 907
870 // Make the isolate runnable so that it is ready to handle messages. 908 // Make the isolate runnable so that it is ready to handle messages.
871 Dart_ExitScope(); 909 Dart_ExitScope();
872 Dart_ExitIsolate(); 910 Dart_ExitIsolate();
873 bool retval = Dart_IsolateMakeRunnable(isolate); 911 bool retval = Dart_IsolateMakeRunnable(isolate);
874 if (!retval) { 912 if (!retval) {
875 *error = strdup("Invalid isolate state - Unable to make it runnable"); 913 *error = strdup("Invalid isolate state - Unable to make it runnable");
876 Dart_EnterIsolate(isolate); 914 Dart_EnterIsolate(isolate);
877 Dart_ShutdownIsolate(); 915 Dart_ShutdownIsolate();
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 intptr_t len = snprintf(NULL, 0, "%s.%s", filename, kVMIsolateSuffix); 1279 intptr_t len = snprintf(NULL, 0, "%s.%s", filename, kVMIsolateSuffix);
1242 *vm_snapshot_fname = new char[len + 1]; 1280 *vm_snapshot_fname = new char[len + 1];
1243 snprintf(*vm_snapshot_fname, len + 1, "%s.%s", filename, kVMIsolateSuffix); 1281 snprintf(*vm_snapshot_fname, len + 1, "%s.%s", filename, kVMIsolateSuffix);
1244 1282
1245 len = snprintf(NULL, 0, "%s.%s", filename, kIsolateSuffix); 1283 len = snprintf(NULL, 0, "%s.%s", filename, kIsolateSuffix);
1246 *isolate_snapshot_fname = new char[len + 1]; 1284 *isolate_snapshot_fname = new char[len + 1];
1247 snprintf(*isolate_snapshot_fname, len + 1, "%s.%s", filename, kIsolateSuffix); 1285 snprintf(*isolate_snapshot_fname, len + 1, "%s.%s", filename, kIsolateSuffix);
1248 } 1286 }
1249 1287
1250 1288
1289 static void GeneratePrecompiledSnapshot() {
1290 uint8_t* vm_isolate_buffer = NULL;
1291 intptr_t vm_isolate_size = 0;
1292 uint8_t* isolate_buffer = NULL;
1293 intptr_t isolate_size = 0;
1294 uint8_t* assembly_buffer = NULL;
1295 intptr_t assembly_size = 0;
1296 uint8_t* instructions_blob_buffer = NULL;
1297 intptr_t instructions_blob_size = 0;
1298 uint8_t* rodata_blob_buffer = NULL;
1299 intptr_t rodata_blob_size = 0;
1300 Dart_Handle result;
1301 if (use_blobs) {
1302 result = Dart_CreatePrecompiledSnapshotBlob(
1303 &vm_isolate_buffer,
1304 &vm_isolate_size,
1305 &isolate_buffer,
1306 &isolate_size,
1307 &instructions_blob_buffer,
1308 &instructions_blob_size,
1309 &rodata_blob_buffer,
1310 &rodata_blob_size);
1311 } else {
1312 result = Dart_CreatePrecompiledSnapshotAssembly(
1313 &vm_isolate_buffer,
1314 &vm_isolate_size,
1315 &isolate_buffer,
1316 &isolate_size,
1317 &assembly_buffer,
1318 &assembly_size);
1319 }
1320 if (Dart_IsError(result)) {
1321 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1322 }
1323 WriteSnapshotFile(precompiled_snapshot_directory,
1324 kPrecompiledVmIsolateName,
1325 false,
1326 vm_isolate_buffer,
1327 vm_isolate_size);
1328 WriteSnapshotFile(precompiled_snapshot_directory,
1329 kPrecompiledIsolateName,
1330 false,
1331 isolate_buffer,
1332 isolate_size);
1333 if (use_blobs) {
1334 WriteSnapshotFile(precompiled_snapshot_directory,
1335 kPrecompiledInstructionsBlobName,
1336 false,
1337 instructions_blob_buffer,
1338 instructions_blob_size);
1339 WriteSnapshotFile(precompiled_snapshot_directory,
1340 kPrecompiledRodataBlobName,
1341 false,
1342 rodata_blob_buffer,
1343 rodata_blob_size);
1344 } else {
1345 WriteSnapshotFile(precompiled_snapshot_directory,
1346 kPrecompiledAssemblyName,
1347 false,
1348 assembly_buffer,
1349 assembly_size);
1350 }
1351 }
1352
1353
1354 static void GeneratePrecompiledJITSnapshot() {
1355 uint8_t* vm_isolate_buffer = NULL;
1356 intptr_t vm_isolate_size = 0;
1357 uint8_t* isolate_buffer = NULL;
1358 intptr_t isolate_size = 0;
1359 uint8_t* instructions_blob_buffer = NULL;
1360 intptr_t instructions_blob_size = 0;
1361 uint8_t* rodata_blob_buffer = NULL;
1362 intptr_t rodata_blob_size = 0;
1363 Dart_Handle result = Dart_CreatePrecompiledJITSnapshotBlob(
1364 &vm_isolate_buffer,
1365 &vm_isolate_size,
1366 &isolate_buffer,
1367 &isolate_size,
1368 &instructions_blob_buffer,
1369 &instructions_blob_size,
1370 &rodata_blob_buffer,
1371 &rodata_blob_size);
1372 if (Dart_IsError(result)) {
1373 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1374 }
1375 WriteSnapshotFile(precompiled_snapshot_directory,
1376 kPrecompiledVmIsolateName,
1377 false,
1378 vm_isolate_buffer,
1379 vm_isolate_size);
1380 WriteSnapshotFile(precompiled_snapshot_directory,
1381 kPrecompiledIsolateName,
1382 false,
1383 isolate_buffer,
1384 isolate_size);
1385 WriteSnapshotFile(precompiled_snapshot_directory,
1386 kPrecompiledInstructionsBlobName,
1387 false,
1388 instructions_blob_buffer,
1389 instructions_blob_size);
1390 WriteSnapshotFile(precompiled_snapshot_directory,
1391 kPrecompiledRodataBlobName,
1392 false,
1393 rodata_blob_buffer,
1394 rodata_blob_size);
1395 }
1396
1397
1251 static void GenerateFullSnapshot() { 1398 static void GenerateFullSnapshot() {
1252 // Create a full snapshot of the script. 1399 // Create a full snapshot of the script.
1253 Dart_Handle result; 1400 Dart_Handle result;
1254 uint8_t* vm_isolate_buffer = NULL; 1401 uint8_t* vm_isolate_buffer = NULL;
1255 intptr_t vm_isolate_size = 0; 1402 intptr_t vm_isolate_size = 0;
1256 uint8_t* isolate_buffer = NULL; 1403 uint8_t* isolate_buffer = NULL;
1257 intptr_t isolate_size = 0; 1404 intptr_t isolate_size = 0;
1258 char* vm_snapshot_fname = NULL; 1405 char* vm_snapshot_fname = NULL;
1259 char* isolate_snapshot_fname = NULL; 1406 char* isolate_snapshot_fname = NULL;
1260 1407
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 } else { 1491 } else {
1345 // Lookup the library of the root script. 1492 // Lookup the library of the root script.
1346 Dart_Handle root_lib = Dart_RootLibrary(); 1493 Dart_Handle root_lib = Dart_RootLibrary();
1347 // Import the root library into the builtin library so that we can easily 1494 // Import the root library into the builtin library so that we can easily
1348 // lookup the main entry point exported from the root library. 1495 // lookup the main entry point exported from the root library.
1349 IsolateData* isolate_data = 1496 IsolateData* isolate_data =
1350 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate)); 1497 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
1351 result = Dart_LibraryImportLibrary( 1498 result = Dart_LibraryImportLibrary(
1352 isolate_data->builtin_lib(), root_lib, Dart_Null()); 1499 isolate_data->builtin_lib(), root_lib, Dart_Null());
1353 #if !defined(PRODUCT) 1500 #if !defined(PRODUCT)
1354 if (is_noopt || gen_precompiled_snapshot) { 1501 if (is_noopt || gen_precompiled_snapshot || gen_precompiled_jit_snapshot) {
1355 // Load the embedder's portion of the VM service's Dart code so it will 1502 // Load the embedder's portion of the VM service's Dart code so it will
1356 // be included in the precompiled snapshot. 1503 // be included in the precompiled snapshot.
1357 if (!VmService::LoadForGenPrecompiled()) { 1504 if (!VmService::LoadForGenPrecompiled()) {
1358 fprintf(stderr, 1505 fprintf(stderr,
1359 "VM service loading failed: %s\n", 1506 "VM service loading failed: %s\n",
1360 VmService::GetErrorMessage()); 1507 VmService::GetErrorMessage());
1361 fflush(stderr); 1508 fflush(stderr);
1362 exit(kErrorExitCode); 1509 exit(kErrorExitCode);
1363 } 1510 }
1364 } 1511 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 #endif // !PRODUCT 1550 #endif // !PRODUCT
1404 { NULL, NULL, NULL } // Must be terminated with NULL entries. 1551 { NULL, NULL, NULL } // Must be terminated with NULL entries.
1405 }; 1552 };
1406 1553
1407 const bool reset_fields = gen_precompiled_snapshot; 1554 const bool reset_fields = gen_precompiled_snapshot;
1408 result = Dart_Precompile(standalone_entry_points, reset_fields); 1555 result = Dart_Precompile(standalone_entry_points, reset_fields);
1409 CHECK_RESULT(result); 1556 CHECK_RESULT(result);
1410 } 1557 }
1411 1558
1412 if (gen_precompiled_snapshot) { 1559 if (gen_precompiled_snapshot) {
1413 uint8_t* vm_isolate_buffer = NULL; 1560 GeneratePrecompiledSnapshot();
1414 intptr_t vm_isolate_size = 0;
1415 uint8_t* isolate_buffer = NULL;
1416 intptr_t isolate_size = 0;
1417 uint8_t* assembly_buffer = NULL;
1418 intptr_t assembly_size = 0;
1419 uint8_t* instructions_blob_buffer = NULL;
1420 intptr_t instructions_blob_size = 0;
1421 uint8_t* rodata_blob_buffer = NULL;
1422 intptr_t rodata_blob_size = 0;
1423 if (use_blobs) {
1424 result = Dart_CreatePrecompiledSnapshotBlob(
1425 &vm_isolate_buffer,
1426 &vm_isolate_size,
1427 &isolate_buffer,
1428 &isolate_size,
1429 &instructions_blob_buffer,
1430 &instructions_blob_size,
1431 &rodata_blob_buffer,
1432 &rodata_blob_size);
1433 CHECK_RESULT(result);
1434 } else {
1435 result = Dart_CreatePrecompiledSnapshotAssembly(
1436 &vm_isolate_buffer,
1437 &vm_isolate_size,
1438 &isolate_buffer,
1439 &isolate_size,
1440 &assembly_buffer,
1441 &assembly_size);
1442 CHECK_RESULT(result);
1443 }
1444 WriteSnapshotFile(precompiled_snapshot_directory,
1445 kPrecompiledVmIsolateName,
1446 false,
1447 vm_isolate_buffer,
1448 vm_isolate_size);
1449 WriteSnapshotFile(precompiled_snapshot_directory,
1450 kPrecompiledIsolateName,
1451 false,
1452 isolate_buffer,
1453 isolate_size);
1454 if (use_blobs) {
1455 WriteSnapshotFile(precompiled_snapshot_directory,
1456 kPrecompiledInstructionsBlobName,
1457 false,
1458 instructions_blob_buffer,
1459 instructions_blob_size);
1460 WriteSnapshotFile(precompiled_snapshot_directory,
1461 kPrecompiledRodataBlobName,
1462 false,
1463 rodata_blob_buffer,
1464 rodata_blob_size);
1465 } else {
1466 WriteSnapshotFile(precompiled_snapshot_directory,
1467 kPrecompiledAssemblyName,
1468 false,
1469 assembly_buffer,
1470 assembly_size);
1471 }
1472 } else { 1561 } else {
1473 if (Dart_IsNull(root_lib)) { 1562 if (Dart_IsNull(root_lib)) {
1474 ErrorExit(kErrorExitCode, 1563 ErrorExit(kErrorExitCode,
1475 "Unable to find root library for '%s'\n", 1564 "Unable to find root library for '%s'\n",
1476 script_name); 1565 script_name);
1477 } 1566 }
1478 1567
1479 // The helper function _getMainClosure creates a closure for the main 1568 // The helper function _getMainClosure creates a closure for the main
1480 // entry point which is either explicitly or implictly exported from the 1569 // entry point which is either explicitly or implictly exported from the
1481 // root library. 1570 // root library.
(...skipping 11 matching lines...) Expand all
1493 Dart_Handle isolate_lib = 1582 Dart_Handle isolate_lib =
1494 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate")); 1583 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate"));
1495 result = Dart_Invoke(isolate_lib, 1584 result = Dart_Invoke(isolate_lib,
1496 Dart_NewStringFromCString("_startMainIsolate"), 1585 Dart_NewStringFromCString("_startMainIsolate"),
1497 kNumIsolateArgs, isolate_args); 1586 kNumIsolateArgs, isolate_args);
1498 CHECK_RESULT(result); 1587 CHECK_RESULT(result);
1499 1588
1500 // Keep handling messages until the last active receive port is closed. 1589 // Keep handling messages until the last active receive port is closed.
1501 result = Dart_RunLoop(); 1590 result = Dart_RunLoop();
1502 // Generate a full snapshot after execution if specified. 1591 // Generate a full snapshot after execution if specified.
1503 if (generate_full_snapshot_after_run) { 1592 if (generate_full_snapshot_after_run || gen_precompiled_jit_snapshot) {
1504 if (!Dart_IsCompilationError(result) && 1593 if (!Dart_IsCompilationError(result) &&
1505 !Dart_IsVMRestartRequest(result)) { 1594 !Dart_IsVMRestartRequest(result)) {
1506 GenerateFullSnapshot(); 1595 if (generate_full_snapshot_after_run) {
1596 GenerateFullSnapshot();
1597 } else {
1598 Dart_Handle prepare_result = Dart_PrecompileJIT();
1599 CHECK_RESULT(prepare_result);
1600 GeneratePrecompiledJITSnapshot();
1601 }
1507 } 1602 }
1508 } 1603 }
1509 CHECK_RESULT(result); 1604 CHECK_RESULT(result);
1510 } 1605 }
1511 } 1606 }
1512 1607
1513 Dart_ExitScope(); 1608 Dart_ExitScope();
1514 // Shutdown the isolate. 1609 // Shutdown the isolate.
1515 Dart_ShutdownIsolate(); 1610 Dart_ShutdownIsolate();
1516 1611
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 OSError err; 1753 OSError err;
1659 fprintf(stderr, "Error determining current directory: %s\n", err.message()); 1754 fprintf(stderr, "Error determining current directory: %s\n", err.message());
1660 fflush(stderr); 1755 fflush(stderr);
1661 Platform::Exit(kErrorExitCode); 1756 Platform::Exit(kErrorExitCode);
1662 } 1757 }
1663 1758
1664 #if !defined(PRODUCT) 1759 #if !defined(PRODUCT)
1665 // Constant true in PRODUCT mode. 1760 // Constant true in PRODUCT mode.
1666 if (generate_script_snapshot || 1761 if (generate_script_snapshot ||
1667 generate_full_snapshot_after_run || 1762 generate_full_snapshot_after_run ||
1668 run_full_snapshot) { 1763 run_full_snapshot ||
1764 gen_precompiled_jit_snapshot ||
1765 run_precompiled_jit_snapshot) {
1669 vm_options.AddArgument("--load_deferred_eagerly"); 1766 vm_options.AddArgument("--load_deferred_eagerly");
1670 } 1767 }
1671 #endif 1768 #endif
1672 1769
1673 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) 1770 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT)
1674 // Always set --precompilation with dart_noopt. 1771 // Always set --precompilation with dart_noopt.
1675 ASSERT(!gen_precompiled_snapshot && !run_precompiled_snapshot); 1772 ASSERT(!gen_precompiled_snapshot && !run_precompiled_snapshot);
1676 vm_options.AddArgument("--precompilation"); 1773 vm_options.AddArgument("--precompilation");
1677 #endif 1774 #endif
1678 1775
1679 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); 1776 Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
1680 1777
1681 // Start event handler. 1778 // Start event handler.
1682 TimerUtils::InitOnce(); 1779 TimerUtils::InitOnce();
1683 EventHandler::Start(); 1780 EventHandler::Start();
1684 1781
1685 const uint8_t* instructions_snapshot = NULL; 1782 const uint8_t* instructions_snapshot = NULL;
1686 const uint8_t* data_snapshot = NULL; 1783 const uint8_t* data_snapshot = NULL;
1687 if (run_precompiled_snapshot) { 1784 if (run_precompiled_snapshot || run_precompiled_jit_snapshot) {
1688 ReadSnapshotFile(precompiled_snapshot_directory, 1785 ReadSnapshotFile(precompiled_snapshot_directory,
1689 kPrecompiledVmIsolateName, 1786 kPrecompiledVmIsolateName,
1690 &vm_isolate_snapshot_buffer); 1787 &vm_isolate_snapshot_buffer);
1691 ReadSnapshotFile(precompiled_snapshot_directory, 1788 ReadSnapshotFile(precompiled_snapshot_directory,
1692 kPrecompiledIsolateName, 1789 kPrecompiledIsolateName,
1693 &isolate_snapshot_buffer); 1790 &isolate_snapshot_buffer);
1694 if (use_blobs) { 1791 if (use_blobs) {
1695 ReadExecutableSnapshotFile(precompiled_snapshot_directory, 1792 ReadExecutableSnapshotFile(precompiled_snapshot_directory,
1696 kPrecompiledInstructionsBlobName, 1793 kPrecompiledInstructionsBlobName,
1697 &instructions_snapshot); 1794 &instructions_snapshot);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 Platform::Exit(Process::GlobalExitCode()); 1884 Platform::Exit(Process::GlobalExitCode());
1788 } 1885 }
1789 1886
1790 } // namespace bin 1887 } // namespace bin
1791 } // namespace dart 1888 } // namespace dart
1792 1889
1793 int main(int argc, char** argv) { 1890 int main(int argc, char** argv) {
1794 dart::bin::main(argc, argv); 1891 dart::bin::main(argc, argv);
1795 UNREACHABLE(); 1892 UNREACHABLE();
1796 } 1893 }
OLDNEW
« no previous file with comments | « no previous file | runtime/include/dart_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698