1257b2971SCaroline Concatto //===--- ExecuteCompilerInvocation.cpp ------------------------------------===// 2257b2971SCaroline Concatto // 3257b2971SCaroline Concatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4257b2971SCaroline Concatto // See https://llvm.org/LICENSE.txt for license information. 5257b2971SCaroline Concatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6257b2971SCaroline Concatto // 7257b2971SCaroline Concatto //===----------------------------------------------------------------------===// 8257b2971SCaroline Concatto // 9257b2971SCaroline Concatto // This file holds ExecuteCompilerInvocation(). It is split into its own file to 10257b2971SCaroline Concatto // minimize the impact of pulling in essentially everything else in Flang. 11257b2971SCaroline Concatto // 12257b2971SCaroline Concatto //===----------------------------------------------------------------------===// 13257b2971SCaroline Concatto 14257b2971SCaroline Concatto #include "flang/Frontend/CompilerInstance.h" 154c5906cfSCaroline Concatto #include "flang/Frontend/FrontendActions.h" 16257b2971SCaroline Concatto #include "clang/Driver/Options.h" 17257b2971SCaroline Concatto #include "llvm/Option/OptTable.h" 184c5906cfSCaroline Concatto #include "llvm/Option/Option.h" 194c5906cfSCaroline Concatto #include "llvm/Support/BuryPointer.h" 20257b2971SCaroline Concatto #include "llvm/Support/CommandLine.h" 21257b2971SCaroline Concatto 22257b2971SCaroline Concatto namespace Fortran::frontend { 234c5906cfSCaroline Concatto 244c5906cfSCaroline Concatto static std::unique_ptr<FrontendAction> CreateFrontendBaseAction( 254c5906cfSCaroline Concatto CompilerInstance &ci) { 264c5906cfSCaroline Concatto 279ffb5b04SAndrzej Warzynski ActionKind ak = ci.frontendOpts().programAction_; 284c5906cfSCaroline Concatto switch (ak) { 294c5906cfSCaroline Concatto case InputOutputTest: 304c5906cfSCaroline Concatto return std::make_unique<InputOutputTestAction>(); 314c5906cfSCaroline Concatto break; 32d28de0d7SCaroline Concatto case PrintPreprocessedInput: 33d28de0d7SCaroline Concatto return std::make_unique<PrintPreprocessedAction>(); 34d28de0d7SCaroline Concatto break; 357d246cb1SAndrzej Warzynski case ParseSyntaxOnly: 367d246cb1SAndrzej Warzynski return std::make_unique<ParseSyntaxOnlyAction>(); 37e5cdb6c5SAndrzej Warzynski case EmitObj: 38e5cdb6c5SAndrzej Warzynski return std::make_unique<EmitObjAction>(); 397d246cb1SAndrzej Warzynski break; 4096d229c9SAndrzej Warzynski case DebugUnparse: 4196d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseAction>(); 4296d229c9SAndrzej Warzynski break; 4396d229c9SAndrzej Warzynski case DebugUnparseWithSymbols: 4496d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseWithSymbolsAction>(); 4596d229c9SAndrzej Warzynski break; 464bd08dabSFaris Rehman case DebugDumpSymbols: 474bd08dabSFaris Rehman return std::make_unique<DebugDumpSymbolsAction>(); 484bd08dabSFaris Rehman break; 494bd08dabSFaris Rehman case DebugDumpParseTree: 504bd08dabSFaris Rehman return std::make_unique<DebugDumpParseTreeAction>(); 514bd08dabSFaris Rehman break; 524bd08dabSFaris Rehman case DebugDumpProvenance: 534bd08dabSFaris Rehman return std::make_unique<DebugDumpProvenanceAction>(); 544bd08dabSFaris Rehman break; 55523d7bc6SAndrzej Warzynski case DebugDumpParsingLog: 56523d7bc6SAndrzej Warzynski return std::make_unique<DebugDumpParsingLogAction>(); 57523d7bc6SAndrzej Warzynski break; 58529f7181SFaris Rehman case DebugMeasureParseTree: 59529f7181SFaris Rehman return std::make_unique<DebugMeasureParseTreeAction>(); 60529f7181SFaris Rehman break; 61529f7181SFaris Rehman case DebugPreFIRTree: 62529f7181SFaris Rehman return std::make_unique<DebugPreFIRTreeAction>(); 63529f7181SFaris Rehman break; 64*eefda605SAndrzej Warzynski case GetSymbolsSources: 65*eefda605SAndrzej Warzynski return std::make_unique<GetSymbolsSourcesAction>(); 66*eefda605SAndrzej Warzynski break; 674c5906cfSCaroline Concatto default: 684c5906cfSCaroline Concatto break; 694c5906cfSCaroline Concatto // TODO: 704c5906cfSCaroline Concatto // case RunPreprocessor: 714c5906cfSCaroline Concatto // case ParserSyntaxOnly: 724c5906cfSCaroline Concatto // case EmitLLVM: 734c5906cfSCaroline Concatto // case EmitLLVMOnly: 744c5906cfSCaroline Concatto // case EmitCodeGenOnly: 754c5906cfSCaroline Concatto // (...) 764c5906cfSCaroline Concatto } 774c5906cfSCaroline Concatto return 0; 784c5906cfSCaroline Concatto } 794c5906cfSCaroline Concatto 804c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) { 814c5906cfSCaroline Concatto // Create the underlying action. 824c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act = CreateFrontendBaseAction(ci); 834c5906cfSCaroline Concatto if (!act) 844c5906cfSCaroline Concatto return nullptr; 854c5906cfSCaroline Concatto 864c5906cfSCaroline Concatto return act; 874c5906cfSCaroline Concatto } 88257b2971SCaroline Concatto bool ExecuteCompilerInvocation(CompilerInstance *flang) { 89257b2971SCaroline Concatto // Honor -help. 909ffb5b04SAndrzej Warzynski if (flang->frontendOpts().showHelp_) { 91257b2971SCaroline Concatto clang::driver::getDriverOptTable().PrintHelp(llvm::outs(), 92257b2971SCaroline Concatto "flang-new -fc1 [options] file...", "LLVM 'Flang' Compiler", 9399edb9b7SAndrzej Warzynski /*Include=*/clang::driver::options::FC1Option, 944c5906cfSCaroline Concatto /*Exclude=*/llvm::opt::DriverFlag::HelpHidden, 954c5906cfSCaroline Concatto /*ShowAllAliases=*/false); 96257b2971SCaroline Concatto return true; 97257b2971SCaroline Concatto } 98257b2971SCaroline Concatto 99257b2971SCaroline Concatto // Honor -version. 1009ffb5b04SAndrzej Warzynski if (flang->frontendOpts().showVersion_) { 101257b2971SCaroline Concatto llvm::cl::PrintVersionMessage(); 102257b2971SCaroline Concatto return true; 103257b2971SCaroline Concatto } 104257b2971SCaroline Concatto 1054c5906cfSCaroline Concatto // Create and execute the frontend action. 1064c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act(CreateFrontendAction(*flang)); 1074c5906cfSCaroline Concatto if (!act) 1084c5906cfSCaroline Concatto return false; 1094c5906cfSCaroline Concatto 1104c5906cfSCaroline Concatto bool success = flang->ExecuteAction(*act); 1114c5906cfSCaroline Concatto return success; 112257b2971SCaroline Concatto } 113257b2971SCaroline Concatto 114257b2971SCaroline Concatto } // namespace Fortran::frontend 115