OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 // Generate a snapshot file after loading all the scripts specified on the | 5 // Generate a snapshot file after loading all the scripts specified on the |
6 // command line. | 6 // command line. |
7 | 7 |
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 23 matching lines...) Expand all Loading... |
34 Dart_ShutdownIsolate(); \ | 34 Dart_ShutdownIsolate(); \ |
35 exit(255); \ | 35 exit(255); \ |
36 } \ | 36 } \ |
37 | 37 |
38 | 38 |
39 // Global state that indicates whether a snapshot is to be created and | 39 // Global state that indicates whether a snapshot is to be created and |
40 // if so which file to write the snapshot into. | 40 // if so which file to write the snapshot into. |
41 static const char* vm_isolate_snapshot_filename = NULL; | 41 static const char* vm_isolate_snapshot_filename = NULL; |
42 static const char* isolate_snapshot_filename = NULL; | 42 static const char* isolate_snapshot_filename = NULL; |
43 static const char* instructions_snapshot_filename = NULL; | 43 static const char* instructions_snapshot_filename = NULL; |
44 static const char* embedder_entry_points_manifest = NULL; | |
45 static const char* package_root = NULL; | 44 static const char* package_root = NULL; |
46 | 45 |
47 | 46 |
48 // Global state which contains a pointer to the script name for which | 47 // Global state which contains a pointer to the script name for which |
49 // a snapshot needs to be created (NULL would result in the creation | 48 // a snapshot needs to be created (NULL would result in the creation |
50 // of a generic snapshot that contains only the corelibs). | 49 // of a generic snapshot that contains only the corelibs). |
51 static char* app_script_name = NULL; | 50 static char* app_script_name = NULL; |
52 | 51 |
53 | 52 |
54 // Global state that captures the URL mappings specified on the command line. | 53 // Global state that captures the URL mappings specified on the command line. |
55 static CommandLineOptions* url_mapping = NULL; | 54 static CommandLineOptions* url_mapping = NULL; |
56 | 55 |
| 56 // Global state that captures the entry point manifest files specified on the |
| 57 // command line. |
| 58 static CommandLineOptions* entry_points_files = NULL; |
| 59 |
57 static bool IsValidFlag(const char* name, | 60 static bool IsValidFlag(const char* name, |
58 const char* prefix, | 61 const char* prefix, |
59 intptr_t prefix_length) { | 62 intptr_t prefix_length) { |
60 intptr_t name_length = strlen(name); | 63 intptr_t name_length = strlen(name); |
61 return ((name_length > prefix_length) && | 64 return ((name_length > prefix_length) && |
62 (strncmp(name, prefix, prefix_length) == 0)); | 65 (strncmp(name, prefix, prefix_length) == 0)); |
63 } | 66 } |
64 | 67 |
65 | 68 |
66 static const char* ProcessOption(const char* option, const char* name) { | 69 static const char* ProcessOption(const char* option, const char* name) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 instructions_snapshot_filename = name; | 101 instructions_snapshot_filename = name; |
99 return true; | 102 return true; |
100 } | 103 } |
101 return false; | 104 return false; |
102 } | 105 } |
103 | 106 |
104 | 107 |
105 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { | 108 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { |
106 const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); | 109 const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); |
107 if (name != NULL) { | 110 if (name != NULL) { |
108 embedder_entry_points_manifest = name; | 111 entry_points_files->AddArgument(name); |
109 return true; | 112 return true; |
110 } | 113 } |
111 return false; | 114 return false; |
112 } | 115 } |
113 | 116 |
114 | 117 |
115 static bool ProcessPackageRootOption(const char* option) { | 118 static bool ProcessPackageRootOption(const char* option) { |
116 const char* name = ProcessOption(option, "--package_root="); | 119 const char* name = ProcessOption(option, "--package_root="); |
| 120 if (name == NULL) { |
| 121 name = ProcessOption(option, "--package-root="); |
| 122 } |
117 if (name != NULL) { | 123 if (name != NULL) { |
118 package_root = name; | 124 package_root = name; |
119 return true; | 125 return true; |
120 } | 126 } |
121 return false; | 127 return false; |
122 } | 128 } |
123 | 129 |
124 | 130 |
125 static bool ProcessURLmappingOption(const char* option) { | 131 static bool ProcessURLmappingOption(const char* option) { |
126 const char* mapping = ProcessOption(option, "--url_mapping="); | 132 const char* mapping = ProcessOption(option, "--url_mapping="); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 Log::PrintErr("No vm isolate snapshot output file specified.\n\n"); | 180 Log::PrintErr("No vm isolate snapshot output file specified.\n\n"); |
175 return -1; | 181 return -1; |
176 } | 182 } |
177 | 183 |
178 if (isolate_snapshot_filename == NULL) { | 184 if (isolate_snapshot_filename == NULL) { |
179 Log::PrintErr("No isolate snapshot output file specified.\n\n"); | 185 Log::PrintErr("No isolate snapshot output file specified.\n\n"); |
180 return -1; | 186 return -1; |
181 } | 187 } |
182 | 188 |
183 if ((instructions_snapshot_filename != NULL) && | 189 if ((instructions_snapshot_filename != NULL) && |
184 (embedder_entry_points_manifest == NULL)) { | 190 (entry_points_files->count() == 0)) { |
185 Log::PrintErr( | 191 Log::PrintErr( |
186 "Specifying an instructions snapshot filename indicates precompilation" | 192 "Specifying an instructions snapshot filename indicates precompilation" |
187 ". But no embedder entry points manifest was specified.\n\n"); | 193 ". But no embedder entry points manifest was specified.\n\n"); |
188 return -1; | 194 return -1; |
189 } | 195 } |
190 | 196 |
191 if ((embedder_entry_points_manifest != NULL) && | 197 if ((entry_points_files->count() > 0) && |
192 (instructions_snapshot_filename == NULL)) { | 198 (instructions_snapshot_filename == NULL)) { |
193 Log::PrintErr( | 199 Log::PrintErr( |
194 "Specifying the embedder entry points manifest indicates " | 200 "Specifying the embedder entry points manifest indicates " |
195 "precompilation. But no instuctions snapshot was specified.\n\n"); | 201 "precompilation. But no instuctions snapshot was specified.\n\n"); |
196 return -1; | 202 return -1; |
197 } | 203 } |
198 | 204 |
199 return 0; | 205 return 0; |
200 } | 206 } |
201 | 207 |
202 | 208 |
203 static bool IsSnapshottingForPrecompilation(void) { | 209 static bool IsSnapshottingForPrecompilation(void) { |
204 return embedder_entry_points_manifest != NULL && | 210 return (entry_points_files->count() > 0) && |
205 instructions_snapshot_filename != NULL; | 211 (instructions_snapshot_filename != NULL); |
206 } | 212 } |
207 | 213 |
208 | 214 |
209 static void WriteSnapshotFile(const char* filename, | 215 static void WriteSnapshotFile(const char* filename, |
210 const uint8_t* buffer, | 216 const uint8_t* buffer, |
211 const intptr_t size) { | 217 const intptr_t size) { |
212 File* file = File::Open(filename, File::kWriteTruncate); | 218 File* file = File::Open(filename, File::kWriteTruncate); |
213 ASSERT(file != NULL); | 219 ASSERT(file != NULL); |
214 if (!file->WriteFully(buffer, size)) { | 220 if (!file->WriteFully(buffer, size)) { |
215 Log::PrintErr("Error: Failed to write snapshot file.\n\n"); | 221 Log::PrintErr("Error: Failed to write snapshot file.\n\n"); |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 | 780 |
775 entries++; | 781 entries++; |
776 } | 782 } |
777 | 783 |
778 free(line); | 784 free(line); |
779 | 785 |
780 return entries; | 786 return entries; |
781 } | 787 } |
782 | 788 |
783 | 789 |
784 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( | 790 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() { |
785 const char* path) { | 791 // Total number of entries across all manifest files. |
786 if (path == NULL) { | 792 int64_t entry_count = 0; |
787 return NULL; | 793 |
| 794 // Parse the files once but don't store the results. This is done to first |
| 795 // determine the number of entries in the manifest |
| 796 for (intptr_t i = 0; i < entry_points_files->count(); i++) { |
| 797 const char* path = entry_points_files->GetArgument(i); |
| 798 |
| 799 FILE* file = fopen(path, "r"); |
| 800 |
| 801 if (file == NULL) { |
| 802 Log::PrintErr("Could not open entry points manifest file `%s`\n", path); |
| 803 return NULL; |
| 804 } |
| 805 |
| 806 int64_t entries = ParseEntryPointsManifestLines(file, NULL); |
| 807 fclose(file); |
| 808 |
| 809 if (entries <= 0) { |
| 810 Log::PrintErr( |
| 811 "Manifest file `%s` specified is invalid or contained no entries\n", |
| 812 path); |
| 813 return NULL; |
| 814 } |
| 815 |
| 816 entry_count += entries; |
788 } | 817 } |
789 | 818 |
790 FILE* file = fopen(path, "r"); | |
791 | |
792 if (file == NULL) { | |
793 Log::PrintErr("Could not open entry points manifest file\n"); | |
794 return NULL; | |
795 } | |
796 | |
797 // Parse the file once but don't store the results. This is done to first | |
798 // determine the number of entries in the manifest | |
799 int64_t entry_count = ParseEntryPointsManifestLines(file, NULL); | |
800 | |
801 if (entry_count <= 0) { | |
802 Log::PrintErr( | |
803 "Manifest file specified is invalid or contained no entries\n"); | |
804 fclose(file); | |
805 return NULL; | |
806 } | |
807 | |
808 rewind(file); | |
809 | |
810 // Allocate enough storage for the entries in the file plus a termination | 819 // Allocate enough storage for the entries in the file plus a termination |
811 // sentinel and parse it again to populate the allocation | 820 // sentinel and parse it again to populate the allocation |
812 Dart_QualifiedFunctionName* entries = | 821 Dart_QualifiedFunctionName* entries = |
813 reinterpret_cast<Dart_QualifiedFunctionName*>( | 822 reinterpret_cast<Dart_QualifiedFunctionName*>( |
814 calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); | 823 calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); |
815 | 824 |
816 int64_t parsed_entry_count = ParseEntryPointsManifestLines(file, entries); | 825 int64_t parsed_entry_count = 0; |
| 826 for (intptr_t i = 0; i < entry_points_files->count(); i++) { |
| 827 const char* path = entry_points_files->GetArgument(i); |
| 828 FILE* file = fopen(path, "r"); |
| 829 parsed_entry_count += |
| 830 ParseEntryPointsManifestLines(file, &entries[parsed_entry_count]); |
| 831 fclose(file); |
| 832 } |
| 833 |
817 ASSERT(parsed_entry_count == entry_count); | 834 ASSERT(parsed_entry_count == entry_count); |
818 | 835 |
819 fclose(file); | |
820 | |
821 // The entries allocation must be explicitly cleaned up via | 836 // The entries allocation must be explicitly cleaned up via |
822 // |CleanupEntryPointsCollection| | 837 // |CleanupEntryPointsCollection| |
823 return entries; | 838 return entries; |
824 } | 839 } |
825 | 840 |
826 | 841 |
827 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { | 842 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { |
828 Dart_QualifiedFunctionName* entries = | 843 Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles(); |
829 ParseEntryPointsManifestFile(embedder_entry_points_manifest); | |
830 if ((entries == NULL) && IsSnapshottingForPrecompilation()) { | 844 if ((entries == NULL) && IsSnapshottingForPrecompilation()) { |
831 Log::PrintErr( | 845 Log::PrintErr( |
832 "Could not find native embedder entry points during precompilation\n"); | 846 "Could not find native embedder entry points during precompilation\n"); |
833 exit(255); | 847 exit(255); |
834 } | 848 } |
835 return entries; | 849 return entries; |
836 } | 850 } |
837 | 851 |
838 | 852 |
839 static void CreateAndWriteSnapshot() { | 853 static void CreateAndWriteSnapshot() { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 | 1005 |
992 | 1006 |
993 int main(int argc, char** argv) { | 1007 int main(int argc, char** argv) { |
994 const int EXTRA_VM_ARGUMENTS = 2; | 1008 const int EXTRA_VM_ARGUMENTS = 2; |
995 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); | 1009 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); |
996 | 1010 |
997 // Initialize the URL mapping array. | 1011 // Initialize the URL mapping array. |
998 CommandLineOptions url_mapping_array(argc); | 1012 CommandLineOptions url_mapping_array(argc); |
999 url_mapping = &url_mapping_array; | 1013 url_mapping = &url_mapping_array; |
1000 | 1014 |
| 1015 // Initialize the entrypoints array. |
| 1016 CommandLineOptions entry_points_files_array(argc); |
| 1017 entry_points_files = &entry_points_files_array; |
| 1018 |
1001 // Parse command line arguments. | 1019 // Parse command line arguments. |
1002 if (ParseArguments(argc, | 1020 if (ParseArguments(argc, |
1003 argv, | 1021 argv, |
1004 &vm_options, | 1022 &vm_options, |
1005 &app_script_name) < 0) { | 1023 &app_script_name) < 0) { |
1006 PrintUsage(); | 1024 PrintUsage(); |
1007 return 255; | 1025 return 255; |
1008 } | 1026 } |
1009 | 1027 |
1010 Thread::InitOnce(); | 1028 Thread::InitOnce(); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1152 EventHandler::Stop(); | 1170 EventHandler::Stop(); |
1153 return 0; | 1171 return 0; |
1154 } | 1172 } |
1155 | 1173 |
1156 } // namespace bin | 1174 } // namespace bin |
1157 } // namespace dart | 1175 } // namespace dart |
1158 | 1176 |
1159 int main(int argc, char** argv) { | 1177 int main(int argc, char** argv) { |
1160 return dart::bin::main(argc, argv); | 1178 return dart::bin::main(argc, argv); |
1161 } | 1179 } |
OLD | NEW |