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

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

Issue 2410303008: Revert "Use a single file for app snapshots." (Closed)
Patch Set: Created 4 years, 2 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 | « runtime/bin/gen_snapshot.cc ('k') | 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 // the same way as precompilation before main, then continue running in the 90 // the same way as precompilation before main, then continue running in the
91 // same process. 91 // same process.
92 // Always set this with dart_noopt. 92 // Always set this with dart_noopt.
93 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) 93 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT)
94 static const bool is_noopt = true; 94 static const bool is_noopt = true;
95 #else 95 #else
96 static const bool is_noopt = false; 96 static const bool is_noopt = false;
97 #endif 97 #endif
98 98
99 99
100 extern const char* kPrecompiledVMIsolateSymbolName; 100 extern const char* kPrecompiledLibraryName;
101 extern const char* kPrecompiledIsolateSymbolName;
102 extern const char* kPrecompiledInstructionsSymbolName; 101 extern const char* kPrecompiledInstructionsSymbolName;
103 extern const char* kPrecompiledDataSymbolName; 102 extern const char* kPrecompiledDataSymbolName;
104 103
104 static const char* kVMIsolateSuffix = "snapshot.vmisolate";
105 static const char* kIsolateSuffix = "snapshot.isolate";
106 static const char* kAssemblySuffix = "snapshot.S";
107 static const char* kInstructionsSuffix = "snapshot.instructions";
108 static const char* kRODataSuffix = "snapshot.rodata";
109
105 110
106 // Global flag that is used to indicate that we want to trace resolution of 111 // Global flag that is used to indicate that we want to trace resolution of
107 // URIs and the loading of libraries, parts and scripts. 112 // URIs and the loading of libraries, parts and scripts.
108 static bool trace_loading = false; 113 static bool trace_loading = false;
109 114
110 115
111 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1"; 116 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
112 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; 117 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
113 // VM Service options. 118 // VM Service options.
114 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; 119 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } else if (strcmp(kind, "app-after-run") == 0) { 371 } else if (strcmp(kind, "app-after-run") == 0) {
367 gen_snapshot_kind = kAppAfterRun; 372 gen_snapshot_kind = kAppAfterRun;
368 return true; 373 return true;
369 } 374 }
370 Log::PrintErr("Unrecognized snapshot kind: '%s'\nValid kinds are: " 375 Log::PrintErr("Unrecognized snapshot kind: '%s'\nValid kinds are: "
371 "script, app-aot, app-jit-after-run, app-after-run\n", kind); 376 "script, app-aot, app-jit-after-run, app-after-run\n", kind);
372 return false; 377 return false;
373 } 378 }
374 379
375 380
381 static bool ProcessRunAppSnapshotOption(
382 const char* filename, CommandLineOptions* vm_options) {
383 ASSERT(filename != NULL);
384 snapshot_filename = filename;
385 run_app_snapshot = true;
386 return true;
387 }
388
389
376 static bool ProcessEnableVmServiceOption(const char* option_value, 390 static bool ProcessEnableVmServiceOption(const char* option_value,
377 CommandLineOptions* vm_options) { 391 CommandLineOptions* vm_options) {
378 ASSERT(option_value != NULL); 392 ASSERT(option_value != NULL);
379 393
380 if (!ExtractPortAndIP(option_value, 394 if (!ExtractPortAndIP(option_value,
381 &vm_service_server_port, 395 &vm_service_server_port,
382 &vm_service_server_ip, 396 &vm_service_server_ip,
383 DEFAULT_VM_SERVICE_SERVER_PORT, 397 DEFAULT_VM_SERVICE_SERVER_PORT,
384 DEFAULT_VM_SERVICE_SERVER_IP)) { 398 DEFAULT_VM_SERVICE_SERVER_IP)) {
385 Log::PrintErr("unrecognized --enable-vm-service option syntax. " 399 Log::PrintErr("unrecognized --enable-vm-service option syntax. "
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 { "--version", ProcessVersionOption }, 558 { "--version", ProcessVersionOption },
545 559
546 // VM specific options to the standalone dart program. 560 // VM specific options to the standalone dart program.
547 { "--compile_all", ProcessCompileAllOption }, 561 { "--compile_all", ProcessCompileAllOption },
548 { "--parse_all", ProcessParseAllOption }, 562 { "--parse_all", ProcessParseAllOption },
549 { "--enable-vm-service", ProcessEnableVmServiceOption }, 563 { "--enable-vm-service", ProcessEnableVmServiceOption },
550 { "--disable-service-origin-check", ProcessDisableServiceOriginCheckOption }, 564 { "--disable-service-origin-check", ProcessDisableServiceOriginCheckOption },
551 { "--observe", ProcessObserveOption }, 565 { "--observe", ProcessObserveOption },
552 { "--snapshot=", ProcessSnapshotFilenameOption }, 566 { "--snapshot=", ProcessSnapshotFilenameOption },
553 { "--snapshot-kind=", ProcessSnapshotKindOption }, 567 { "--snapshot-kind=", ProcessSnapshotKindOption },
568 { "--run-app-snapshot=", ProcessRunAppSnapshotOption },
554 { "--use-blobs", ProcessUseBlobsOption }, 569 { "--use-blobs", ProcessUseBlobsOption },
555 { "--trace-loading", ProcessTraceLoadingOption }, 570 { "--trace-loading", ProcessTraceLoadingOption },
556 { "--hot-reload-test-mode", ProcessHotReloadTestModeOption }, 571 { "--hot-reload-test-mode", ProcessHotReloadTestModeOption },
557 { "--hot-reload-rollback-test-mode", ProcessHotReloadRollbackTestModeOption }, 572 { "--hot-reload-rollback-test-mode", ProcessHotReloadRollbackTestModeOption },
558 { "--short_socket_read", ProcessShortSocketReadOption }, 573 { "--short_socket_read", ProcessShortSocketReadOption },
559 { "--short_socket_write", ProcessShortSocketWriteOption }, 574 { "--short_socket_write", ProcessShortSocketWriteOption },
560 #if !defined(TARGET_OS_MACOS) 575 #if !defined(TARGET_OS_MACOS)
561 { "--root-certs-file=", ProcessRootCertsFileOption }, 576 { "--root-certs-file=", ProcessRootCertsFileOption },
562 { "--root-certs-cache=", ProcessRootCertsCacheOption }, 577 { "--root-certs-cache=", ProcessRootCertsCacheOption },
563 #endif // !defined(TARGET_OS_MACOS) 578 #endif // !defined(TARGET_OS_MACOS)
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 "Unable to write file %s for writing snapshot\n", 1200 "Unable to write file %s for writing snapshot\n",
1186 qualified_filename); 1201 qualified_filename);
1187 } 1202 }
1188 file->Release(); 1203 file->Release();
1189 if (concat != NULL) { 1204 if (concat != NULL) {
1190 delete concat; 1205 delete concat;
1191 } 1206 }
1192 } 1207 }
1193 1208
1194 1209
1195 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT 1210 static void ReadSnapshotFile(const char* snapshot_directory,
1196 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc; 1211 const char* filename,
1197 static const int64_t kAppSnapshotPageSize = 4 * KB; 1212 const uint8_t** buffer) {
1198 1213 char* concat = NULL;
1199 1214 const char* qualified_filename;
1200 static bool ReadAppSnapshotBlobs(const char* script_name, 1215 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) {
1201 const uint8_t** vmisolate_buffer, 1216 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, filename);
1202 const uint8_t** isolate_buffer, 1217 concat = new char[len + 1];
1203 const uint8_t** instructions_buffer, 1218 snprintf(concat, len + 1, "%s/%s", snapshot_directory, filename);
1204 const uint8_t** rodata_buffer) { 1219 qualified_filename = concat;
1205 File* file = File::Open(script_name, File::kRead); 1220 } else {
1206 if (file == NULL) { 1221 qualified_filename = filename;
1207 return false;
1208 }
1209 if (file->Length() < kAppSnapshotHeaderSize) {
1210 file->Release();
1211 return false;
1212 }
1213 int64_t header[5];
1214 ASSERT(sizeof(header) == kAppSnapshotHeaderSize);
1215 if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) {
1216 file->Release();
1217 return false;
1218 }
1219 if (header[0] != kAppSnapshotMagicNumber) {
1220 file->Release();
1221 return false;
1222 } 1222 }
1223 1223
1224 int64_t vmisolate_position = 1224 void* file = DartUtils::OpenFile(qualified_filename, false);
1225 Utils::RoundUp(file->Position(), kAppSnapshotPageSize); 1225 if (file == NULL) {
1226 int64_t isolate_position = 1226 fprintf(stderr,
1227 Utils::RoundUp(vmisolate_position + header[1], kAppSnapshotPageSize); 1227 "Error: Unable to open file %s for reading snapshot\n",
1228 int64_t rodata_position = 1228 qualified_filename);
1229 Utils::RoundUp(isolate_position + header[2], kAppSnapshotPageSize); 1229 fflush(stderr);
1230 int64_t instructions_position = 1230 Platform::Exit(kErrorExitCode);
1231 Utils::RoundUp(rodata_position + header[3], kAppSnapshotPageSize);
1232
1233 void* read_only_buffer =
1234 file->Map(File::kReadOnly, vmisolate_position,
1235 instructions_position - vmisolate_position);
1236 if (read_only_buffer == NULL) {
1237 ErrorExit(kErrorExitCode, "Failed to memory map snapshot\n");
1238 } 1231 }
1239 1232 intptr_t len = -1;
1240 *vmisolate_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer) 1233 DartUtils::ReadFile(buffer, &len, file);
1241 + (vmisolate_position - vmisolate_position); 1234 if ((*buffer == NULL) || (len == -1)) {
1242 *isolate_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer) 1235 fprintf(stderr,
1243 + (isolate_position - vmisolate_position); 1236 "Error: Unable to read snapshot file %s\n", qualified_filename);
1244 if (header[3] == 0) { 1237 fflush(stderr);
1245 *rodata_buffer = NULL; 1238 Platform::Exit(kErrorExitCode);
1246 } else {
1247 *rodata_buffer = reinterpret_cast<const uint8_t*>(read_only_buffer)
1248 + (rodata_position - vmisolate_position);
1249 } 1239 }
1250 1240 DartUtils::CloseFile(file);
1251 if (header[4] == 0) { 1241 if (concat != NULL) {
1252 *instructions_buffer = NULL; 1242 delete[] concat;
1253 } else {
1254 *instructions_buffer = reinterpret_cast<const uint8_t*>(
1255 file->Map(File::kReadExecute, instructions_position, header[4]));
1256 if (*instructions_buffer == NULL) {
1257 ErrorExit(kErrorExitCode, "Failed to memory map snapshot2\n");
1258 }
1259 } 1243 }
1260
1261 file->Release();
1262 return true;
1263 } 1244 }
1264 1245
1265 1246
1266 static bool ReadAppSnapshotDynamicLibrary(const char* script_name, 1247 static void ReadExecutableSnapshotFile(const char* snapshot_directory,
1267 const uint8_t** vmisolate_buffer, 1248 const char* filename,
1268 const uint8_t** isolate_buffer, 1249 const uint8_t** buffer) {
1269 const uint8_t** instructions_buffer, 1250 char* concat = NULL;
1270 const uint8_t** rodata_buffer) { 1251 const char* qualified_filename;
1271 void* library = Extensions::LoadExtensionLibrary(script_name); 1252 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) {
1272 if (library == NULL) { 1253 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, filename);
1273 return false; 1254 concat = new char[len + 1];
1255 snprintf(concat, len + 1, "%s/%s", snapshot_directory, filename);
1256 qualified_filename = concat;
1257 } else {
1258 qualified_filename = filename;
1274 } 1259 }
1275 1260
1276 *vmisolate_buffer = reinterpret_cast<const uint8_t*>( 1261 intptr_t len = -1;
1277 Extensions::ResolveSymbol(library, kPrecompiledVMIsolateSymbolName)); 1262 *buffer = reinterpret_cast<uint8_t*>(
1278 if (*vmisolate_buffer == NULL) { 1263 DartUtils::MapExecutable(qualified_filename, &len));
1279 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n", 1264 if ((*buffer == NULL) || (len == -1)) {
1280 kPrecompiledVMIsolateSymbolName); 1265 fprintf(stderr,
1266 "Error: Unable to read snapshot file %s\n", qualified_filename);
1267 fflush(stderr);
1268 Platform::Exit(kErrorExitCode);
1281 } 1269 }
1282 1270 if (concat != NULL) {
1283 *isolate_buffer = reinterpret_cast<const uint8_t*>( 1271 delete[] concat;
1284 Extensions::ResolveSymbol(library, kPrecompiledIsolateSymbolName));
1285 if (*isolate_buffer == NULL) {
1286 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1287 kPrecompiledIsolateSymbolName);
1288 } 1272 }
1289
1290 *instructions_buffer = reinterpret_cast<const uint8_t*>(
1291 Extensions::ResolveSymbol(library, kPrecompiledInstructionsSymbolName));
1292 if (*instructions_buffer == NULL) {
1293 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1294 kPrecompiledInstructionsSymbolName);
1295 }
1296
1297 *rodata_buffer = reinterpret_cast<const uint8_t*>(
1298 Extensions::ResolveSymbol(library, kPrecompiledDataSymbolName));
1299 if (*rodata_buffer == NULL) {
1300 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1301 kPrecompiledDataSymbolName);
1302 }
1303
1304 return true;
1305 } 1273 }
1306 1274
1307 1275
1308 static bool ReadAppSnapshot(const char* script_name, 1276 static void* LoadLibrarySymbol(const char* snapshot_directory,
1309 const uint8_t** vmisolate_buffer, 1277 const char* libname,
1310 const uint8_t** isolate_buffer, 1278 const char* symname) {
1311 const uint8_t** instructions_buffer, 1279 char* concat = NULL;
1312 const uint8_t** rodata_buffer) { 1280 const char* qualified_libname;
1313 if (ReadAppSnapshotBlobs(script_name, 1281 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) {
1314 vmisolate_buffer, 1282 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, libname);
1315 isolate_buffer, 1283 concat = new char[len + 1];
1316 instructions_buffer, 1284 snprintf(concat, len + 1, "%s/%s", snapshot_directory, libname);
1317 rodata_buffer)) { 1285 qualified_libname = concat;
1318 return true; 1286 } else {
1287 qualified_libname = libname;
1319 } 1288 }
1320 return ReadAppSnapshotDynamicLibrary(script_name, 1289 void* library = Extensions::LoadExtensionLibrary(qualified_libname);
1321 vmisolate_buffer, 1290 if (concat != NULL) {
1322 isolate_buffer, 1291 delete concat;
1323 instructions_buffer, 1292 }
1324 rodata_buffer); 1293 if (library == NULL) {
1294 return NULL;
1295 }
1296 return Extensions::ResolveSymbol(library, symname);
1325 } 1297 }
1326 1298
1327 1299
1328 static bool WriteInt64(File* file, int64_t size) {
1329 return file->WriteFully(&size, sizeof(size));
1330 }
1331
1332
1333 static void WriteAppSnapshot(const char* filename,
1334 uint8_t* vmisolate_buffer,
1335 intptr_t vmisolate_size,
1336 uint8_t* isolate_buffer,
1337 intptr_t isolate_size,
1338 uint8_t* instructions_buffer,
1339 intptr_t instructions_size,
1340 uint8_t* rodata_buffer,
1341 intptr_t rodata_size) {
1342 File* file = File::Open(filename, File::kWriteTruncate);
1343 if (file == NULL) {
1344 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1345 }
1346
1347 file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber));
1348 WriteInt64(file, vmisolate_size);
1349 WriteInt64(file, isolate_size);
1350 WriteInt64(file, rodata_size);
1351 WriteInt64(file, instructions_size);
1352 ASSERT(file->Position() == kAppSnapshotHeaderSize);
1353
1354 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1355 if (!file->WriteFully(vmisolate_buffer, vmisolate_size)) {
1356 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1357 }
1358
1359 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1360 if (!file->WriteFully(isolate_buffer, isolate_size)) {
1361 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1362 }
1363
1364 if (rodata_size != 0) {
1365 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1366 if (!file->WriteFully(rodata_buffer, rodata_size)) {
1367 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1368 filename);
1369 }
1370 }
1371
1372 if (instructions_size != 0) {
1373 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1374 if (!file->WriteFully(instructions_buffer, instructions_size)) {
1375 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1376 filename);
1377 }
1378 }
1379
1380 file->Flush();
1381 file->Release();
1382 }
1383
1384
1385 static void GenerateScriptSnapshot() { 1300 static void GenerateScriptSnapshot() {
1386 // First create a snapshot. 1301 // First create a snapshot.
1387 uint8_t* buffer = NULL; 1302 uint8_t* buffer = NULL;
1388 intptr_t size = 0; 1303 intptr_t size = 0;
1389 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); 1304 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
1390 if (Dart_IsError(result)) { 1305 if (Dart_IsError(result)) {
1391 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1306 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1392 } 1307 }
1393 1308
1394 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size); 1309 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size);
(...skipping 17 matching lines...) Expand all
1412 &vm_isolate_buffer, 1327 &vm_isolate_buffer,
1413 &vm_isolate_size, 1328 &vm_isolate_size,
1414 &isolate_buffer, 1329 &isolate_buffer,
1415 &isolate_size, 1330 &isolate_size,
1416 &instructions_blob_buffer, 1331 &instructions_blob_buffer,
1417 &instructions_blob_size, 1332 &instructions_blob_size,
1418 &rodata_blob_buffer, 1333 &rodata_blob_buffer,
1419 &rodata_blob_size); 1334 &rodata_blob_size);
1420 } else { 1335 } else {
1421 result = Dart_CreatePrecompiledSnapshotAssembly( 1336 result = Dart_CreatePrecompiledSnapshotAssembly(
1337 &vm_isolate_buffer,
1338 &vm_isolate_size,
1339 &isolate_buffer,
1340 &isolate_size,
1422 &assembly_buffer, 1341 &assembly_buffer,
1423 &assembly_size); 1342 &assembly_size);
1424 } 1343 }
1425 if (Dart_IsError(result)) { 1344 if (Dart_IsError(result)) {
1426 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1345 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1427 } 1346 }
1347 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix,
1348 false,
1349 vm_isolate_buffer,
1350 vm_isolate_size);
1351 WriteSnapshotFile(snapshot_filename, kIsolateSuffix,
1352 false,
1353 isolate_buffer,
1354 isolate_size);
1428 if (use_blobs) { 1355 if (use_blobs) {
1429 WriteAppSnapshot(snapshot_filename, 1356 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix,
1430 vm_isolate_buffer, 1357 false,
1431 vm_isolate_size, 1358 instructions_blob_buffer,
1432 isolate_buffer, 1359 instructions_blob_size);
1433 isolate_size, 1360 WriteSnapshotFile(snapshot_filename, kRODataSuffix,
1434 instructions_blob_buffer, 1361 false,
1435 instructions_blob_size, 1362 rodata_blob_buffer,
1436 rodata_blob_buffer, 1363 rodata_blob_size);
1437 rodata_blob_size);
1438 } else { 1364 } else {
1439 WriteSnapshotFile(NULL, snapshot_filename, 1365 WriteSnapshotFile(snapshot_filename, kAssemblySuffix,
1440 false, 1366 false,
1441 assembly_buffer, 1367 assembly_buffer,
1442 assembly_size); 1368 assembly_size);
1443 } 1369 }
1444 } 1370 }
1445 1371
1446 1372
1447 static void GeneratePrecompiledJITSnapshot() { 1373 static void GeneratePrecompiledJITSnapshot() {
1374 if (!use_blobs) {
1375 ErrorExit(kErrorExitCode,
1376 "Generating app JIT snapshots as assembly unimplemented\n");
1377 }
1448 uint8_t* vm_isolate_buffer = NULL; 1378 uint8_t* vm_isolate_buffer = NULL;
1449 intptr_t vm_isolate_size = 0; 1379 intptr_t vm_isolate_size = 0;
1450 uint8_t* isolate_buffer = NULL; 1380 uint8_t* isolate_buffer = NULL;
1451 intptr_t isolate_size = 0; 1381 intptr_t isolate_size = 0;
1452 uint8_t* instructions_blob_buffer = NULL; 1382 uint8_t* instructions_blob_buffer = NULL;
1453 intptr_t instructions_blob_size = 0; 1383 intptr_t instructions_blob_size = 0;
1454 uint8_t* rodata_blob_buffer = NULL; 1384 uint8_t* rodata_blob_buffer = NULL;
1455 intptr_t rodata_blob_size = 0; 1385 intptr_t rodata_blob_size = 0;
1456 Dart_Handle result = Dart_CreateAppJITSnapshot( 1386 Dart_Handle result = Dart_CreateAppJITSnapshot(
1457 &vm_isolate_buffer, 1387 &vm_isolate_buffer,
1458 &vm_isolate_size, 1388 &vm_isolate_size,
1459 &isolate_buffer, 1389 &isolate_buffer,
1460 &isolate_size, 1390 &isolate_size,
1461 &instructions_blob_buffer, 1391 &instructions_blob_buffer,
1462 &instructions_blob_size, 1392 &instructions_blob_size,
1463 &rodata_blob_buffer, 1393 &rodata_blob_buffer,
1464 &rodata_blob_size); 1394 &rodata_blob_size);
1465 if (Dart_IsError(result)) { 1395 if (Dart_IsError(result)) {
1466 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1396 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1467 } 1397 }
1468 WriteAppSnapshot(snapshot_filename, 1398 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix,
1469 vm_isolate_buffer, 1399 false,
1470 vm_isolate_size, 1400 vm_isolate_buffer,
1471 isolate_buffer, 1401 vm_isolate_size);
1472 isolate_size, 1402 WriteSnapshotFile(snapshot_filename, kIsolateSuffix,
1473 instructions_blob_buffer, 1403 false,
1474 instructions_blob_size, 1404 isolate_buffer,
1475 rodata_blob_buffer, 1405 isolate_size);
1476 rodata_blob_size); 1406 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix,
1407 false,
1408 instructions_blob_buffer,
1409 instructions_blob_size);
1410 WriteSnapshotFile(snapshot_filename, kRODataSuffix,
1411 false,
1412 rodata_blob_buffer,
1413 rodata_blob_size);
1477 } 1414 }
1478 1415
1479 1416
1480 static void GenerateFullSnapshot() { 1417 static void GenerateFullSnapshot() {
1481 // Create a full snapshot of the script. 1418 // Create a full snapshot of the script.
1482 Dart_Handle result; 1419 Dart_Handle result;
1483 uint8_t* vm_isolate_buffer = NULL; 1420 uint8_t* vm_isolate_buffer = NULL;
1484 intptr_t vm_isolate_size = 0; 1421 intptr_t vm_isolate_size = 0;
1485 uint8_t* isolate_buffer = NULL; 1422 uint8_t* isolate_buffer = NULL;
1486 intptr_t isolate_size = 0; 1423 intptr_t isolate_size = 0;
1487 1424
1488 result = Dart_CreateSnapshot(&vm_isolate_buffer, 1425 result = Dart_CreateSnapshot(&vm_isolate_buffer,
1489 &vm_isolate_size, 1426 &vm_isolate_size,
1490 &isolate_buffer, 1427 &isolate_buffer,
1491 &isolate_size); 1428 &isolate_size);
1492 if (Dart_IsError(result)) { 1429 if (Dart_IsError(result)) {
1493 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1430 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1494 } 1431 }
1495 1432
1496 WriteAppSnapshot(snapshot_filename, 1433 WriteSnapshotFile(snapshot_filename,
1497 vm_isolate_buffer, 1434 kVMIsolateSuffix,
1498 vm_isolate_size, 1435 false,
1499 isolate_buffer, 1436 vm_isolate_buffer,
1500 isolate_size, 1437 vm_isolate_size);
1501 NULL, 0, NULL, 0); 1438 WriteSnapshotFile(snapshot_filename,
1439 kIsolateSuffix,
1440 false,
1441 isolate_buffer,
1442 isolate_size);
1502 } 1443 }
1503 1444
1504 1445
1505 #define CHECK_RESULT(result) \ 1446 #define CHECK_RESULT(result) \
1506 if (Dart_IsError(result)) { \ 1447 if (Dart_IsError(result)) { \
1507 if (Dart_IsVMRestartRequest(result)) { \ 1448 if (Dart_IsVMRestartRequest(result)) { \
1508 Dart_ExitScope(); \ 1449 Dart_ExitScope(); \
1509 Dart_ShutdownIsolate(); \ 1450 Dart_ShutdownIsolate(); \
1510 return true; \ 1451 return true; \
1511 } \ 1452 } \
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1835 1776
1836 Loader::InitOnce(); 1777 Loader::InitOnce();
1837 1778
1838 if (!DartUtils::SetOriginalWorkingDirectory()) { 1779 if (!DartUtils::SetOriginalWorkingDirectory()) {
1839 OSError err; 1780 OSError err;
1840 fprintf(stderr, "Error determining current directory: %s\n", err.message()); 1781 fprintf(stderr, "Error determining current directory: %s\n", err.message());
1841 fflush(stderr); 1782 fflush(stderr);
1842 Platform::Exit(kErrorExitCode); 1783 Platform::Exit(kErrorExitCode);
1843 } 1784 }
1844 1785
1845 const uint8_t* instructions_snapshot = NULL;
1846 const uint8_t* data_snapshot = NULL;
1847
1848 if (ReadAppSnapshot(script_name,
1849 &vm_isolate_snapshot_buffer,
1850 &isolate_snapshot_buffer,
1851 &instructions_snapshot,
1852 &data_snapshot)) {
1853 run_app_snapshot = true;
1854 }
1855
1856 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) 1786 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1857 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. 1787 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME.
1858 if ((gen_snapshot_kind != kNone) || run_app_snapshot) { 1788 if ((gen_snapshot_kind != kNone) || run_app_snapshot) {
1859 vm_options.AddArgument("--load_deferred_eagerly"); 1789 vm_options.AddArgument("--load_deferred_eagerly");
1860 } 1790 }
1861 #endif 1791 #endif
1862 1792
1863 if (gen_snapshot_kind == kAppJITAfterRun) { 1793 if (gen_snapshot_kind == kAppJITAfterRun) {
1864 vm_options.AddArgument("--fields_may_be_reset"); 1794 vm_options.AddArgument("--fields_may_be_reset");
1865 } 1795 }
1866 if ((gen_snapshot_kind == kAppAOT) || is_noopt) { 1796 if ((gen_snapshot_kind == kAppAOT) || is_noopt) {
1867 vm_options.AddArgument("--precompilation"); 1797 vm_options.AddArgument("--precompilation");
1868 } 1798 }
1869 #if defined(DART_PRECOMPILED_RUNTIME) 1799 #if defined(DART_PRECOMPILED_RUNTIME)
1870 vm_options.AddArgument("--precompilation"); 1800 vm_options.AddArgument("--precompilation");
1871 #endif 1801 #endif
1872 1802
1873 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); 1803 Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
1874 1804
1875 // Start event handler. 1805 // Start event handler.
1876 TimerUtils::InitOnce(); 1806 TimerUtils::InitOnce();
1877 EventHandler::Start(); 1807 EventHandler::Start();
1878 1808
1809 const uint8_t* instructions_snapshot = NULL;
1810 const uint8_t* data_snapshot = NULL;
1811 if (run_app_snapshot) {
1812 ReadSnapshotFile(snapshot_filename, kVMIsolateSuffix,
1813 &vm_isolate_snapshot_buffer);
1814 ReadSnapshotFile(snapshot_filename, kIsolateSuffix,
1815 &isolate_snapshot_buffer);
1816 if (use_blobs) {
1817 ReadExecutableSnapshotFile(snapshot_filename,
1818 kInstructionsSuffix,
1819 &instructions_snapshot);
1820 ReadSnapshotFile(snapshot_filename, kRODataSuffix,
1821 &data_snapshot);
1822 } else {
1823 instructions_snapshot = reinterpret_cast<const uint8_t*>(
1824 LoadLibrarySymbol(snapshot_filename,
1825 kPrecompiledLibraryName,
1826 kPrecompiledInstructionsSymbolName));
1827 data_snapshot = reinterpret_cast<const uint8_t*>(
1828 LoadLibrarySymbol(snapshot_filename,
1829 kPrecompiledLibraryName,
1830 kPrecompiledDataSymbolName));
1831 }
1832 }
1833
1879 // Initialize the Dart VM. 1834 // Initialize the Dart VM.
1880 Dart_InitializeParams init_params; 1835 Dart_InitializeParams init_params;
1881 memset(&init_params, 0, sizeof(init_params)); 1836 memset(&init_params, 0, sizeof(init_params));
1882 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION; 1837 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
1883 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer; 1838 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer;
1884 init_params.instructions_snapshot = instructions_snapshot; 1839 init_params.instructions_snapshot = instructions_snapshot;
1885 init_params.data_snapshot = data_snapshot; 1840 init_params.data_snapshot = data_snapshot;
1886 init_params.create = CreateIsolateAndSetup; 1841 init_params.create = CreateIsolateAndSetup;
1887 init_params.shutdown = ShutdownIsolate; 1842 init_params.shutdown = ShutdownIsolate;
1888 init_params.file_open = DartUtils::OpenFile; 1843 init_params.file_open = DartUtils::OpenFile;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1943 Platform::Exit(Process::GlobalExitCode()); 1898 Platform::Exit(Process::GlobalExitCode());
1944 } 1899 }
1945 1900
1946 } // namespace bin 1901 } // namespace bin
1947 } // namespace dart 1902 } // namespace dart
1948 1903
1949 int main(int argc, char** argv) { 1904 int main(int argc, char** argv) {
1950 dart::bin::main(argc, argv); 1905 dart::bin::main(argc, argv);
1951 UNREACHABLE(); 1906 UNREACHABLE();
1952 } 1907 }
OLDNEW
« no previous file with comments | « runtime/bin/gen_snapshot.cc ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698