| // Copyright 2017 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fstream> |
| #include <iostream> |
| |
| #include "src/torque/declarable.h" |
| #include "src/torque/declaration-visitor.h" |
| #include "src/torque/global-context.h" |
| #include "src/torque/implementation-visitor.h" |
| #include "src/torque/scope.h" |
| #include "src/torque/torque-parser.h" |
| #include "src/torque/type-oracle.h" |
| #include "src/torque/types.h" |
| #include "src/torque/utils.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace torque { |
| |
| int WrappedMain(int argc, const char** argv) { |
| std::string output_directory; |
| bool verbose = false; |
| SourceFileMap::Scope source_file_map_scope; |
| CurrentSourceFile::Scope unknown_sourcefile_scope( |
| SourceFileMap::AddSource("<unknown>")); |
| CurrentAst::Scope ast_scope; |
| for (int i = 1; i < argc; ++i) { |
| // Check for options |
| if (!strcmp("-o", argv[i])) { |
| output_directory = argv[++i]; |
| continue; |
| } |
| if (!strcmp("-v", argv[i])) { |
| verbose = true; |
| continue; |
| } |
| |
| // Otherwise it's a .tq |
| // file, parse it and |
| // remember the syntax tree |
| std::string path = argv[i]; |
| SourceId source_id = SourceFileMap::AddSource(path); |
| CurrentSourceFile::Scope source_id_scope(source_id); |
| std::ifstream file_stream(path); |
| std::string file_content = {std::istreambuf_iterator<char>(file_stream), |
| std::istreambuf_iterator<char>()}; |
| ParseTorque(file_content); |
| } |
| |
| GlobalContext global_context(std::move(CurrentAst::Get())); |
| if (verbose) global_context.SetVerbose(); |
| TypeOracle::Scope type_oracle(global_context.declarations()); |
| |
| if (output_directory.length() != 0) { |
| { |
| DeclarationVisitor visitor(global_context); |
| |
| visitor.Visit(global_context.ast()); |
| |
| std::string output_header_path = output_directory; |
| output_header_path += "/builtin-definitions-from-dsl.h"; |
| visitor.GenerateHeader(output_header_path); |
| } |
| |
| ImplementationVisitor visitor(global_context); |
| for (auto& module : global_context.GetModules()) { |
| visitor.BeginModuleFile(module.second.get()); |
| } |
| |
| visitor.Visit(global_context.ast()); |
| |
| for (auto& module : global_context.GetModules()) { |
| visitor.EndModuleFile(module.second.get()); |
| visitor.GenerateImplementation(output_directory, module.second.get()); |
| } |
| } |
| return 0; |
| } |
| |
| } // namespace torque |
| } // namespace internal |
| } // namespace v8 |
| |
| int main(int argc, const char** argv) { |
| return v8::internal::torque::WrappedMain(argc, argv); |
| } |