Home | History | Annotate | Line # | Download | only in ToolChains
      1      1.1  joerg //===--- Clang.h - Clang Tool and ToolChain Implementations ====-*- C++ -*-===//
      2      1.1  joerg //
      3      1.1  joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4      1.1  joerg // See https://llvm.org/LICENSE.txt for license information.
      5      1.1  joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6      1.1  joerg //
      7      1.1  joerg //===----------------------------------------------------------------------===//
      8      1.1  joerg 
      9      1.1  joerg #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Clang_H
     10      1.1  joerg #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Clang_H
     11      1.1  joerg 
     12      1.1  joerg #include "MSVC.h"
     13      1.1  joerg #include "clang/Basic/DebugInfoOptions.h"
     14      1.1  joerg #include "clang/Driver/Driver.h"
     15      1.1  joerg #include "clang/Driver/Tool.h"
     16      1.1  joerg #include "clang/Driver/Types.h"
     17      1.1  joerg #include "llvm/ADT/Triple.h"
     18      1.1  joerg #include "llvm/Option/Option.h"
     19      1.1  joerg #include "llvm/Support/raw_ostream.h"
     20      1.1  joerg 
     21      1.1  joerg namespace clang {
     22      1.1  joerg class ObjCRuntime;
     23      1.1  joerg namespace driver {
     24      1.1  joerg 
     25      1.1  joerg namespace tools {
     26      1.1  joerg 
     27      1.1  joerg /// Clang compiler tool.
     28      1.1  joerg class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
     29      1.1  joerg public:
     30      1.1  joerg   static const char *getBaseInputName(const llvm::opt::ArgList &Args,
     31      1.1  joerg                                       const InputInfo &Input);
     32      1.1  joerg   static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
     33      1.1  joerg                                       const InputInfoList &Inputs);
     34      1.1  joerg   static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
     35      1.1  joerg                                            const InputInfoList &Inputs);
     36      1.1  joerg 
     37      1.1  joerg private:
     38      1.1  joerg   void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
     39      1.1  joerg                                const Driver &D, const llvm::opt::ArgList &Args,
     40      1.1  joerg                                llvm::opt::ArgStringList &CmdArgs,
     41      1.1  joerg                                const InputInfo &Output,
     42      1.1  joerg                                const InputInfoList &Inputs) const;
     43      1.1  joerg 
     44      1.1  joerg   void RenderTargetOptions(const llvm::Triple &EffectiveTriple,
     45      1.1  joerg                            const llvm::opt::ArgList &Args, bool KernelOrKext,
     46      1.1  joerg                            llvm::opt::ArgStringList &CmdArgs) const;
     47      1.1  joerg 
     48      1.1  joerg   void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
     49      1.1  joerg                             llvm::opt::ArgStringList &CmdArgs) const;
     50      1.1  joerg   void AddARMTargetArgs(const llvm::Triple &Triple,
     51      1.1  joerg                         const llvm::opt::ArgList &Args,
     52      1.1  joerg                         llvm::opt::ArgStringList &CmdArgs,
     53      1.1  joerg                         bool KernelOrKext) const;
     54      1.1  joerg   void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
     55      1.1  joerg                           llvm::opt::ArgStringList &CmdArgs) const;
     56      1.1  joerg   void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
     57      1.1  joerg                          llvm::opt::ArgStringList &CmdArgs) const;
     58      1.1  joerg   void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
     59      1.1  joerg                         llvm::opt::ArgStringList &CmdArgs) const;
     60      1.1  joerg   void AddR600TargetArgs(const llvm::opt::ArgList &Args,
     61      1.1  joerg                          llvm::opt::ArgStringList &CmdArgs) const;
     62      1.1  joerg   void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,
     63      1.1  joerg                           llvm::opt::ArgStringList &CmdArgs) const;
     64      1.1  joerg   void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
     65      1.1  joerg                           llvm::opt::ArgStringList &CmdArgs) const;
     66      1.1  joerg   void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
     67      1.1  joerg                             llvm::opt::ArgStringList &CmdArgs) const;
     68      1.1  joerg   void AddX86TargetArgs(const llvm::opt::ArgList &Args,
     69      1.1  joerg                         llvm::opt::ArgStringList &CmdArgs) const;
     70      1.1  joerg   void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
     71      1.1  joerg                             llvm::opt::ArgStringList &CmdArgs) const;
     72      1.1  joerg   void AddLanaiTargetArgs(const llvm::opt::ArgList &Args,
     73      1.1  joerg                           llvm::opt::ArgStringList &CmdArgs) const;
     74      1.1  joerg   void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,
     75      1.1  joerg                                 llvm::opt::ArgStringList &CmdArgs) const;
     76  1.1.1.2  joerg   void AddVETargetArgs(const llvm::opt::ArgList &Args,
     77  1.1.1.2  joerg                        llvm::opt::ArgStringList &CmdArgs) const;
     78      1.1  joerg 
     79      1.1  joerg   enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
     80      1.1  joerg 
     81      1.1  joerg   ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
     82  1.1.1.2  joerg                                  const InputInfoList &inputs,
     83      1.1  joerg                                  llvm::opt::ArgStringList &cmdArgs,
     84      1.1  joerg                                  RewriteKind rewrite) const;
     85      1.1  joerg 
     86      1.1  joerg   void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
     87      1.1  joerg                       llvm::opt::ArgStringList &CmdArgs,
     88      1.1  joerg                       codegenoptions::DebugInfoKind *DebugInfoKind,
     89      1.1  joerg                       bool *EmitCodeView) const;
     90      1.1  joerg 
     91      1.1  joerg   mutable std::unique_ptr<llvm::raw_fd_ostream> CompilationDatabase = nullptr;
     92      1.1  joerg   void DumpCompilationDatabase(Compilation &C, StringRef Filename,
     93      1.1  joerg                                StringRef Target,
     94      1.1  joerg                                const InputInfo &Output, const InputInfo &Input,
     95      1.1  joerg                                const llvm::opt::ArgList &Args) const;
     96      1.1  joerg 
     97      1.1  joerg   void DumpCompilationDatabaseFragmentToDir(
     98      1.1  joerg       StringRef Dir, Compilation &C, StringRef Target, const InputInfo &Output,
     99      1.1  joerg       const InputInfo &Input, const llvm::opt::ArgList &Args) const;
    100      1.1  joerg 
    101      1.1  joerg public:
    102      1.1  joerg   Clang(const ToolChain &TC);
    103      1.1  joerg   ~Clang() override;
    104      1.1  joerg 
    105      1.1  joerg   bool hasGoodDiagnostics() const override { return true; }
    106      1.1  joerg   bool hasIntegratedAssembler() const override { return true; }
    107      1.1  joerg   bool hasIntegratedCPP() const override { return true; }
    108      1.1  joerg   bool canEmitIR() const override { return true; }
    109      1.1  joerg 
    110      1.1  joerg   void ConstructJob(Compilation &C, const JobAction &JA,
    111      1.1  joerg                     const InputInfo &Output, const InputInfoList &Inputs,
    112      1.1  joerg                     const llvm::opt::ArgList &TCArgs,
    113      1.1  joerg                     const char *LinkingOutput) const override;
    114      1.1  joerg };
    115      1.1  joerg 
    116      1.1  joerg /// Clang integrated assembler tool.
    117      1.1  joerg class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
    118      1.1  joerg public:
    119      1.1  joerg   ClangAs(const ToolChain &TC)
    120  1.1.1.2  joerg       : Tool("clang::as", "clang integrated assembler", TC) {}
    121      1.1  joerg   void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
    122      1.1  joerg                          llvm::opt::ArgStringList &CmdArgs) const;
    123      1.1  joerg   void AddX86TargetArgs(const llvm::opt::ArgList &Args,
    124      1.1  joerg                         llvm::opt::ArgStringList &CmdArgs) const;
    125      1.1  joerg   void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,
    126      1.1  joerg                           llvm::opt::ArgStringList &CmdArgs) const;
    127      1.1  joerg   bool hasGoodDiagnostics() const override { return true; }
    128      1.1  joerg   bool hasIntegratedAssembler() const override { return false; }
    129      1.1  joerg   bool hasIntegratedCPP() const override { return false; }
    130      1.1  joerg 
    131      1.1  joerg   void ConstructJob(Compilation &C, const JobAction &JA,
    132      1.1  joerg                     const InputInfo &Output, const InputInfoList &Inputs,
    133      1.1  joerg                     const llvm::opt::ArgList &TCArgs,
    134      1.1  joerg                     const char *LinkingOutput) const override;
    135      1.1  joerg };
    136      1.1  joerg 
    137      1.1  joerg /// Offload bundler tool.
    138      1.1  joerg class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool {
    139      1.1  joerg public:
    140      1.1  joerg   OffloadBundler(const ToolChain &TC)
    141      1.1  joerg       : Tool("offload bundler", "clang-offload-bundler", TC) {}
    142      1.1  joerg 
    143      1.1  joerg   bool hasIntegratedCPP() const override { return false; }
    144      1.1  joerg   void ConstructJob(Compilation &C, const JobAction &JA,
    145      1.1  joerg                     const InputInfo &Output, const InputInfoList &Inputs,
    146      1.1  joerg                     const llvm::opt::ArgList &TCArgs,
    147      1.1  joerg                     const char *LinkingOutput) const override;
    148      1.1  joerg   void ConstructJobMultipleOutputs(Compilation &C, const JobAction &JA,
    149      1.1  joerg                                    const InputInfoList &Outputs,
    150      1.1  joerg                                    const InputInfoList &Inputs,
    151      1.1  joerg                                    const llvm::opt::ArgList &TCArgs,
    152      1.1  joerg                                    const char *LinkingOutput) const override;
    153      1.1  joerg };
    154      1.1  joerg 
    155      1.1  joerg /// Offload wrapper tool.
    156      1.1  joerg class LLVM_LIBRARY_VISIBILITY OffloadWrapper final : public Tool {
    157      1.1  joerg public:
    158      1.1  joerg   OffloadWrapper(const ToolChain &TC)
    159      1.1  joerg       : Tool("offload wrapper", "clang-offload-wrapper", TC) {}
    160      1.1  joerg 
    161      1.1  joerg   bool hasIntegratedCPP() const override { return false; }
    162      1.1  joerg   void ConstructJob(Compilation &C, const JobAction &JA,
    163      1.1  joerg                     const InputInfo &Output, const InputInfoList &Inputs,
    164      1.1  joerg                     const llvm::opt::ArgList &TCArgs,
    165      1.1  joerg                     const char *LinkingOutput) const override;
    166      1.1  joerg };
    167      1.1  joerg 
    168      1.1  joerg } // end namespace tools
    169      1.1  joerg 
    170      1.1  joerg } // end namespace driver
    171      1.1  joerg } // end namespace clang
    172      1.1  joerg 
    173      1.1  joerg #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H
    174