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