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" 16*f52fc591SStuart Ellis #include "flang/Frontend/FrontendPluginRegistry.h" 17257b2971SCaroline Concatto #include "clang/Driver/Options.h" 18257b2971SCaroline Concatto #include "llvm/Option/OptTable.h" 194c5906cfSCaroline Concatto #include "llvm/Option/Option.h" 204c5906cfSCaroline Concatto #include "llvm/Support/BuryPointer.h" 21257b2971SCaroline Concatto #include "llvm/Support/CommandLine.h" 22257b2971SCaroline Concatto 23257b2971SCaroline Concatto namespace Fortran::frontend { 244c5906cfSCaroline Concatto 254c5906cfSCaroline Concatto static std::unique_ptr<FrontendAction> CreateFrontendBaseAction( 264c5906cfSCaroline Concatto CompilerInstance &ci) { 274c5906cfSCaroline Concatto 2823d4c4f3SAndrzej Warzynski ActionKind ak = ci.frontendOpts().programAction; 294c5906cfSCaroline Concatto switch (ak) { 304c5906cfSCaroline Concatto case InputOutputTest: 314c5906cfSCaroline Concatto return std::make_unique<InputOutputTestAction>(); 32d28de0d7SCaroline Concatto case PrintPreprocessedInput: 33d28de0d7SCaroline Concatto return std::make_unique<PrintPreprocessedAction>(); 347d246cb1SAndrzej Warzynski case ParseSyntaxOnly: 357d246cb1SAndrzej Warzynski return std::make_unique<ParseSyntaxOnlyAction>(); 36e5cdb6c5SAndrzej Warzynski case EmitObj: 37e5cdb6c5SAndrzej Warzynski return std::make_unique<EmitObjAction>(); 3896d229c9SAndrzej Warzynski case DebugUnparse: 3996d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseAction>(); 40e81b3401SAndrzej Warzynski case DebugUnparseNoSema: 41e81b3401SAndrzej Warzynski return std::make_unique<DebugUnparseNoSemaAction>(); 4296d229c9SAndrzej Warzynski case DebugUnparseWithSymbols: 4396d229c9SAndrzej Warzynski return std::make_unique<DebugUnparseWithSymbolsAction>(); 444bd08dabSFaris Rehman case DebugDumpSymbols: 454bd08dabSFaris Rehman return std::make_unique<DebugDumpSymbolsAction>(); 464bd08dabSFaris Rehman case DebugDumpParseTree: 474bd08dabSFaris Rehman return std::make_unique<DebugDumpParseTreeAction>(); 48e81b3401SAndrzej Warzynski case DebugDumpParseTreeNoSema: 49e81b3401SAndrzej Warzynski return std::make_unique<DebugDumpParseTreeNoSemaAction>(); 50a6be6e31SAndrzej Warzynski case DebugDumpAll: 51a6be6e31SAndrzej Warzynski return std::make_unique<DebugDumpAllAction>(); 524bd08dabSFaris Rehman case DebugDumpProvenance: 534bd08dabSFaris Rehman return std::make_unique<DebugDumpProvenanceAction>(); 54523d7bc6SAndrzej Warzynski case DebugDumpParsingLog: 55523d7bc6SAndrzej Warzynski return std::make_unique<DebugDumpParsingLogAction>(); 56529f7181SFaris Rehman case DebugMeasureParseTree: 57529f7181SFaris Rehman return std::make_unique<DebugMeasureParseTreeAction>(); 58529f7181SFaris Rehman case DebugPreFIRTree: 59529f7181SFaris Rehman return std::make_unique<DebugPreFIRTreeAction>(); 60dc256a44SAndrzej Warzynski case GetDefinition: 61dc256a44SAndrzej Warzynski return std::make_unique<GetDefinitionAction>(); 62eefda605SAndrzej Warzynski case GetSymbolsSources: 63eefda605SAndrzej Warzynski return std::make_unique<GetSymbolsSourcesAction>(); 64e1da3297SStuart Ellis case InitOnly: 65e1da3297SStuart Ellis return std::make_unique<InitOnlyAction>(); 66*f52fc591SStuart Ellis case PluginAction: { 67*f52fc591SStuart Ellis for (const FrontendPluginRegistry::entry &plugin : 68*f52fc591SStuart Ellis FrontendPluginRegistry::entries()) { 69*f52fc591SStuart Ellis if (plugin.getName() == ci.frontendOpts().ActionName) { 70*f52fc591SStuart Ellis std::unique_ptr<PluginParseTreeAction> p(plugin.instantiate()); 71*f52fc591SStuart Ellis return std::move(p); 72*f52fc591SStuart Ellis } 73*f52fc591SStuart Ellis } 74*f52fc591SStuart Ellis unsigned diagID = ci.diagnostics().getCustomDiagID( 75*f52fc591SStuart Ellis clang::DiagnosticsEngine::Error, "unable to find plugin '%0'"); 76*f52fc591SStuart Ellis ci.diagnostics().Report(diagID) << ci.frontendOpts().ActionName; 77*f52fc591SStuart Ellis return nullptr; 78*f52fc591SStuart Ellis } 794c5906cfSCaroline Concatto default: 804c5906cfSCaroline Concatto break; 814c5906cfSCaroline Concatto // TODO: 824c5906cfSCaroline Concatto // case ParserSyntaxOnly: 834c5906cfSCaroline Concatto // case EmitLLVM: 844c5906cfSCaroline Concatto // case EmitLLVMOnly: 854c5906cfSCaroline Concatto // case EmitCodeGenOnly: 864c5906cfSCaroline Concatto // (...) 874c5906cfSCaroline Concatto } 884c5906cfSCaroline Concatto return 0; 894c5906cfSCaroline Concatto } 904c5906cfSCaroline Concatto 914c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) { 924c5906cfSCaroline Concatto // Create the underlying action. 934c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act = CreateFrontendBaseAction(ci); 944c5906cfSCaroline Concatto if (!act) 954c5906cfSCaroline Concatto return nullptr; 964c5906cfSCaroline Concatto 974c5906cfSCaroline Concatto return act; 984c5906cfSCaroline Concatto } 99*f52fc591SStuart Ellis 100257b2971SCaroline Concatto bool ExecuteCompilerInvocation(CompilerInstance *flang) { 101257b2971SCaroline Concatto // Honor -help. 10223d4c4f3SAndrzej Warzynski if (flang->frontendOpts().showHelp) { 103f1e2d585SFangrui Song clang::driver::getDriverOptTable().printHelp(llvm::outs(), 104257b2971SCaroline Concatto "flang-new -fc1 [options] file...", "LLVM 'Flang' Compiler", 10599edb9b7SAndrzej Warzynski /*Include=*/clang::driver::options::FC1Option, 1064c5906cfSCaroline Concatto /*Exclude=*/llvm::opt::DriverFlag::HelpHidden, 1074c5906cfSCaroline Concatto /*ShowAllAliases=*/false); 108257b2971SCaroline Concatto return true; 109257b2971SCaroline Concatto } 110257b2971SCaroline Concatto 111257b2971SCaroline Concatto // Honor -version. 11223d4c4f3SAndrzej Warzynski if (flang->frontendOpts().showVersion) { 113257b2971SCaroline Concatto llvm::cl::PrintVersionMessage(); 114257b2971SCaroline Concatto return true; 115257b2971SCaroline Concatto } 116257b2971SCaroline Concatto 117*f52fc591SStuart Ellis // Load any requested plugins. 118*f52fc591SStuart Ellis for (const std::string &Path : flang->frontendOpts().plugins) { 119*f52fc591SStuart Ellis std::string Error; 120*f52fc591SStuart Ellis if (llvm::sys::DynamicLibrary::LoadLibraryPermanently( 121*f52fc591SStuart Ellis Path.c_str(), &Error)) { 122*f52fc591SStuart Ellis unsigned diagID = flang->diagnostics().getCustomDiagID( 123*f52fc591SStuart Ellis clang::DiagnosticsEngine::Error, "unable to load plugin '%0': '%1'"); 124*f52fc591SStuart Ellis flang->diagnostics().Report(diagID) << Path << Error; 125*f52fc591SStuart Ellis } 126*f52fc591SStuart Ellis } 127*f52fc591SStuart Ellis 128*f52fc591SStuart Ellis // If there were errors in processing arguments, don't do anything else. 129*f52fc591SStuart Ellis if (flang->diagnostics().hasErrorOccurred()) { 130*f52fc591SStuart Ellis return false; 131*f52fc591SStuart Ellis } 132*f52fc591SStuart Ellis 1334c5906cfSCaroline Concatto // Create and execute the frontend action. 1344c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act(CreateFrontendAction(*flang)); 1354c5906cfSCaroline Concatto if (!act) 1364c5906cfSCaroline Concatto return false; 1374c5906cfSCaroline Concatto 1384c5906cfSCaroline Concatto bool success = flang->ExecuteAction(*act); 1394c5906cfSCaroline Concatto return success; 140257b2971SCaroline Concatto } 141257b2971SCaroline Concatto 142257b2971SCaroline Concatto } // namespace Fortran::frontend 143