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

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

Issue 1318803002: Toward precompiled snapshots. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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/extensions.h ('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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 // Global flag that is used to indicate that we want to compile all the 69 // Global flag that is used to indicate that we want to compile all the
70 // dart functions and not run anything. 70 // dart functions and not run anything.
71 static bool has_compile_all = false; 71 static bool has_compile_all = false;
72 72
73 73
74 // Global flag that is used to indicate that we want to compile all the 74 // Global flag that is used to indicate that we want to compile all the
75 // dart functions before running main and not compile anything thereafter. 75 // dart functions before running main and not compile anything thereafter.
76 static bool has_precompile = false; 76 static bool has_precompile = false;
77 77
78 78
79 // Global flag that is used to indicate that we want to run from a precompiled
80 // snapshot.
81 static bool has_precompiled = false;
82
83
79 // Global flag that is used to indicate that we want to trace resolution of 84 // Global flag that is used to indicate that we want to trace resolution of
80 // URIs and the loading of libraries, parts and scripts. 85 // URIs and the loading of libraries, parts and scripts.
81 static bool has_trace_loading = false; 86 static bool has_trace_loading = false;
82 87
83 88
84 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1"; 89 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
85 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; 90 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
86 // VM Service options. 91 // VM Service options.
87 static bool start_vm_service = false; 92 static bool start_vm_service = false;
88 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; 93 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 ASSERT(arg != NULL); 299 ASSERT(arg != NULL);
295 if (*arg != '\0') { 300 if (*arg != '\0') {
296 return false; 301 return false;
297 } 302 }
298 has_precompile = true; 303 has_precompile = true;
299 vm_options->AddArgument("--precompile"); 304 vm_options->AddArgument("--precompile");
300 return true; 305 return true;
301 } 306 }
302 307
303 308
309 static bool ProcessPrecompiledOption(const char* arg,
310 CommandLineOptions* vm_options) {
311 ASSERT(arg != NULL);
312 if (*arg != '\0') {
313 return false;
314 }
315 has_precompiled = true;
316 vm_options->AddArgument("--precompile");
317 return true;
318 }
319
320
304 static bool ProcessDebugOption(const char* option_value, 321 static bool ProcessDebugOption(const char* option_value,
305 CommandLineOptions* vm_options) { 322 CommandLineOptions* vm_options) {
306 ASSERT(option_value != NULL); 323 ASSERT(option_value != NULL);
307 if (!ExtractPortAndIP(option_value, &debug_port, &debug_ip, 324 if (!ExtractPortAndIP(option_value, &debug_port, &debug_ip,
308 DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_IP)) { 325 DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_IP)) {
309 Log::PrintErr("unrecognized --debug option syntax. " 326 Log::PrintErr("unrecognized --debug option syntax. "
310 "Use --debug[:<port number>[/<IPv4 address>]]\n"); 327 "Use --debug[:<port number>[/<IPv4 address>]]\n");
311 return false; 328 return false;
312 } 329 }
313 330
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 { "-h", ProcessHelpOption }, 422 { "-h", ProcessHelpOption },
406 { "--verbose", ProcessVerboseOption }, 423 { "--verbose", ProcessVerboseOption },
407 { "-v", ProcessVerboseOption }, 424 { "-v", ProcessVerboseOption },
408 { "--package-root=", ProcessPackageRootOption }, 425 { "--package-root=", ProcessPackageRootOption },
409 { "--packages=", ProcessPackagesOption }, 426 { "--packages=", ProcessPackagesOption },
410 { "-D", ProcessEnvironmentOption }, 427 { "-D", ProcessEnvironmentOption },
411 // VM specific options to the standalone dart program. 428 // VM specific options to the standalone dart program.
412 { "--break-at=", ProcessBreakpointOption }, 429 { "--break-at=", ProcessBreakpointOption },
413 { "--compile_all", ProcessCompileAllOption }, 430 { "--compile_all", ProcessCompileAllOption },
414 { "--precompile", ProcessPrecompileOption }, 431 { "--precompile", ProcessPrecompileOption },
432 { "--precompiled", ProcessPrecompiledOption },
415 { "--debug", ProcessDebugOption }, 433 { "--debug", ProcessDebugOption },
416 { "--snapshot=", ProcessGenScriptSnapshotOption }, 434 { "--snapshot=", ProcessGenScriptSnapshotOption },
417 { "--enable-vm-service", ProcessEnableVmServiceOption }, 435 { "--enable-vm-service", ProcessEnableVmServiceOption },
418 { "--observe", ProcessObserveOption }, 436 { "--observe", ProcessObserveOption },
419 { "--trace-debug-protocol", ProcessTraceDebugProtocolOption }, 437 { "--trace-debug-protocol", ProcessTraceDebugProtocolOption },
420 { "--trace-loading", ProcessTraceLoadingOption}, 438 { "--trace-loading", ProcessTraceLoadingOption},
421 { NULL, NULL } 439 { NULL, NULL }
422 }; 440 };
423 441
424 442
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 static void ServiceStreamCancelCallback(const char* stream_id) { 970 static void ServiceStreamCancelCallback(const char* stream_id) {
953 if (strcmp(stream_id, kStdoutStreamId) == 0) { 971 if (strcmp(stream_id, kStdoutStreamId) == 0) {
954 capture_stdout = false; 972 capture_stdout = false;
955 } else if (strcmp(stream_id, kStderrStreamId) == 0) { 973 } else if (strcmp(stream_id, kStderrStreamId) == 0) {
956 capture_stderr = false; 974 capture_stderr = false;
957 } 975 }
958 capture_stdio = (capture_stdout || capture_stderr); 976 capture_stdio = (capture_stdout || capture_stderr);
959 } 977 }
960 978
961 979
980 static void WriteSnapshotFile(const char* filename,
981 const uint8_t* buffer,
982 const intptr_t size) {
983 File* file = File::Open(filename, File::kWriteTruncate);
984 ASSERT(file != NULL);
985 if (!file->WriteFully(buffer, size)) {
986 Log::PrintErr("Error: Failed to write snapshot file.\n\n");
987 }
988 delete file;
989 }
990
991
962 void main(int argc, char** argv) { 992 void main(int argc, char** argv) {
963 char* script_name; 993 char* script_name;
964 const int EXTRA_VM_ARGUMENTS = 2; 994 const int EXTRA_VM_ARGUMENTS = 2;
965 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); 995 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
966 CommandLineOptions dart_options(argc); 996 CommandLineOptions dart_options(argc);
967 bool print_flags_seen = false; 997 bool print_flags_seen = false;
968 bool verbose_debug_seen = false; 998 bool verbose_debug_seen = false;
969 999
970 vm_options.AddArgument("--no_write_protect_code"); 1000 vm_options.AddArgument("--no_write_protect_code");
971 // Perform platform specific initialization. 1001 // Perform platform specific initialization.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 ASSERT(debug_port >= 0); 1055 ASSERT(debug_port >= 0);
1026 bool print_msg = verbose_debug_seen || (debug_port == 0); 1056 bool print_msg = verbose_debug_seen || (debug_port == 0);
1027 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); 1057 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port);
1028 if (print_msg) { 1058 if (print_msg) {
1029 Log::Print("Debugger listening on port %d\n", debug_port); 1059 Log::Print("Debugger listening on port %d\n", debug_port);
1030 } 1060 }
1031 } else { 1061 } else {
1032 DebuggerConnectionHandler::InitForVmService(); 1062 DebuggerConnectionHandler::InitForVmService();
1033 } 1063 }
1034 1064
1065 const uint8_t* instructions_snapshot = NULL;
1066 if (has_precompiled) {
rmacnak 2015/08/27 00:22:29 For now, load everything from files. The embedder
1067 const char* kPrecompiledLibName = "libprecompiled.so";
1068 const char* kPrecompiledSymName = "kInstructionsSnapshot";
1069 const char* kPrecompiledVmIsolateName = "precompiled.vmisolate";
1070 const char* kPrecompiledIsolateName = "precompiled.isolate";
1071
1072 void* precompiled_lib =
1073 Extensions::LoadExtensionLibrary(kPrecompiledLibName);
1074 if (precompiled_lib == NULL) {
1075 fprintf(stderr, "Failed to load library '%s'\n", kPrecompiledLibName);
1076 fflush(stderr);
1077 exit(kErrorExitCode);
1078 }
1079
1080 instructions_snapshot = reinterpret_cast<const uint8_t*>(
1081 Extensions::ResolveSymbol(precompiled_lib, kPrecompiledSymName));
1082 if (instructions_snapshot == NULL) {
1083 fprintf(stderr, "Failed to load symbol '%s'\n", kPrecompiledSymName);
1084 fflush(stderr);
1085 exit(kErrorExitCode);
1086 }
1087
1088 void* file = DartUtils::OpenFile(kPrecompiledVmIsolateName, false);
1089 if (file == NULL) {
1090 fprintf(stderr, "Failed to open '%s'\n", kPrecompiledVmIsolateName);
1091 fflush(stderr);
1092 exit(kErrorExitCode);
1093 }
1094 intptr_t len = -1;
1095 DartUtils::ReadFile(&vm_isolate_snapshot_buffer, &len, file);
1096 if (vm_isolate_snapshot_buffer == NULL || len == -1) {
1097 fprintf(stderr, "Failed to read '%s'\n", kPrecompiledVmIsolateName);
1098 fflush(stderr);
1099 exit(kErrorExitCode);
1100 }
1101 DartUtils::CloseFile(file);
1102
1103 file = DartUtils::OpenFile(kPrecompiledIsolateName, false);
1104 if (file == NULL) {
1105 fprintf(stderr, "Failed to open '%s'\n", kPrecompiledIsolateName);
1106 fflush(stderr);
1107 exit(kErrorExitCode);
1108 }
1109 len = -1;
1110 DartUtils::ReadFile(&isolate_snapshot_buffer, &len, file);
1111 if (isolate_snapshot_buffer == NULL || len == -1) {
1112 fprintf(stderr, "Failed to read '%s'\n", kPrecompiledVmIsolateName);
1113 fflush(stderr);
1114 exit(kErrorExitCode);
1115 }
1116 DartUtils::CloseFile(file);
1117 }
1118
1035 // Initialize the Dart VM. 1119 // Initialize the Dart VM.
1036 if (!Dart_Initialize(vm_isolate_snapshot_buffer, NULL, 1120 if (!Dart_Initialize(vm_isolate_snapshot_buffer, instructions_snapshot,
1037 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, 1121 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate,
1038 DartUtils::OpenFile, 1122 DartUtils::OpenFile,
1039 DartUtils::ReadFile, 1123 DartUtils::ReadFile,
1040 DartUtils::WriteFile, 1124 DartUtils::WriteFile,
1041 DartUtils::CloseFile, 1125 DartUtils::CloseFile,
1042 DartUtils::EntropySource)) { 1126 DartUtils::EntropySource)) {
1043 fprintf(stderr, "%s", "VM initialization failed\n"); 1127 fprintf(stderr, "%s", "VM initialization failed\n");
1044 fflush(stderr); 1128 fflush(stderr);
1045 exit(kErrorExitCode); 1129 exit(kErrorExitCode);
1046 } 1130 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 // Import the root library into the builtin library so that we can easily 1191 // Import the root library into the builtin library so that we can easily
1108 // lookup the main entry point exported from the root library. 1192 // lookup the main entry point exported from the root library.
1109 Dart_Handle builtin_lib = 1193 Dart_Handle builtin_lib =
1110 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); 1194 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
1111 ASSERT(!Dart_IsError(builtin_lib)); 1195 ASSERT(!Dart_IsError(builtin_lib));
1112 result = Dart_LibraryImportLibrary(builtin_lib, root_lib, Dart_Null()); 1196 result = Dart_LibraryImportLibrary(builtin_lib, root_lib, Dart_Null());
1113 1197
1114 if (has_precompile) { 1198 if (has_precompile) {
1115 result = Dart_Precompile(); 1199 result = Dart_Precompile();
1116 DartExitOnError(result); 1200 DartExitOnError(result);
1201
1202 uint8_t* vm_isolate_buffer = NULL;
1203 intptr_t vm_isolate_size = 0;
1204 uint8_t* isolate_buffer = NULL;
1205 intptr_t isolate_size = 0;
1206 uint8_t* instructions_buffer = NULL;
1207 intptr_t instructions_size = 0;
1208 result = Dart_CreatePrecompiledSnapshot(&vm_isolate_buffer,
1209 &vm_isolate_size,
1210 &isolate_buffer,
1211 &isolate_size,
1212 &instructions_buffer,
1213 &instructions_size);
1214
1215 DartExitOnError(result);
1216
1217 WriteSnapshotFile("precompiled.vmisolate",
1218 vm_isolate_buffer,
1219 vm_isolate_size);
1220 WriteSnapshotFile("precompiled.isolate",
1221 isolate_buffer,
1222 isolate_size);
1223 WriteSnapshotFile("precompiled.instructions",
1224 instructions_buffer,
1225 instructions_size);
1226
1117 } else if (has_compile_all) { 1227 } else if (has_compile_all) {
1118 result = Dart_CompileAll(); 1228 result = Dart_CompileAll();
1119 DartExitOnError(result); 1229 DartExitOnError(result);
1120 } 1230 }
1121 1231
1122 if (Dart_IsNull(root_lib)) { 1232 if (Dart_IsNull(root_lib)) {
1123 ErrorExit(kErrorExitCode, 1233 ErrorExit(kErrorExitCode,
1124 "Unable to find root library for '%s'\n", 1234 "Unable to find root library for '%s'\n",
1125 script_name); 1235 script_name);
1126 } 1236 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 exit(Process::GlobalExitCode()); 1300 exit(Process::GlobalExitCode());
1191 } 1301 }
1192 1302
1193 } // namespace bin 1303 } // namespace bin
1194 } // namespace dart 1304 } // namespace dart
1195 1305
1196 int main(int argc, char** argv) { 1306 int main(int argc, char** argv) {
1197 dart::bin::main(argc, argv); 1307 dart::bin::main(argc, argv);
1198 UNREACHABLE(); 1308 UNREACHABLE();
1199 } 1309 }
OLDNEW
« no previous file with comments | « runtime/bin/extensions.h ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698