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 27*23d4c4f3SAndrzej Warzynski ActionKind ak = ci.frontendOpts().programAction; 284c5906cfSCaroline Concatto switch (ak) { 294c5906cfSCaroline Concatto case InputOutputTest: 304c5906cfSCaroline Concatto return std::make_unique<InputOutputTestAction>(); 31d28de0d7SCaroline Concatto case PrintPreprocessedInput: 32d28de0d7SCaroline Concatto return std::make_unique<PrintPreprocessedAction>(); 337d246cb1SAndrzej Warzynski case ParseSyntaxOnly: 347d246cb1SAndrzej Warzynski return std::make_unique<ParseSyntaxOnlyAction>(); 35e5cdb6c5SAndrzej Warzynski case EmitObj: 36e5cdb6c5SAndrzej Warzynski return std::make_unique<EmitObjAction>(); 3796d229c9SAndrzej Warzynski case DebugUnparse: 3896d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseAction>(); 39e81b3401SAndrzej Warzynski case DebugUnparseNoSema: 40e81b3401SAndrzej Warzynski return std::make_unique<DebugUnparseNoSemaAction>(); 4196d229c9SAndrzej Warzynski case DebugUnparseWithSymbols: 4296d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseWithSymbolsAction>(); 434bd08dabSFaris Rehman case DebugDumpSymbols: 444bd08dabSFaris Rehman return std::make_unique<DebugDumpSymbolsAction>(); 454bd08dabSFaris Rehman case DebugDumpParseTree: 464bd08dabSFaris Rehman return std::make_unique<DebugDumpParseTreeAction>(); 47e81b3401SAndrzej Warzynski case DebugDumpParseTreeNoSema: 48e81b3401SAndrzej Warzynski return std::make_unique<DebugDumpParseTreeNoSemaAction>(); 49a6be6e31SAndrzej Warzynski case DebugDumpAll: 50a6be6e31SAndrzej Warzynski return std::make_unique<DebugDumpAllAction>(); 514bd08dabSFaris Rehman case DebugDumpProvenance: 524bd08dabSFaris Rehman return std::make_unique<DebugDumpProvenanceAction>(); 53523d7bc6SAndrzej Warzynski case DebugDumpParsingLog: 54523d7bc6SAndrzej Warzynski return std::make_unique<DebugDumpParsingLogAction>(); 55529f7181SFaris Rehman case DebugMeasureParseTree: 56529f7181SFaris Rehman return std::make_unique<DebugMeasureParseTreeAction>(); 57529f7181SFaris Rehman case DebugPreFIRTree: 58529f7181SFaris Rehman return std::make_unique<DebugPreFIRTreeAction>(); 59dc256a44SAndrzej Warzynski case GetDefinition: 60dc256a44SAndrzej Warzynski return std::make_unique<GetDefinitionAction>(); 61eefda605SAndrzej Warzynski case GetSymbolsSources: 62eefda605SAndrzej Warzynski return std::make_unique<GetSymbolsSourcesAction>(); 63e1da3297SStuart Ellis case InitOnly: 64e1da3297SStuart Ellis return std::make_unique<InitOnlyAction>(); 654c5906cfSCaroline Concatto default: 664c5906cfSCaroline Concatto break; 674c5906cfSCaroline Concatto // TODO: 684c5906cfSCaroline Concatto // case ParserSyntaxOnly: 694c5906cfSCaroline Concatto // case EmitLLVM: 704c5906cfSCaroline Concatto // case EmitLLVMOnly: 714c5906cfSCaroline Concatto // case EmitCodeGenOnly: 724c5906cfSCaroline Concatto // (...) 734c5906cfSCaroline Concatto } 744c5906cfSCaroline Concatto return 0; 754c5906cfSCaroline Concatto } 764c5906cfSCaroline Concatto 774c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) { 784c5906cfSCaroline Concatto // Create the underlying action. 794c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act = CreateFrontendBaseAction(ci); 804c5906cfSCaroline Concatto if (!act) 814c5906cfSCaroline Concatto return nullptr; 824c5906cfSCaroline Concatto 834c5906cfSCaroline Concatto return act; 844c5906cfSCaroline Concatto } 85257b2971SCaroline Concatto bool ExecuteCompilerInvocation(CompilerInstance *flang) { 86257b2971SCaroline Concatto // Honor -help. 87*23d4c4f3SAndrzej Warzynski if (flang->frontendOpts().showHelp) { 88f1e2d585SFangrui Song clang::driver::getDriverOptTable().printHelp(llvm::outs(), 89257b2971SCaroline Concatto "flang-new -fc1 [options] file...", "LLVM 'Flang' Compiler", 9099edb9b7SAndrzej Warzynski /*Include=*/clang::driver::options::FC1Option, 914c5906cfSCaroline Concatto /*Exclude=*/llvm::opt::DriverFlag::HelpHidden, 924c5906cfSCaroline Concatto /*ShowAllAliases=*/false); 93257b2971SCaroline Concatto return true; 94257b2971SCaroline Concatto } 95257b2971SCaroline Concatto 96257b2971SCaroline Concatto // Honor -version. 97*23d4c4f3SAndrzej Warzynski if (flang->frontendOpts().showVersion) { 98257b2971SCaroline Concatto llvm::cl::PrintVersionMessage(); 99257b2971SCaroline Concatto return true; 100257b2971SCaroline Concatto } 101257b2971SCaroline Concatto 1024c5906cfSCaroline Concatto // Create and execute the frontend action. 1034c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act(CreateFrontendAction(*flang)); 1044c5906cfSCaroline Concatto if (!act) 1054c5906cfSCaroline Concatto return false; 1064c5906cfSCaroline Concatto 1074c5906cfSCaroline Concatto bool success = flang->ExecuteAction(*act); 1084c5906cfSCaroline Concatto return success; 109257b2971SCaroline Concatto } 110257b2971SCaroline Concatto 111257b2971SCaroline Concatto } // namespace Fortran::frontend 112