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*9ffb5b04SAndrzej Warzynski ActionKind ak = ci.frontendOpts().programAction_; 284c5906cfSCaroline Concatto switch (ak) { 294c5906cfSCaroline Concatto case InputOutputTest: 304c5906cfSCaroline Concatto return std::make_unique<InputOutputTestAction>(); 314c5906cfSCaroline Concatto break; 324c5906cfSCaroline Concatto default: 334c5906cfSCaroline Concatto break; 344c5906cfSCaroline Concatto // TODO: 354c5906cfSCaroline Concatto // case RunPreprocessor: 364c5906cfSCaroline Concatto // case ParserSyntaxOnly: 374c5906cfSCaroline Concatto // case EmitLLVM: 384c5906cfSCaroline Concatto // case EmitLLVMOnly: 394c5906cfSCaroline Concatto // case EmitCodeGenOnly: 404c5906cfSCaroline Concatto // (...) 414c5906cfSCaroline Concatto } 424c5906cfSCaroline Concatto return 0; 434c5906cfSCaroline Concatto } 444c5906cfSCaroline Concatto 454c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) { 464c5906cfSCaroline Concatto // Create the underlying action. 474c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act = CreateFrontendBaseAction(ci); 484c5906cfSCaroline Concatto if (!act) 494c5906cfSCaroline Concatto return nullptr; 504c5906cfSCaroline Concatto 514c5906cfSCaroline Concatto return act; 524c5906cfSCaroline Concatto } 53257b2971SCaroline Concatto bool ExecuteCompilerInvocation(CompilerInstance *flang) { 54257b2971SCaroline Concatto // Honor -help. 55*9ffb5b04SAndrzej Warzynski if (flang->frontendOpts().showHelp_) { 56257b2971SCaroline Concatto clang::driver::getDriverOptTable().PrintHelp(llvm::outs(), 57257b2971SCaroline Concatto "flang-new -fc1 [options] file...", "LLVM 'Flang' Compiler", 5899edb9b7SAndrzej Warzynski /*Include=*/clang::driver::options::FC1Option, 594c5906cfSCaroline Concatto /*Exclude=*/llvm::opt::DriverFlag::HelpHidden, 604c5906cfSCaroline Concatto /*ShowAllAliases=*/false); 61257b2971SCaroline Concatto return true; 62257b2971SCaroline Concatto } 63257b2971SCaroline Concatto 64257b2971SCaroline Concatto // Honor -version. 65*9ffb5b04SAndrzej Warzynski if (flang->frontendOpts().showVersion_) { 66257b2971SCaroline Concatto llvm::cl::PrintVersionMessage(); 67257b2971SCaroline Concatto return true; 68257b2971SCaroline Concatto } 69257b2971SCaroline Concatto 704c5906cfSCaroline Concatto // Create and execute the frontend action. 714c5906cfSCaroline Concatto std::unique_ptr<FrontendAction> act(CreateFrontendAction(*flang)); 724c5906cfSCaroline Concatto if (!act) 734c5906cfSCaroline Concatto return false; 744c5906cfSCaroline Concatto 754c5906cfSCaroline Concatto bool success = flang->ExecuteAction(*act); 764c5906cfSCaroline Concatto return success; 77257b2971SCaroline Concatto } 78257b2971SCaroline Concatto 79257b2971SCaroline Concatto } // namespace Fortran::frontend 80