1257b2971SCaroline Concatto //===-- fc1_main.cpp - Flang FC1 Compiler Frontend ------------------------===// 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 is the entry point to the flang -fc1 functionality, which implements the 10257b2971SCaroline Concatto // core compiler functionality along with a number of additional tools for 11257b2971SCaroline Concatto // demonstration and testing purposes. 12257b2971SCaroline Concatto // 13257b2971SCaroline Concatto //===----------------------------------------------------------------------===// 141e462fafSAndrzej Warzynski // 151e462fafSAndrzej Warzynski // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ 161e462fafSAndrzej Warzynski // 171e462fafSAndrzej Warzynski //===----------------------------------------------------------------------===// 18257b2971SCaroline Concatto 19257b2971SCaroline Concatto #include "flang/Frontend/CompilerInstance.h" 20257b2971SCaroline Concatto #include "flang/Frontend/CompilerInvocation.h" 218d51d37eSAndrzej Warzynski #include "flang/Frontend/TextDiagnosticBuffer.h" 22257b2971SCaroline Concatto #include "flang/FrontendTool/Utils.h" 23257b2971SCaroline Concatto #include "clang/Driver/DriverDiagnostic.h" 24*23d7a6ceSTarun Prabhu #include "llvm/MC/TargetRegistry.h" 25257b2971SCaroline Concatto #include "llvm/Option/Arg.h" 26257b2971SCaroline Concatto #include "llvm/Option/ArgList.h" 27257b2971SCaroline Concatto #include "llvm/Option/OptTable.h" 2838101b4eSAndrzej Warzynski #include "llvm/Support/TargetSelect.h" 29*23d7a6ceSTarun Prabhu #include "llvm/Support/raw_ostream.h" 30257b2971SCaroline Concatto 31257b2971SCaroline Concatto #include <cstdio> 32257b2971SCaroline Concatto 33257b2971SCaroline Concatto using namespace Fortran::frontend; 34257b2971SCaroline Concatto 35*23d7a6ceSTarun Prabhu /// Print supported cpus of the given target. 36*23d7a6ceSTarun Prabhu static int printSupportedCPUs(llvm::StringRef triple) { 37*23d7a6ceSTarun Prabhu std::string error; 38*23d7a6ceSTarun Prabhu const llvm::Target *target = 39*23d7a6ceSTarun Prabhu llvm::TargetRegistry::lookupTarget(triple, error); 40*23d7a6ceSTarun Prabhu if (!target) { 41*23d7a6ceSTarun Prabhu llvm::errs() << error; 42*23d7a6ceSTarun Prabhu return 1; 43*23d7a6ceSTarun Prabhu } 44*23d7a6ceSTarun Prabhu 45*23d7a6ceSTarun Prabhu // the target machine will handle the mcpu printing 46*23d7a6ceSTarun Prabhu llvm::TargetOptions targetOpts; 47*23d7a6ceSTarun Prabhu std::unique_ptr<llvm::TargetMachine> targetMachine( 48*23d7a6ceSTarun Prabhu target->createTargetMachine(triple, "", "+cpuhelp", targetOpts, 49*23d7a6ceSTarun Prabhu std::nullopt)); 50*23d7a6ceSTarun Prabhu return 0; 51*23d7a6ceSTarun Prabhu } 52*23d7a6ceSTarun Prabhu 53257b2971SCaroline Concatto int fc1_main(llvm::ArrayRef<const char *> argv, const char *argv0) { 54257b2971SCaroline Concatto // Create CompilerInstance 55257b2971SCaroline Concatto std::unique_ptr<CompilerInstance> flang(new CompilerInstance()); 56257b2971SCaroline Concatto 57257b2971SCaroline Concatto // Create DiagnosticsEngine for the frontend driver 581e462fafSAndrzej Warzynski flang->createDiagnostics(); 591e462fafSAndrzej Warzynski if (!flang->hasDiagnostics()) 60257b2971SCaroline Concatto return 1; 61257b2971SCaroline Concatto 628d51d37eSAndrzej Warzynski // We will buffer diagnostics from argument parsing so that we can output 638d51d37eSAndrzej Warzynski // them using a well formed diagnostic object. 648d51d37eSAndrzej Warzynski TextDiagnosticBuffer *diagsBuffer = new TextDiagnosticBuffer; 658d51d37eSAndrzej Warzynski 66257b2971SCaroline Concatto // Create CompilerInvocation - use a dedicated instance of DiagnosticsEngine 67257b2971SCaroline Concatto // for parsing the arguments 68257b2971SCaroline Concatto llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagID( 69257b2971SCaroline Concatto new clang::DiagnosticIDs()); 70257b2971SCaroline Concatto llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> diagOpts = 71257b2971SCaroline Concatto new clang::DiagnosticOptions(); 72257b2971SCaroline Concatto clang::DiagnosticsEngine diags(diagID, &*diagOpts, diagsBuffer); 73541f5c4aSHussain Kadhem bool success = CompilerInvocation::createFromArgs(flang->getInvocation(), 74541f5c4aSHussain Kadhem argv, diags, argv0); 75257b2971SCaroline Concatto 7638101b4eSAndrzej Warzynski // Initialize targets first, so that --version shows registered targets. 7738101b4eSAndrzej Warzynski llvm::InitializeAllTargets(); 7838101b4eSAndrzej Warzynski llvm::InitializeAllTargetMCs(); 7938101b4eSAndrzej Warzynski llvm::InitializeAllAsmPrinters(); 8038101b4eSAndrzej Warzynski 81*23d7a6ceSTarun Prabhu // --print-supported-cpus takes priority over the actual compilation. 82*23d7a6ceSTarun Prabhu if (flang->getFrontendOpts().printSupportedCPUs) 83*23d7a6ceSTarun Prabhu return printSupportedCPUs(flang->getInvocation().getTargetOpts().triple); 84*23d7a6ceSTarun Prabhu 851e462fafSAndrzej Warzynski diagsBuffer->flushDiagnostics(flang->getDiagnostics()); 868d51d37eSAndrzej Warzynski 87257b2971SCaroline Concatto if (!success) 88257b2971SCaroline Concatto return 1; 89257b2971SCaroline Concatto 90257b2971SCaroline Concatto // Execute the frontend actions. 911e462fafSAndrzej Warzynski success = executeCompilerInvocation(flang.get()); 92257b2971SCaroline Concatto 934c5906cfSCaroline Concatto // Delete output files to free Compiler Instance 941e462fafSAndrzej Warzynski flang->clearOutputFiles(/*EraseFiles=*/false); 954c5906cfSCaroline Concatto 96257b2971SCaroline Concatto return !success; 97257b2971SCaroline Concatto } 98