161 lines · c
1//===--- Flang.h - Flang Tool and ToolChain Implementations ====-*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H11 12#include "clang/Driver/Tool.h"13#include "clang/Driver/Action.h"14#include "clang/Driver/Compilation.h"15#include "clang/Driver/ToolChain.h"16#include "llvm/Option/ArgList.h"17#include "llvm/Support/Compiler.h"18 19namespace clang {20namespace driver {21 22namespace tools {23 24/// Flang compiler tool.25class LLVM_LIBRARY_VISIBILITY Flang : public Tool {26private:27 /// Extract fortran dialect options from the driver arguments and add them to28 /// the list of arguments for the generated command/job.29 ///30 /// \param [in] Args The list of input driver arguments31 /// \param [out] CmdArgs The list of output command arguments32 void addFortranDialectOptions(const llvm::opt::ArgList &Args,33 llvm::opt::ArgStringList &CmdArgs) const;34 35 /// Extract preprocessing options from the driver arguments and add them to36 /// the preprocessor command arguments.37 ///38 /// \param [in] Args The list of input driver arguments39 /// \param [out] CmdArgs The list of output command arguments40 void addPreprocessingOptions(const llvm::opt::ArgList &Args,41 llvm::opt::ArgStringList &CmdArgs) const;42 43 /// Extract LTO options from the driver arguments and add them to44 /// the command arguments.45 ///46 /// \param [in] Args The list of input driver arguments47 /// \param [out] CmdArgs The list of output command arguments48 void addLTOOptions(const llvm::opt::ArgList &Args,49 llvm::opt::ArgStringList &CmdArgs) const;50 51 /// Extract PIC options from the driver arguments and add them to52 /// the command arguments.53 ///54 /// \param [in] Args The list of input driver arguments55 /// \param [out] CmdArgs The list of output command arguments56 void addPicOptions(const llvm::opt::ArgList &Args,57 llvm::opt::ArgStringList &CmdArgs) const;58 59 /// Extract target options from the driver arguments and add them to60 /// the command arguments.61 ///62 /// \param [in] Args The list of input driver arguments63 /// \param [out] CmdArgs The list of output command arguments64 void addTargetOptions(const llvm::opt::ArgList &Args,65 llvm::opt::ArgStringList &CmdArgs) const;66 67 /// Add specific options for AArch64 target.68 ///69 /// \param [in] Args The list of input driver arguments70 /// \param [out] CmdArgs The list of output command arguments71 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,72 llvm::opt::ArgStringList &CmdArgs) const;73 74 /// Add specific options for AMDGPU target.75 ///76 /// \param [in] Args The list of input driver arguments77 /// \param [out] CmdArgs The list of output command arguments78 void AddAMDGPUTargetArgs(const llvm::opt::ArgList &Args,79 llvm::opt::ArgStringList &CmdArgs) const;80 81 /// Add specific options for LoongArch64 target.82 ///83 /// \param [in] Args The list of input driver arguments84 /// \param [out] CmdArgs The list of output command arguments85 void AddLoongArch64TargetArgs(const llvm::opt::ArgList &Args,86 llvm::opt::ArgStringList &CmdArgs) const;87 88 /// Add specific options for RISC-V target.89 ///90 /// \param [in] Args The list of input driver arguments91 /// \param [out] CmdArgs The list of output command arguments92 void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,93 llvm::opt::ArgStringList &CmdArgs) const;94 95 /// Add specific options for X86_64 target.96 ///97 /// \param [in] Args The list of input driver arguments98 /// \param [out] CmdArgs The list of output command arguments99 void AddX86_64TargetArgs(const llvm::opt::ArgList &Args,100 llvm::opt::ArgStringList &CmdArgs) const;101 102 /// Add specific options for PPC target.103 ///104 /// \param [in] Args The list of input driver arguments105 /// \param [out] CmdArgs The list of output command arguments106 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,107 llvm::opt::ArgStringList &CmdArgs) const;108 109 /// Extract offload options from the driver arguments and add them to110 /// the command arguments.111 /// \param [in] C The current compilation for the driver invocation112 /// \param [in] Inputs The input infomration on the current file inputs113 /// \param [in] JA The job action114 /// \param [in] Args The list of input driver arguments115 /// \param [out] CmdArgs The list of output command arguments116 void addOffloadOptions(Compilation &C, const InputInfoList &Inputs,117 const JobAction &JA, const llvm::opt::ArgList &Args,118 llvm::opt::ArgStringList &CmdArgs) const;119 120 /// Extract options for code generation from the driver arguments and add them121 /// to the command arguments.122 ///123 /// \param [in] Args The list of input driver arguments124 /// \param [out] CmdArgs The list of output command arguments125 void addCodegenOptions(const llvm::opt::ArgList &Args,126 llvm::opt::ArgStringList &CmdArgs) const;127 128 /// Extract debug compilation options from the driver arguments and add them129 /// to the command arguments.130 ///131 /// \param [in] Args The list of input driver arguments132 /// \param [in] JA The job action133 /// \param [in] Output The output information on the current file output134 /// \param [in] Input The input information on the current file input135 /// \param [out] CmdArgs The list of output command arguments136 void addDebugOptions(const llvm::opt::ArgList &Args, const JobAction &JA,137 const InputInfo &Output, const InputInfo &Input,138 llvm::opt::ArgStringList &CmdArgs) const;139 140public:141 Flang(const ToolChain &TC);142 ~Flang() override;143 144 bool hasGoodDiagnostics() const override { return true; }145 bool hasIntegratedAssembler() const override { return true; }146 bool hasIntegratedCPP() const override { return true; }147 bool canEmitIR() const override { return true; }148 149 void ConstructJob(Compilation &C, const JobAction &JA,150 const InputInfo &Output, const InputInfoList &Inputs,151 const llvm::opt::ArgList &TCArgs,152 const char *LinkingOutput) const override;153};154 155} // end namespace tools156 157} // end namespace driver158} // end namespace clang159 160#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H161