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

Side by Side Diff: runtime/bin/main.cc

Issue 2622053002: Refactor snapshots pieces to include a section for loading instructions into the heap of a regular … (Closed)
Patch Set: Restore --print-snapshot-sizes Created 3 years, 11 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
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 16 matching lines...) Expand all
27 #include "platform/globals.h" 27 #include "platform/globals.h"
28 #include "platform/hashmap.h" 28 #include "platform/hashmap.h"
29 #include "platform/text_buffer.h" 29 #include "platform/text_buffer.h"
30 #if !defined(DART_PRECOMPILER) 30 #if !defined(DART_PRECOMPILER)
31 #include "zlib/zlib.h" 31 #include "zlib/zlib.h"
32 #endif 32 #endif
33 33
34 namespace dart { 34 namespace dart {
35 namespace bin { 35 namespace bin {
36 36
37 // vm_isolate_snapshot_buffer points to a snapshot for the vm isolate if we 37 // Snapshot pieces if we link in a snapshot, otherwise initialized to NULL.
38 // link in a snapshot otherwise it is initialized to NULL. 38 extern const uint8_t* vm_snapshot_data;
39 extern const uint8_t* vm_isolate_snapshot_buffer; 39 extern const uint8_t* vm_snapshot_instructions;
40 40 extern const uint8_t* core_isolate_snapshot_data;
41 // isolate_snapshot_buffer points to a snapshot for an isolate if we link in a 41 extern const uint8_t* core_isolate_snapshot_instructions;
42 // snapshot otherwise it is initialized to NULL.
43 extern const uint8_t* core_isolate_snapshot_buffer;
44
45 42
46 /** 43 /**
47 * Global state used to control and store generation of application snapshots 44 * Global state used to control and store generation of application snapshots
48 * An application snapshot can be generated and run using the following 45 * An application snapshot can be generated and run using the following
49 * command 46 * command
50 * dart --snapshot-kind=app-jit --snapshot=<app_snapshot_filename> 47 * dart --snapshot-kind=app-jit --snapshot=<app_snapshot_filename>
51 * <script_uri> [<script_options>] 48 * <script_uri> [<script_options>]
52 * To Run the application snapshot generated above, use : 49 * To Run the application snapshot generated above, use :
53 * dart <app_snapshot_filename> [<script_options>] 50 * dart <app_snapshot_filename> [<script_options>]
54 */ 51 */
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 // dart functions and not run anything. 88 // dart functions and not run anything.
92 static bool compile_all = false; 89 static bool compile_all = false;
93 static bool parse_all = false; 90 static bool parse_all = false;
94 91
95 92
96 // Global flag that is used to indicate that we want to use blobs/mmap instead 93 // Global flag that is used to indicate that we want to use blobs/mmap instead
97 // of assembly/shared libraries for precompilation. 94 // of assembly/shared libraries for precompilation.
98 static bool use_blobs = false; 95 static bool use_blobs = false;
99 96
100 97
101 extern const char* kPrecompiledVMIsolateSymbolName; 98 extern const char* kVmSnapshotDataSymbolName;
102 extern const char* kPrecompiledIsolateSymbolName; 99 extern const char* kVmSnapshotInstructionsSymbolName;
103 extern const char* kPrecompiledInstructionsSymbolName; 100 extern const char* kIsolateSnapshotDataSymbolName;
104 extern const char* kPrecompiledDataSymbolName; 101 extern const char* kIsolateSnapshotInstructionsSymbolName;
105 102
106 103
107 // Global flag that is used to indicate that we want to trace resolution of 104 // Global flag that is used to indicate that we want to trace resolution of
108 // URIs and the loading of libraries, parts and scripts. 105 // URIs and the loading of libraries, parts and scripts.
109 static bool trace_loading = false; 106 static bool trace_loading = false;
110 107
111 108
112 static char* app_script_uri = NULL; 109 static char* app_script_uri = NULL;
113 static const uint8_t* app_isolate_snapshot_buffer = NULL; 110 static const uint8_t* app_isolate_snapshot_data = NULL;
111 static const uint8_t* app_isolate_snapshot_instructions = NULL;
114 112
115 113
116 static Dart_Isolate main_isolate = NULL; 114 static Dart_Isolate main_isolate = NULL;
117 115
118 116
119 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost"; 117 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost";
120 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; 118 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
121 // VM Service options. 119 // VM Service options.
122 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; 120 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
123 // The 0 port is a magic value which results in the first available port 121 // The 0 port is a magic value which results in the first available port
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 } else { 826 } else {
829 if (packages_config == NULL) { 827 if (packages_config == NULL) {
830 packages_config = commandline_packages_file; 828 packages_config = commandline_packages_file;
831 } 829 }
832 } 830 }
833 } 831 }
834 832
835 #if defined(DART_PRECOMPILED_RUNTIME) 833 #if defined(DART_PRECOMPILED_RUNTIME)
836 // AOT: All isolates start from the app snapshot. 834 // AOT: All isolates start from the app snapshot.
837 bool isolate_run_app_snapshot = true; 835 bool isolate_run_app_snapshot = true;
838 const uint8_t* isolate_snapshot_buffer = app_isolate_snapshot_buffer; 836 const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data;
837 const uint8_t* isolate_snapshot_instructions =
838 app_isolate_snapshot_instructions;
839 #else 839 #else
840 // JIT: Main isolate starts from the app snapshot, if any. Other use the 840 // JIT: Main isolate starts from the app snapshot, if any. Other isolates
841 // core libraries snapshot. 841 // use the core libraries snapshot.
842 bool isolate_run_app_snapshot = false; 842 bool isolate_run_app_snapshot = false;
843 const uint8_t* isolate_snapshot_buffer = core_isolate_snapshot_buffer; 843 const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
844 if ((app_isolate_snapshot_buffer != NULL) && 844 const uint8_t* isolate_snapshot_instructions =
845 core_isolate_snapshot_instructions;
846 if ((app_isolate_snapshot_data != NULL) &&
845 (is_main_isolate || ((app_script_uri != NULL) && 847 (is_main_isolate || ((app_script_uri != NULL) &&
846 (strcmp(script_uri, app_script_uri) == 0)))) { 848 (strcmp(script_uri, app_script_uri) == 0)))) {
847 isolate_run_app_snapshot = true; 849 isolate_run_app_snapshot = true;
848 isolate_snapshot_buffer = app_isolate_snapshot_buffer; 850 isolate_snapshot_data = app_isolate_snapshot_data;
851 isolate_snapshot_instructions = app_isolate_snapshot_instructions;
849 } 852 }
850 #endif 853 #endif
851 854
852 // If the script is a Kernel binary, then we will try to bootstrap from the 855 // If the script is a Kernel binary, then we will try to bootstrap from the
853 // script. 856 // script.
854 const uint8_t* kernel_file = NULL; 857 const uint8_t* kernel_file = NULL;
855 intptr_t kernel_length = -1; 858 intptr_t kernel_length = -1;
856 const bool is_kernel = 859 const bool is_kernel =
857 !isolate_run_app_snapshot && 860 !isolate_run_app_snapshot &&
858 TryReadKernel(script_uri, &kernel_file, &kernel_length); 861 TryReadKernel(script_uri, &kernel_file, &kernel_length);
859 862
860 void* kernel_program = NULL; 863 void* kernel_program = NULL;
861 if (is_kernel) { 864 if (is_kernel) {
862 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length); 865 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length);
863 free(const_cast<uint8_t*>(kernel_file)); 866 free(const_cast<uint8_t*>(kernel_file));
864 } 867 }
865 868
866 IsolateData* isolate_data = 869 IsolateData* isolate_data =
867 new IsolateData(script_uri, package_root, packages_config); 870 new IsolateData(script_uri, package_root, packages_config);
868 Dart_Isolate isolate = 871 Dart_Isolate isolate =
869 is_kernel ? Dart_CreateIsolateFromKernel(script_uri, main, kernel_program, 872 is_kernel ? Dart_CreateIsolateFromKernel(script_uri, main, kernel_program,
870 flags, isolate_data, error) 873 flags, isolate_data, error)
871 : Dart_CreateIsolate(script_uri, main, isolate_snapshot_buffer, 874 : Dart_CreateIsolate(script_uri, main, isolate_snapshot_data,
872 flags, isolate_data, error); 875 isolate_snapshot_instructions, flags,
876 isolate_data, error);
873 if (isolate == NULL) { 877 if (isolate == NULL) {
874 delete isolate_data; 878 delete isolate_data;
875 return NULL; 879 return NULL;
876 } 880 }
877 881
878 Dart_EnterScope(); 882 Dart_EnterScope();
879 883
880 // Set up the library tag handler for this isolate. 884 // Set up the library tag handler for this isolate.
881 Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler); 885 Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
882 CHECK_RESULT(result); 886 CHECK_RESULT(result);
883 887
884 if (is_kernel) { 888 if (is_kernel) {
885 Dart_Handle result = Dart_LoadKernel(kernel_program); 889 Dart_Handle result = Dart_LoadKernel(kernel_program);
886 CHECK_RESULT(result); 890 CHECK_RESULT(result);
887 } 891 }
888 if (is_kernel || (isolate_snapshot_buffer != NULL)) { 892 if (is_kernel || (isolate_snapshot_data != NULL)) {
889 // Setup the native resolver as the snapshot does not carry it. 893 // Setup the native resolver as the snapshot does not carry it.
890 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); 894 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
891 Builtin::SetNativeResolver(Builtin::kIOLibrary); 895 Builtin::SetNativeResolver(Builtin::kIOLibrary);
892 } 896 }
893 if (isolate_run_app_snapshot) { 897 if (isolate_run_app_snapshot) {
894 Dart_Handle result = Loader::ReloadNativeExtensions(); 898 Dart_Handle result = Loader::ReloadNativeExtensions();
895 CHECK_RESULT(result); 899 CHECK_RESULT(result);
896 } 900 }
897 901
898 if (Dart_IsServiceIsolate(isolate)) { 902 if (Dart_IsServiceIsolate(isolate)) {
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 } 1287 }
1284 } 1288 }
1285 1289
1286 1290
1287 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT 1291 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT
1288 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc; 1292 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc;
1289 static const int64_t kAppSnapshotPageSize = 4 * KB; 1293 static const int64_t kAppSnapshotPageSize = 4 * KB;
1290 1294
1291 1295
1292 static bool ReadAppSnapshotBlobs(const char* script_name, 1296 static bool ReadAppSnapshotBlobs(const char* script_name,
1293 const uint8_t** vmisolate_buffer, 1297 const uint8_t** vm_data_buffer,
1294 const uint8_t** isolate_buffer, 1298 const uint8_t** vm_instructions_buffer,
1295 const uint8_t** instructions_buffer, 1299 const uint8_t** isolate_data_buffer,
1296 const uint8_t** rodata_buffer) { 1300 const uint8_t** isolate_instructions_buffer) {
1297 File* file = File::Open(script_name, File::kRead); 1301 File* file = File::Open(script_name, File::kRead);
1298 if (file == NULL) { 1302 if (file == NULL) {
1299 return false; 1303 return false;
1300 } 1304 }
1301 if (file->Length() < kAppSnapshotHeaderSize) { 1305 if (file->Length() < kAppSnapshotHeaderSize) {
1302 file->Release(); 1306 file->Release();
1303 return false; 1307 return false;
1304 } 1308 }
1305 int64_t header[5]; 1309 int64_t header[5];
1306 ASSERT(sizeof(header) == kAppSnapshotHeaderSize); 1310 ASSERT(sizeof(header) == kAppSnapshotHeaderSize);
1307 if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) { 1311 if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) {
1308 file->Release(); 1312 file->Release();
1309 return false; 1313 return false;
1310 } 1314 }
1311 if (header[0] != kAppSnapshotMagicNumber) { 1315 if (header[0] != kAppSnapshotMagicNumber) {
1312 file->Release(); 1316 file->Release();
1313 return false; 1317 return false;
1314 } 1318 }
1315 1319
1316 int64_t vmisolate_size = header[1]; 1320 int64_t vm_data_size = header[1];
1317 int64_t vmisolate_position = 1321 int64_t vm_data_position =
1318 Utils::RoundUp(file->Position(), kAppSnapshotPageSize); 1322 Utils::RoundUp(file->Position(), kAppSnapshotPageSize);
1319 int64_t isolate_size = header[2]; 1323 int64_t vm_instructions_size = header[2];
1320 int64_t isolate_position = 1324 int64_t vm_instructions_position = vm_data_position + vm_data_size;
1321 Utils::RoundUp(vmisolate_position + vmisolate_size, kAppSnapshotPageSize); 1325 if (vm_instructions_size != 0) {
1322 int64_t rodata_size = header[3]; 1326 vm_instructions_position =
1323 int64_t rodata_position = isolate_position + isolate_size; 1327 Utils::RoundUp(vm_instructions_position, kAppSnapshotPageSize);
1324 if (rodata_size != 0) {
1325 rodata_position = Utils::RoundUp(rodata_position, kAppSnapshotPageSize);
1326 } 1328 }
1327 int64_t instructions_size = header[4]; 1329 int64_t isolate_data_size = header[3];
1328 int64_t instructions_position = rodata_position + rodata_size; 1330 int64_t isolate_data_position = Utils::RoundUp(
1329 if (instructions_size != 0) { 1331 vm_instructions_position + vm_instructions_size, kAppSnapshotPageSize);
1330 instructions_position = 1332 int64_t isolate_instructions_size = header[4];
1331 Utils::RoundUp(instructions_position, kAppSnapshotPageSize); 1333 int64_t isolate_instructions_position =
1334 isolate_data_position + isolate_data_size;
1335 if (isolate_instructions_size != 0) {
1336 isolate_instructions_position =
1337 Utils::RoundUp(isolate_instructions_position, kAppSnapshotPageSize);
1332 } 1338 }
1333 1339
1334 void* read_only_buffer = 1340 if (vm_data_size != 0) {
1335 file->Map(File::kReadOnly, vmisolate_position, 1341 *vm_data_buffer = reinterpret_cast<const uint8_t*>(
1336 instructions_position - vmisolate_position); 1342 file->Map(File::kReadOnly, vm_data_position, vm_data_size));
1337 if (read_only_buffer == NULL) { 1343 if (vm_data_buffer == NULL) {
1344 Log::PrintErr("Failed to memory map snapshot\n");
1345 Platform::Exit(kErrorExitCode);
1346 }
1347 }
1348
1349 if (vm_instructions_size != 0) {
1350 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(file->Map(
1351 File::kReadExecute, vm_instructions_position, vm_instructions_size));
1352 if (*vm_instructions_buffer == NULL) {
1353 Log::PrintErr("Failed to memory map snapshot\n");
1354 Platform::Exit(kErrorExitCode);
1355 }
1356 }
1357
1358 *isolate_data_buffer = reinterpret_cast<const uint8_t*>(
1359 file->Map(File::kReadOnly, isolate_data_position, isolate_data_size));
1360 if (isolate_data_buffer == NULL) {
1338 Log::PrintErr("Failed to memory map snapshot\n"); 1361 Log::PrintErr("Failed to memory map snapshot\n");
1339 Platform::Exit(kErrorExitCode); 1362 Platform::Exit(kErrorExitCode);
1340 } 1363 }
1341 1364
1342 if (vmisolate_size != 0) { 1365 if (isolate_instructions_size == 0) {
1343 *vmisolate_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer) + 1366 *isolate_instructions_buffer = NULL;
1344 (vmisolate_position - vmisolate_position);
1345 }
1346 *isolate_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer) +
1347 (isolate_position - vmisolate_position);
1348 if (rodata_size == 0) {
1349 *rodata_buffer = NULL;
1350 } else { 1367 } else {
1351 *rodata_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer) + 1368 *isolate_instructions_buffer = reinterpret_cast<const uint8_t*>(
1352 (rodata_position - vmisolate_position); 1369 file->Map(File::kReadExecute, isolate_instructions_position,
1353 } 1370 isolate_instructions_size));
1354 1371 if (*isolate_instructions_buffer == NULL) {
1355 if (instructions_size == 0) {
1356 *instructions_buffer = NULL;
1357 } else {
1358 *instructions_buffer = reinterpret_cast<const uint8_t*>(
1359 file->Map(File::kReadExecute, instructions_position, header[4]));
1360 if (*instructions_buffer == NULL) {
1361 Log::PrintErr("Failed to memory map snapshot\n"); 1372 Log::PrintErr("Failed to memory map snapshot\n");
1362 Platform::Exit(kErrorExitCode); 1373 Platform::Exit(kErrorExitCode);
1363 } 1374 }
1364 } 1375 }
1365 1376
1366 file->Release(); 1377 file->Release();
1367 return true; 1378 return true;
1368 } 1379 }
1369 1380
1370 1381
1371 static bool ReadAppSnapshotDynamicLibrary(const char* script_name, 1382 static bool ReadAppSnapshotDynamicLibrary(
1372 const uint8_t** vmisolate_buffer, 1383 const char* script_name,
1373 const uint8_t** isolate_buffer, 1384 const uint8_t** vm_data_buffer,
1374 const uint8_t** instructions_buffer, 1385 const uint8_t** vm_instructions_buffer,
1375 const uint8_t** rodata_buffer) { 1386 const uint8_t** isolate_data_buffer,
1387 const uint8_t** isolate_instructions_buffer) {
1376 void* library = Extensions::LoadExtensionLibrary(script_name); 1388 void* library = Extensions::LoadExtensionLibrary(script_name);
1377 if (library == NULL) { 1389 if (library == NULL) {
1378 return false; 1390 return false;
1379 } 1391 }
1380 1392
1381 *vmisolate_buffer = reinterpret_cast<const uint8_t*>( 1393 *vm_data_buffer = reinterpret_cast<const uint8_t*>(
1382 Extensions::ResolveSymbol(library, kPrecompiledVMIsolateSymbolName)); 1394 Extensions::ResolveSymbol(library, kVmSnapshotDataSymbolName));
1383 if (*vmisolate_buffer == NULL) { 1395 if (*vm_data_buffer == NULL) {
1384 Log::PrintErr("Failed to resolve symbol '%s'\n", 1396 Log::PrintErr("Failed to resolve symbol '%s'\n", kVmSnapshotDataSymbolName);
1385 kPrecompiledVMIsolateSymbolName);
1386 Platform::Exit(kErrorExitCode); 1397 Platform::Exit(kErrorExitCode);
1387 } 1398 }
1388 1399
1389 *isolate_buffer = reinterpret_cast<const uint8_t*>( 1400 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(
1390 Extensions::ResolveSymbol(library, kPrecompiledIsolateSymbolName)); 1401 Extensions::ResolveSymbol(library, kVmSnapshotInstructionsSymbolName));
1391 if (*isolate_buffer == NULL) { 1402 if (*vm_instructions_buffer == NULL) {
1392 Log::PrintErr("Failed to resolve symbol '%s'\n", 1403 Log::PrintErr("Failed to resolve symbol '%s'\n",
1393 kPrecompiledIsolateSymbolName); 1404 kVmSnapshotInstructionsSymbolName);
1394 Platform::Exit(kErrorExitCode); 1405 Platform::Exit(kErrorExitCode);
1395 } 1406 }
1396 1407
1397 *instructions_buffer = reinterpret_cast<const uint8_t*>( 1408 *isolate_data_buffer = reinterpret_cast<const uint8_t*>(
1398 Extensions::ResolveSymbol(library, kPrecompiledInstructionsSymbolName)); 1409 Extensions::ResolveSymbol(library, kIsolateSnapshotDataSymbolName));
1399 if (*instructions_buffer == NULL) { 1410 if (*isolate_data_buffer == NULL) {
1400 Log::PrintErr("Failed to resolve symbol '%s'\n", 1411 Log::PrintErr("Failed to resolve symbol '%s'\n",
1401 kPrecompiledInstructionsSymbolName); 1412 kIsolateSnapshotDataSymbolName);
1402 Platform::Exit(kErrorExitCode); 1413 Platform::Exit(kErrorExitCode);
1403 } 1414 }
1404 1415
1405 *rodata_buffer = reinterpret_cast<const uint8_t*>( 1416 *isolate_instructions_buffer =
1406 Extensions::ResolveSymbol(library, kPrecompiledDataSymbolName)); 1417 reinterpret_cast<const uint8_t*>(Extensions::ResolveSymbol(
1407 if (*rodata_buffer == NULL) { 1418 library, kIsolateSnapshotInstructionsSymbolName));
1419 if (*isolate_instructions_buffer == NULL) {
1408 Log::PrintErr("Failed to resolve symbol '%s'\n", 1420 Log::PrintErr("Failed to resolve symbol '%s'\n",
1409 kPrecompiledDataSymbolName); 1421 kIsolateSnapshotInstructionsSymbolName);
1410 Platform::Exit(kErrorExitCode); 1422 Platform::Exit(kErrorExitCode);
1411 } 1423 }
1412 1424
1413 return true; 1425 return true;
1414 } 1426 }
1415 1427
1416 1428
1417 static bool ReadAppSnapshot(const char* script_name, 1429 static bool ReadAppSnapshot(const char* script_name,
1418 const uint8_t** vmisolate_buffer, 1430 const uint8_t** vm_data_buffer,
1419 const uint8_t** isolate_buffer, 1431 const uint8_t** vm_instructions_buffer,
1420 const uint8_t** instructions_buffer, 1432 const uint8_t** isolate_data_buffer,
1421 const uint8_t** rodata_buffer) { 1433 const uint8_t** isolate_instructions_buffer) {
1422 if (File::GetType(script_name, true) != File::kIsFile) { 1434 if (File::GetType(script_name, true) != File::kIsFile) {
1423 // If 'script_name' refers to a pipe, don't read to check for an app 1435 // If 'script_name' refers to a pipe, don't read to check for an app
1424 // snapshot since we cannot rewind if it isn't (and couldn't mmap it in 1436 // snapshot since we cannot rewind if it isn't (and couldn't mmap it in
1425 // anyway if it was). 1437 // anyway if it was).
1426 return false; 1438 return false;
1427 } 1439 }
1428 if (ReadAppSnapshotBlobs(script_name, vmisolate_buffer, isolate_buffer, 1440 if (ReadAppSnapshotBlobs(script_name, vm_data_buffer, vm_instructions_buffer,
1429 instructions_buffer, rodata_buffer)) { 1441 isolate_data_buffer, isolate_instructions_buffer)) {
1430 return true; 1442 return true;
1431 } 1443 }
1432 return ReadAppSnapshotDynamicLibrary(script_name, vmisolate_buffer, 1444 return ReadAppSnapshotDynamicLibrary(
1433 isolate_buffer, instructions_buffer, 1445 script_name, vm_data_buffer, vm_instructions_buffer, isolate_data_buffer,
1434 rodata_buffer); 1446 isolate_instructions_buffer);
1435 } 1447 }
1436 1448
1437 1449
1438 static bool WriteInt64(File* file, int64_t size) { 1450 static bool WriteInt64(File* file, int64_t size) {
1439 return file->WriteFully(&size, sizeof(size)); 1451 return file->WriteFully(&size, sizeof(size));
1440 } 1452 }
1441 1453
1442 1454
1443 static void WriteAppSnapshot(const char* filename, 1455 static void WriteAppSnapshot(const char* filename,
1444 uint8_t* vmisolate_buffer, 1456 uint8_t* vm_data_buffer,
1445 intptr_t vmisolate_size, 1457 intptr_t vm_data_size,
1446 uint8_t* isolate_buffer, 1458 uint8_t* vm_instructions_buffer,
1447 intptr_t isolate_size, 1459 intptr_t vm_instructions_size,
1448 uint8_t* instructions_buffer, 1460 uint8_t* isolate_data_buffer,
1449 intptr_t instructions_size, 1461 intptr_t isolate_data_size,
1450 uint8_t* rodata_buffer, 1462 uint8_t* isolate_instructions_buffer,
1451 intptr_t rodata_size) { 1463 intptr_t isolate_instructions_size) {
1452 File* file = File::Open(filename, File::kWriteTruncate); 1464 File* file = File::Open(filename, File::kWriteTruncate);
1453 if (file == NULL) { 1465 if (file == NULL) {
1454 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename); 1466 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1455 } 1467 }
1456 1468
1457 file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber)); 1469 file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber));
1458 WriteInt64(file, vmisolate_size); 1470 WriteInt64(file, vm_data_size);
1459 WriteInt64(file, isolate_size); 1471 WriteInt64(file, vm_instructions_size);
1460 WriteInt64(file, rodata_size); 1472 WriteInt64(file, isolate_data_size);
1461 WriteInt64(file, instructions_size); 1473 WriteInt64(file, isolate_instructions_size);
1462 ASSERT(file->Position() == kAppSnapshotHeaderSize); 1474 ASSERT(file->Position() == kAppSnapshotHeaderSize);
1463 1475
1464 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize)); 1476 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1465 if (!file->WriteFully(vmisolate_buffer, vmisolate_size)) { 1477 if (!file->WriteFully(vm_data_buffer, vm_data_size)) {
1466 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename); 1478 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1467 } 1479 }
1468 1480
1469 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize)); 1481 if (vm_instructions_size != 0) {
1470 if (!file->WriteFully(isolate_buffer, isolate_size)) {
1471 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1472 }
1473
1474 if (rodata_size != 0) {
1475 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize)); 1482 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1476 if (!file->WriteFully(rodata_buffer, rodata_size)) { 1483 if (!file->WriteFully(vm_instructions_buffer, vm_instructions_size)) {
1477 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", 1484 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1478 filename); 1485 filename);
1479 } 1486 }
1480 } 1487 }
1481 1488
1482 if (instructions_size != 0) { 1489 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1490 if (!file->WriteFully(isolate_data_buffer, isolate_data_size)) {
1491 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1492 }
1493
1494 if (isolate_instructions_size != 0) {
1483 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize)); 1495 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1484 if (!file->WriteFully(instructions_buffer, instructions_size)) { 1496 if (!file->WriteFully(isolate_instructions_buffer,
1497 isolate_instructions_size)) {
1485 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", 1498 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1486 filename); 1499 filename);
1487 } 1500 }
1488 } 1501 }
1489 1502
1490 file->Flush(); 1503 file->Flush();
1491 file->Release(); 1504 file->Release();
1492 } 1505 }
1493 1506
1494 1507
1495 static void GenerateScriptSnapshot() { 1508 static void GenerateScriptSnapshot() {
1496 // First create a snapshot. 1509 // First create a snapshot.
1497 uint8_t* buffer = NULL; 1510 uint8_t* buffer = NULL;
1498 intptr_t size = 0; 1511 intptr_t size = 0;
1499 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); 1512 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
1500 if (Dart_IsError(result)) { 1513 if (Dart_IsError(result)) {
1501 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1514 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1502 } 1515 }
1503 1516
1504 WriteSnapshotFile(snapshot_filename, true, buffer, size); 1517 WriteSnapshotFile(snapshot_filename, true, buffer, size);
1505 } 1518 }
1506 1519
1507 1520
1508 static void GeneratePrecompiledSnapshot() { 1521 static void GenerateAppAOTSnapshotAsBlobs() {
1509 uint8_t* vm_isolate_buffer = NULL; 1522 uint8_t* vm_data_buffer = NULL;
1510 intptr_t vm_isolate_size = 0; 1523 intptr_t vm_data_size = 0;
1511 uint8_t* isolate_buffer = NULL; 1524 uint8_t* vm_instructions_buffer = NULL;
1512 intptr_t isolate_size = 0; 1525 intptr_t vm_instructions_size = 0;
1513 uint8_t* assembly_buffer = NULL; 1526 uint8_t* isolate_data_buffer = NULL;
1514 intptr_t assembly_size = 0; 1527 intptr_t isolate_data_size = 0;
1515 uint8_t* instructions_blob_buffer = NULL; 1528 uint8_t* isolate_instructions_buffer = NULL;
1516 intptr_t instructions_blob_size = 0; 1529 intptr_t isolate_instructions_size = 0;
1517 uint8_t* rodata_blob_buffer = NULL; 1530 Dart_Handle result = Dart_CreateAppAOTSnapshotAsBlobs(
1518 intptr_t rodata_blob_size = 0; 1531 &vm_data_buffer, &vm_data_size, &vm_instructions_buffer,
1519 Dart_Handle result; 1532 &vm_instructions_size, &isolate_data_buffer, &isolate_data_size,
1520 if (use_blobs) { 1533 &isolate_instructions_buffer, &isolate_instructions_size);
1521 result = Dart_CreateAppAOTSnapshotAsBlobs(
1522 &vm_isolate_buffer, &vm_isolate_size, &isolate_buffer, &isolate_size,
1523 &instructions_blob_buffer, &instructions_blob_size, &rodata_blob_buffer,
1524 &rodata_blob_size);
1525 } else {
1526 result =
1527 Dart_CreateAppAOTSnapshotAsAssembly(&assembly_buffer, &assembly_size);
1528 }
1529 if (Dart_IsError(result)) { 1534 if (Dart_IsError(result)) {
1530 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1535 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1531 } 1536 }
1537 WriteAppSnapshot(snapshot_filename, vm_data_buffer, vm_data_size,
1538 vm_instructions_buffer, vm_instructions_size,
1539 isolate_data_buffer, isolate_data_size,
1540 isolate_instructions_buffer, isolate_instructions_size);
1541 }
1542
1543 static void GenerateAppAOTSnapshotAsAssembly() {
1544 uint8_t* assembly_buffer = NULL;
1545 intptr_t assembly_size = 0;
1546 Dart_Handle result =
1547 Dart_CreateAppAOTSnapshotAsAssembly(&assembly_buffer, &assembly_size);
1548 if (Dart_IsError(result)) {
1549 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1550 }
1551 WriteSnapshotFile(snapshot_filename, false, assembly_buffer, assembly_size);
1552 }
1553
1554
1555 static void GenerateAppAOTSnapshot() {
1532 if (use_blobs) { 1556 if (use_blobs) {
1533 WriteAppSnapshot(snapshot_filename, vm_isolate_buffer, vm_isolate_size, 1557 GenerateAppAOTSnapshotAsBlobs();
1534 isolate_buffer, isolate_size, instructions_blob_buffer,
1535 instructions_blob_size, rodata_blob_buffer,
1536 rodata_blob_size);
1537 } else { 1558 } else {
1538 WriteSnapshotFile(snapshot_filename, false, assembly_buffer, assembly_size); 1559 GenerateAppAOTSnapshotAsAssembly();
1539 } 1560 }
1540 } 1561 }
1541 1562
1542 1563
1543 static void GenerateAppJITSnapshot() { 1564 static void GenerateAppJITSnapshot() {
1544 #if defined(TARGET_ARCH_X64) 1565 #if defined(TARGET_ARCH_X64)
1545 uint8_t* vm_isolate_buffer = NULL; 1566 uint8_t* isolate_data_buffer = NULL;
1546 intptr_t vm_isolate_size = 0; 1567 intptr_t isolate_data_size = 0;
1547 uint8_t* isolate_buffer = NULL; 1568 uint8_t* isolate_instructions_buffer = NULL;
1548 intptr_t isolate_size = 0; 1569 intptr_t isolate_instructions_size = 0;
1549 uint8_t* instructions_blob_buffer = NULL;
1550 intptr_t instructions_blob_size = 0;
1551 uint8_t* rodata_blob_buffer = NULL;
1552 intptr_t rodata_blob_size = 0;
1553 Dart_Handle result = Dart_CreateAppJITSnapshotAsBlobs( 1570 Dart_Handle result = Dart_CreateAppJITSnapshotAsBlobs(
1554 &isolate_buffer, &isolate_size, &instructions_blob_buffer, 1571 &isolate_data_buffer, &isolate_data_size, &isolate_instructions_buffer,
1555 &instructions_blob_size, &rodata_blob_buffer, &rodata_blob_size); 1572 &isolate_instructions_size);
1556 if (Dart_IsError(result)) { 1573 if (Dart_IsError(result)) {
1557 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1574 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1558 } 1575 }
1559 WriteAppSnapshot(snapshot_filename, vm_isolate_buffer, vm_isolate_size, 1576 WriteAppSnapshot(snapshot_filename, NULL, 0, NULL, 0, isolate_data_buffer,
1560 isolate_buffer, isolate_size, instructions_blob_buffer, 1577 isolate_data_size, isolate_instructions_buffer,
1561 instructions_blob_size, rodata_blob_buffer, 1578 isolate_instructions_size);
1562 rodata_blob_size);
1563 #else 1579 #else
1564 uint8_t* isolate_buffer = NULL; 1580 uint8_t* isolate_buffer = NULL;
1565 intptr_t isolate_size = 0; 1581 intptr_t isolate_size = 0;
1566 1582
1567 Dart_Handle result = 1583 Dart_Handle result =
1568 Dart_CreateSnapshot(NULL, NULL, &isolate_buffer, &isolate_size); 1584 Dart_CreateSnapshot(NULL, NULL, &isolate_buffer, &isolate_size);
1569 if (Dart_IsError(result)) { 1585 if (Dart_IsError(result)) {
1570 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1586 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1571 } 1587 }
1572 1588
1573 WriteAppSnapshot(snapshot_filename, NULL, 0, isolate_buffer, isolate_size, 1589 WriteAppSnapshot(snapshot_filename, NULL, 0, NULL, 0, isolate_buffer,
1574 NULL, 0, NULL, 0); 1590 isolate_size, NULL, 0);
1575 #endif // defined(TARGET_ARCH_X64) 1591 #endif // defined(TARGET_ARCH_X64)
1576 } 1592 }
1577 1593
1578 1594
1579 #define CHECK_RESULT(result) \ 1595 #define CHECK_RESULT(result) \
1580 if (Dart_IsError(result)) { \ 1596 if (Dart_IsError(result)) { \
1581 if (Dart_IsVMRestartRequest(result)) { \ 1597 if (Dart_IsVMRestartRequest(result)) { \
1582 Dart_ExitScope(); \ 1598 Dart_ExitScope(); \
1583 Dart_ShutdownIsolate(); \ 1599 Dart_ShutdownIsolate(); \
1584 return true; \ 1600 return true; \
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 1748
1733 result = Dart_Precompile(standalone_entry_points, feedback_buffer, 1749 result = Dart_Precompile(standalone_entry_points, feedback_buffer,
1734 feedback_length); 1750 feedback_length);
1735 if (feedback_buffer != NULL) { 1751 if (feedback_buffer != NULL) {
1736 free(feedback_buffer); 1752 free(feedback_buffer);
1737 } 1753 }
1738 CHECK_RESULT(result); 1754 CHECK_RESULT(result);
1739 } 1755 }
1740 1756
1741 if (gen_snapshot_kind == kAppAOT) { 1757 if (gen_snapshot_kind == kAppAOT) {
1742 GeneratePrecompiledSnapshot(); 1758 GenerateAppAOTSnapshot();
1743 } else { 1759 } else {
1744 if (Dart_IsNull(root_lib)) { 1760 if (Dart_IsNull(root_lib)) {
1745 ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n", 1761 ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n",
1746 script_name); 1762 script_name);
1747 } 1763 }
1748 1764
1749 // The helper function _getMainClosure creates a closure for the main 1765 // The helper function _getMainClosure creates a closure for the main
1750 // entry point which is either explicitly or implictly exported from the 1766 // entry point which is either explicitly or implictly exported from the
1751 // root library. 1767 // root library.
1752 Dart_Handle main_closure = 1768 Dart_Handle main_closure =
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1930 Thread::InitOnce(); 1946 Thread::InitOnce();
1931 1947
1932 Loader::InitOnce(); 1948 Loader::InitOnce();
1933 1949
1934 if (!DartUtils::SetOriginalWorkingDirectory()) { 1950 if (!DartUtils::SetOriginalWorkingDirectory()) {
1935 OSError err; 1951 OSError err;
1936 Log::PrintErr("Error determining current directory: %s\n", err.message()); 1952 Log::PrintErr("Error determining current directory: %s\n", err.message());
1937 Platform::Exit(kErrorExitCode); 1953 Platform::Exit(kErrorExitCode);
1938 } 1954 }
1939 1955
1940 const uint8_t* instructions_snapshot = NULL; 1956 if (ReadAppSnapshot(script_name, &vm_snapshot_data, &vm_snapshot_instructions,
1941 const uint8_t* data_snapshot = NULL; 1957 &app_isolate_snapshot_data,
1942 if (ReadAppSnapshot(script_name, &vm_isolate_snapshot_buffer, 1958 &app_isolate_snapshot_instructions)) {
1943 &app_isolate_snapshot_buffer, &instructions_snapshot,
1944 &data_snapshot)) {
1945 vm_run_app_snapshot = true; 1959 vm_run_app_snapshot = true;
1946 } 1960 }
1947 1961
1948 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) 1962 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1949 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. 1963 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME.
1950 if ((gen_snapshot_kind != kNone) || vm_run_app_snapshot) { 1964 if ((gen_snapshot_kind != kNone) || vm_run_app_snapshot) {
1951 vm_options.AddArgument("--load_deferred_eagerly"); 1965 vm_options.AddArgument("--load_deferred_eagerly");
1952 } 1966 }
1953 #endif 1967 #endif
1954 1968
(...skipping 16 matching lines...) Expand all
1971 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); 1985 Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
1972 1986
1973 // Start event handler. 1987 // Start event handler.
1974 TimerUtils::InitOnce(); 1988 TimerUtils::InitOnce();
1975 EventHandler::Start(); 1989 EventHandler::Start();
1976 1990
1977 // Initialize the Dart VM. 1991 // Initialize the Dart VM.
1978 Dart_InitializeParams init_params; 1992 Dart_InitializeParams init_params;
1979 memset(&init_params, 0, sizeof(init_params)); 1993 memset(&init_params, 0, sizeof(init_params));
1980 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION; 1994 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
1981 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer; 1995 init_params.vm_snapshot_data = vm_snapshot_data;
1982 init_params.instructions_snapshot = instructions_snapshot; 1996 init_params.vm_snapshot_instructions = vm_snapshot_instructions;
1983 init_params.data_snapshot = data_snapshot;
1984 init_params.create = CreateIsolateAndSetup; 1997 init_params.create = CreateIsolateAndSetup;
1985 init_params.shutdown = ShutdownIsolate; 1998 init_params.shutdown = ShutdownIsolate;
1986 init_params.file_open = DartUtils::OpenFile; 1999 init_params.file_open = DartUtils::OpenFile;
1987 init_params.file_read = DartUtils::ReadFile; 2000 init_params.file_read = DartUtils::ReadFile;
1988 init_params.file_write = DartUtils::WriteFile; 2001 init_params.file_write = DartUtils::WriteFile;
1989 init_params.file_close = DartUtils::CloseFile; 2002 init_params.file_close = DartUtils::CloseFile;
1990 init_params.entropy_source = DartUtils::EntropySource; 2003 init_params.entropy_source = DartUtils::EntropySource;
1991 init_params.get_service_assets = GetVMServiceAssetsArchiveCallback; 2004 init_params.get_service_assets = GetVMServiceAssetsArchiveCallback;
1992 2005
1993 char* error = Dart_Initialize(&init_params); 2006 char* error = Dart_Initialize(&init_params);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2041 Platform::Exit(Process::GlobalExitCode()); 2054 Platform::Exit(Process::GlobalExitCode());
2042 } 2055 }
2043 2056
2044 } // namespace bin 2057 } // namespace bin
2045 } // namespace dart 2058 } // namespace dart
2046 2059
2047 int main(int argc, char** argv) { 2060 int main(int argc, char** argv) {
2048 dart::bin::main(argc, argv); 2061 dart::bin::main(argc, argv);
2049 UNREACHABLE(); 2062 UNREACHABLE();
2050 } 2063 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698