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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H
10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H
11
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 to
28  /// the list of arguments for the generated command/job.
29  ///
30  /// \param [in] Args The list of input driver arguments
31  /// \param [out] CmdArgs The list of output command arguments
32  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 to
36  /// the preprocessor command arguments.
37  ///
38  /// \param [in] Args The list of input driver arguments
39  /// \param [out] CmdArgs The list of output command arguments
40  void addPreprocessingOptions(const llvm::opt::ArgList &Args,
41                               llvm::opt::ArgStringList &CmdArgs) const;
42
43  /// Extract PIC options from the driver arguments and add them to
44  /// the command arguments.
45  ///
46  /// \param [in] Args The list of input driver arguments
47  /// \param [out] CmdArgs The list of output command arguments
48  void addPicOptions(const llvm::opt::ArgList &Args,
49                     llvm::opt::ArgStringList &CmdArgs) const;
50
51  /// Extract target options from the driver arguments and add them to
52  /// the command arguments.
53  ///
54  /// \param [in] Args The list of input driver arguments
55  /// \param [out] CmdArgs The list of output command arguments
56  void addTargetOptions(const llvm::opt::ArgList &Args,
57                        llvm::opt::ArgStringList &CmdArgs) const;
58
59  /// Add specific options for AArch64 target.
60  ///
61  /// \param [in] Args The list of input driver arguments
62  /// \param [out] CmdArgs The list of output command arguments
63  void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
64                            llvm::opt::ArgStringList &CmdArgs) const;
65
66  /// Add specific options for AMDGPU target.
67  ///
68  /// \param [in] Args The list of input driver arguments
69  /// \param [out] CmdArgs The list of output command arguments
70  void AddAMDGPUTargetArgs(const llvm::opt::ArgList &Args,
71                           llvm::opt::ArgStringList &CmdArgs) const;
72
73  /// Add specific options for RISC-V target.
74  ///
75  /// \param [in] Args The list of input driver arguments
76  /// \param [out] CmdArgs The list of output command arguments
77  void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,
78                          llvm::opt::ArgStringList &CmdArgs) const;
79
80  /// Extract offload options from the driver arguments and add them to
81  /// the command arguments.
82  /// \param [in] C The current compilation for the driver invocation
83  /// \param [in] Inputs The input infomration on the current file inputs
84  /// \param [in] JA The job action
85  /// \param [in] Args The list of input driver arguments
86  /// \param [out] CmdArgs The list of output command arguments
87  void addOffloadOptions(Compilation &C, const InputInfoList &Inputs,
88                         const JobAction &JA, const llvm::opt::ArgList &Args,
89                         llvm::opt::ArgStringList &CmdArgs) const;
90
91  /// Extract options for code generation from the driver arguments and add them
92  /// to the command arguments.
93  ///
94  /// \param [in] Args The list of input driver arguments
95  /// \param [out] CmdArgs The list of output command arguments
96  void addCodegenOptions(const llvm::opt::ArgList &Args,
97                         llvm::opt::ArgStringList &CmdArgs) const;
98
99  /// Extract other compilation options from the driver arguments and add them
100  /// to the command arguments.
101  ///
102  /// \param [in] Args The list of input driver arguments
103  /// \param [out] CmdArgs The list of output command arguments
104  void addOtherOptions(const llvm::opt::ArgList &Args,
105                       llvm::opt::ArgStringList &CmdArgs) const;
106
107public:
108  Flang(const ToolChain &TC);
109  ~Flang() override;
110
111  bool hasGoodDiagnostics() const override { return true; }
112  bool hasIntegratedAssembler() const override { return true; }
113  bool hasIntegratedCPP() const override { return true; }
114  bool canEmitIR() const override { return true; }
115
116  void ConstructJob(Compilation &C, const JobAction &JA,
117                    const InputInfo &Output, const InputInfoList &Inputs,
118                    const llvm::opt::ArgList &TCArgs,
119                    const char *LinkingOutput) const override;
120};
121
122} // end namespace tools
123
124} // end namespace driver
125} // end namespace clang
126
127#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FLANG_H
128