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 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 if (DartUtils::IsDartBuiltinLibURL(url)) { | 709 if (DartUtils::IsDartBuiltinLibURL(url)) { |
710 return Builtin::kBuiltinLibrary; | 710 return Builtin::kBuiltinLibrary; |
711 } | 711 } |
712 if (DartUtils::IsDartIOLibURL(url)) { | 712 if (DartUtils::IsDartIOLibURL(url)) { |
713 return Builtin::kIOLibrary; | 713 return Builtin::kIOLibrary; |
714 } | 714 } |
715 return Builtin::kInvalidLibrary; | 715 return Builtin::kInvalidLibrary; |
716 } | 716 } |
717 | 717 |
718 | 718 |
719 static bool WriteDependencies(const char* target, | 719 // Generates a depfile like gcc -M -MF. Must be consumable by Ninja. |
720 File* file, | 720 class DependenciesFileWriter : public ValueObject { |
721 MallocGrowableArray<char*>* dependencies) { | 721 public: |
722 bool success = true; | 722 DependenciesFileWriter() : dependencies_(NULL), file_(NULL), success_(true) {} |
723 success &= file->Print("%s: ", target); | |
724 | 723 |
725 if (snapshot_kind == kScript) { | 724 void WriteDependencies(MallocGrowableArray<char*>* dependencies) { |
726 if (vm_snapshot_data_filename != NULL) { | 725 dependencies_ = dependencies; |
727 success &= file->Print("%s ", vm_snapshot_data_filename); | |
728 } | |
729 if (vm_snapshot_instructions_filename != NULL) { | |
730 success &= file->Print("%s ", vm_snapshot_instructions_filename); | |
731 } | |
732 if (isolate_snapshot_data_filename != NULL) { | |
733 success &= file->Print("%s ", isolate_snapshot_data_filename); | |
734 } | |
735 if (isolate_snapshot_instructions_filename != NULL) { | |
736 success &= file->Print("%s ", isolate_snapshot_instructions_filename); | |
737 } | |
738 } | |
739 | 726 |
740 for (intptr_t i = 0; i < dependencies->length(); i++) { | 727 file_ = File::Open(dependencies_filename, File::kWriteTruncate); |
741 success &= file->Print("%s ", dependencies->At(i)); | 728 if (file_ == NULL) { |
742 } | |
743 | |
744 success &= file->Print("\n"); | |
745 return success; | |
746 } | |
747 | |
748 | |
749 static void CreateAndWriteDependenciesFile() { | |
750 IsolateData* isolate_data = | |
751 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); | |
752 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); | |
753 if (dependencies == NULL) { | |
754 return; | |
755 } | |
756 | |
757 Loader::ResolveDependenciesAsFilePaths(); | |
758 | |
759 ASSERT((dependencies_filename != NULL) || print_dependencies); | |
760 if (dependencies_filename != NULL) { | |
761 bool success = true; | |
762 File* file = File::Open(dependencies_filename, File::kWriteTruncate); | |
763 if (file == NULL) { | |
764 Log::PrintErr("Error: Unable to open dependencies file: %s\n\n", | 729 Log::PrintErr("Error: Unable to open dependencies file: %s\n\n", |
765 dependencies_filename); | 730 dependencies_filename); |
766 exit(kErrorExitCode); | 731 exit(kErrorExitCode); |
767 } | 732 } |
768 | 733 |
769 // Write dependencies for one of the output files. | 734 // Write dependencies for one of the output files. |
770 // TODO(https://github.com/ninja-build/ninja/issues/1184): Do this for all | 735 // TODO(https://github.com/ninja-build/ninja/issues/1184): Do this for all |
771 // output files. | 736 // output files. |
772 switch (snapshot_kind) { | 737 switch (snapshot_kind) { |
773 case kCore: | 738 case kCore: |
774 success &= | 739 WriteDependenciesWithTarget(vm_snapshot_data_filename); |
775 WriteDependencies(vm_snapshot_data_filename, file, dependencies); | 740 // WriteDependenciesWithTarget(isolate_snapshot_data_filename); |
776 // success &= WriteDependencies(isolate_snapshot_data_filename, file, | |
777 // dependencies); | |
778 break; | 741 break; |
779 case kScript: | 742 case kScript: |
780 success &= | 743 WriteDependenciesWithTarget(script_snapshot_filename); |
781 WriteDependencies(script_snapshot_filename, file, dependencies); | |
782 break; | 744 break; |
783 case kAppAOTAssembly: | 745 case kAppAOTAssembly: |
784 success &= WriteDependencies(assembly_filename, file, dependencies); | 746 WriteDependenciesWithTarget(assembly_filename); |
785 break; | 747 break; |
786 case kCoreJIT: | 748 case kCoreJIT: |
787 case kAppAOTBlobs: | 749 case kAppAOTBlobs: |
788 success &= | 750 WriteDependenciesWithTarget(vm_snapshot_data_filename); |
789 WriteDependencies(vm_snapshot_data_filename, file, dependencies); | 751 // WriteDependenciesWithTarget(vm_snapshot_instructions_filename); |
790 // success &= WriteDependencies(vm_snapshot_instructions_filename, file, | 752 // WriteDependenciesWithTarget(isolate_snapshot_data_filename); |
791 // dependencies); | 753 // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename); |
792 // success &= WriteDependencies(isolate_snapshot_data_filename, file, | |
793 // dependencies); | |
794 // success &= WriteDependencies(isolate_snapshot_instructions_filename, | |
795 // file, dependencies); | |
796 break; | 754 break; |
797 } | 755 } |
798 | 756 |
799 if (!success) { | 757 if (!success_) { |
800 Log::PrintErr("Error: Unable to write dependencies file: %s\n\n", | 758 Log::PrintErr("Error: Unable to write dependencies file: %s\n\n", |
801 dependencies_filename); | 759 dependencies_filename); |
802 exit(kErrorExitCode); | 760 exit(kErrorExitCode); |
803 } | 761 } |
804 file->Release(); | 762 file_->Release(); |
763 } | |
764 | |
765 private: | |
766 void WriteDependenciesWithTarget(const char* target) { | |
767 WritePath(target); | |
Chris Bracken
2017/07/01 00:47:54
It looks like we've just got one string for the ta
rmacnak
2017/07/05 16:51:04
Since all four files are generated by the same act
| |
768 Write(": "); | |
769 | |
770 if (snapshot_kind == kScript) { | |
771 if (vm_snapshot_data_filename != NULL) { | |
772 WritePath(vm_snapshot_data_filename); | |
773 } | |
774 if (vm_snapshot_instructions_filename != NULL) { | |
775 WritePath(vm_snapshot_instructions_filename); | |
776 } | |
777 if (isolate_snapshot_data_filename != NULL) { | |
778 WritePath(isolate_snapshot_data_filename); | |
779 } | |
780 if (isolate_snapshot_instructions_filename != NULL) { | |
781 WritePath(isolate_snapshot_instructions_filename); | |
782 } | |
783 } | |
784 | |
785 for (intptr_t i = 0; i < dependencies_->length(); i++) { | |
786 WritePath(dependencies_->At(i)); | |
787 } | |
788 | |
789 Write("\n"); | |
790 } | |
791 | |
792 char* EscapePath(const char* path) { | |
793 char* escaped_path = reinterpret_cast<char*>(malloc(strlen(path) * 2 + 1)); | |
794 const char* read_cursor = path; | |
795 char* write_cursor = escaped_path; | |
796 while (*read_cursor != '\0') { | |
797 if ((*read_cursor == ' ') || (*read_cursor == '\\')) { | |
798 *write_cursor++ = '\\'; | |
799 } | |
800 *write_cursor++ = *read_cursor++; | |
801 } | |
802 *write_cursor = '\0'; | |
803 return escaped_path; | |
804 } | |
805 | |
806 void WritePath(const char* path) { | |
807 char* escaped_path = EscapePath(path); | |
808 success_ &= file_->Print("%s ", escaped_path); | |
809 free(escaped_path); | |
810 } | |
811 | |
812 void Write(const char* string) { success_ &= file_->Print("%s", string); } | |
813 | |
814 MallocGrowableArray<char*>* dependencies_; | |
815 File* file_; | |
816 bool success_; | |
817 }; | |
818 | |
819 | |
820 static void CreateAndWriteDependenciesFile() { | |
821 IsolateData* isolate_data = | |
822 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); | |
823 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); | |
824 if (dependencies == NULL) { | |
825 return; | |
826 } | |
827 | |
828 Loader::ResolveDependenciesAsFilePaths(); | |
829 | |
830 ASSERT((dependencies_filename != NULL) || print_dependencies); | |
831 if (dependencies_filename != NULL) { | |
832 DependenciesFileWriter writer; | |
833 writer.WriteDependencies(dependencies); | |
805 } | 834 } |
806 | 835 |
807 if (print_dependencies) { | 836 if (print_dependencies) { |
808 Log::Print("%s\n", vm_snapshot_data_filename); | 837 Log::Print("%s\n", vm_snapshot_data_filename); |
809 if (snapshot_kind == kScript) { | 838 if (snapshot_kind == kScript) { |
810 if (vm_snapshot_data_filename != NULL) { | 839 if (vm_snapshot_data_filename != NULL) { |
811 Log::Print("%s\n", vm_snapshot_data_filename); | 840 Log::Print("%s\n", vm_snapshot_data_filename); |
812 } | 841 } |
813 if (vm_snapshot_instructions_filename != NULL) { | 842 if (vm_snapshot_instructions_filename != NULL) { |
814 Log::Print("%s\n", vm_snapshot_instructions_filename); | 843 Log::Print("%s\n", vm_snapshot_instructions_filename); |
(...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1868 delete mapped_isolate_snapshot_instructions; | 1897 delete mapped_isolate_snapshot_instructions; |
1869 return 0; | 1898 return 0; |
1870 } | 1899 } |
1871 | 1900 |
1872 } // namespace bin | 1901 } // namespace bin |
1873 } // namespace dart | 1902 } // namespace dart |
1874 | 1903 |
1875 int main(int argc, char** argv) { | 1904 int main(int argc, char** argv) { |
1876 return dart::bin::main(argc, argv); | 1905 return dart::bin::main(argc, argv); |
1877 } | 1906 } |
OLD | NEW |