1 //===--- Clang.h - Clang 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_CLANG_H 10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H 11 12 #include "MSVC.h" 13 #include "clang/Driver/Driver.h" 14 #include "clang/Driver/Tool.h" 15 #include "clang/Driver/Types.h" 16 #include "llvm/Frontend/Debug/Options.h" 17 #include "llvm/Option/Option.h" 18 #include "llvm/Support/raw_ostream.h" 19 #include "llvm/TargetParser/Triple.h" 20 21 namespace clang { 22 class ObjCRuntime; 23 namespace driver { 24 25 namespace tools { 26 27 /// Clang compiler tool. 28 class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 29 // Indicates whether this instance has integrated backend using 30 // internal LLVM infrastructure. 31 bool HasBackend; 32 33 public: 34 static const char *getBaseInputName(const llvm::opt::ArgList &Args, 35 const InputInfo &Input); 36 static const char *getBaseInputStem(const llvm::opt::ArgList &Args, 37 const InputInfoList &Inputs); 38 static const char *getDependencyFileName(const llvm::opt::ArgList &Args, 39 const InputInfoList &Inputs); 40 41 private: 42 void AddPreprocessingOptions(Compilation &C, const JobAction &JA, 43 const Driver &D, const llvm::opt::ArgList &Args, 44 llvm::opt::ArgStringList &CmdArgs, 45 const InputInfo &Output, 46 const InputInfoList &Inputs) const; 47 48 void RenderTargetOptions(const llvm::Triple &EffectiveTriple, 49 const llvm::opt::ArgList &Args, bool KernelOrKext, 50 llvm::opt::ArgStringList &CmdArgs) const; 51 52 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, 53 llvm::opt::ArgStringList &CmdArgs) const; 54 void AddARMTargetArgs(const llvm::Triple &Triple, 55 const llvm::opt::ArgList &Args, 56 llvm::opt::ArgStringList &CmdArgs, 57 bool KernelOrKext) const; 58 void AddARM64TargetArgs(const llvm::opt::ArgList &Args, 59 llvm::opt::ArgStringList &CmdArgs) const; 60 void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args, 61 llvm::opt::ArgStringList &CmdArgs) const; 62 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 63 llvm::opt::ArgStringList &CmdArgs) const; 64 void AddPPCTargetArgs(const llvm::opt::ArgList &Args, 65 llvm::opt::ArgStringList &CmdArgs) const; 66 void AddR600TargetArgs(const llvm::opt::ArgList &Args, 67 llvm::opt::ArgStringList &CmdArgs) const; 68 void AddRISCVTargetArgs(const llvm::opt::ArgList &Args, 69 llvm::opt::ArgStringList &CmdArgs) const; 70 void AddSparcTargetArgs(const llvm::opt::ArgList &Args, 71 llvm::opt::ArgStringList &CmdArgs) const; 72 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args, 73 llvm::opt::ArgStringList &CmdArgs) const; 74 void AddX86TargetArgs(const llvm::opt::ArgList &Args, 75 llvm::opt::ArgStringList &CmdArgs) const; 76 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, 77 llvm::opt::ArgStringList &CmdArgs) const; 78 void AddLanaiTargetArgs(const llvm::opt::ArgList &Args, 79 llvm::opt::ArgStringList &CmdArgs) const; 80 void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args, 81 llvm::opt::ArgStringList &CmdArgs) const; 82 void AddVETargetArgs(const llvm::opt::ArgList &Args, 83 llvm::opt::ArgStringList &CmdArgs) const; 84 85 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 86 87 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 88 const InputInfoList &inputs, 89 llvm::opt::ArgStringList &cmdArgs, 90 RewriteKind rewrite) const; 91 92 void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType, 93 llvm::opt::ArgStringList &CmdArgs) const; 94 95 mutable std::unique_ptr<llvm::raw_fd_ostream> CompilationDatabase = nullptr; 96 void DumpCompilationDatabase(Compilation &C, StringRef Filename, 97 StringRef Target, 98 const InputInfo &Output, const InputInfo &Input, 99 const llvm::opt::ArgList &Args) const; 100 101 void DumpCompilationDatabaseFragmentToDir( 102 StringRef Dir, Compilation &C, StringRef Target, const InputInfo &Output, 103 const InputInfo &Input, const llvm::opt::ArgList &Args) const; 104 105 public: 106 Clang(const ToolChain &TC, bool HasIntegratedBackend = true); 107 ~Clang() override; 108 109 bool hasGoodDiagnostics() const override { return true; } 110 bool hasIntegratedAssembler() const override { return true; } 111 bool hasIntegratedBackend() const override { return HasBackend; } 112 bool hasIntegratedCPP() const override { return true; } 113 bool canEmitIR() const override { return true; } 114 115 void ConstructJob(Compilation &C, const JobAction &JA, 116 const InputInfo &Output, const InputInfoList &Inputs, 117 const llvm::opt::ArgList &TCArgs, 118 const char *LinkingOutput) const override; 119 }; 120 121 /// Clang integrated assembler tool. 122 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 123 public: 124 ClangAs(const ToolChain &TC) 125 : Tool("clang::as", "clang integrated assembler", TC) {} 126 void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args, 127 llvm::opt::ArgStringList &CmdArgs) const; 128 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 129 llvm::opt::ArgStringList &CmdArgs) const; 130 void AddX86TargetArgs(const llvm::opt::ArgList &Args, 131 llvm::opt::ArgStringList &CmdArgs) const; 132 void AddRISCVTargetArgs(const llvm::opt::ArgList &Args, 133 llvm::opt::ArgStringList &CmdArgs) const; 134 bool hasGoodDiagnostics() const override { return true; } 135 bool hasIntegratedAssembler() const override { return false; } 136 bool hasIntegratedCPP() const override { return false; } 137 138 void ConstructJob(Compilation &C, const JobAction &JA, 139 const InputInfo &Output, const InputInfoList &Inputs, 140 const llvm::opt::ArgList &TCArgs, 141 const char *LinkingOutput) const override; 142 }; 143 144 /// Offload bundler tool. 145 class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool { 146 public: 147 OffloadBundler(const ToolChain &TC) 148 : Tool("offload bundler", "clang-offload-bundler", TC) {} 149 150 bool hasIntegratedCPP() const override { return false; } 151 void ConstructJob(Compilation &C, const JobAction &JA, 152 const InputInfo &Output, const InputInfoList &Inputs, 153 const llvm::opt::ArgList &TCArgs, 154 const char *LinkingOutput) const override; 155 void ConstructJobMultipleOutputs(Compilation &C, const JobAction &JA, 156 const InputInfoList &Outputs, 157 const InputInfoList &Inputs, 158 const llvm::opt::ArgList &TCArgs, 159 const char *LinkingOutput) const override; 160 }; 161 162 /// Offload binary tool. 163 class LLVM_LIBRARY_VISIBILITY OffloadPackager final : public Tool { 164 public: 165 OffloadPackager(const ToolChain &TC) 166 : Tool("Offload::Packager", "clang-offload-packager", TC) {} 167 168 bool hasIntegratedCPP() const override { return false; } 169 void ConstructJob(Compilation &C, const JobAction &JA, 170 const InputInfo &Output, const InputInfoList &Inputs, 171 const llvm::opt::ArgList &TCArgs, 172 const char *LinkingOutput) const override; 173 }; 174 175 /// Linker wrapper tool. 176 class LLVM_LIBRARY_VISIBILITY LinkerWrapper final : public Tool { 177 const Tool *Linker; 178 179 public: 180 LinkerWrapper(const ToolChain &TC, const Tool *Linker) 181 : Tool("Offload::Linker", "linker", TC), Linker(Linker) {} 182 183 bool hasIntegratedCPP() const override { return false; } 184 void ConstructJob(Compilation &C, const JobAction &JA, 185 const InputInfo &Output, const InputInfoList &Inputs, 186 const llvm::opt::ArgList &TCArgs, 187 const char *LinkingOutput) const override; 188 }; 189 190 enum class DwarfFissionKind { None, Split, Single }; 191 192 DwarfFissionKind getDebugFissionKind(const Driver &D, 193 const llvm::opt::ArgList &Args, 194 llvm::opt::Arg *&Arg); 195 196 // Calculate the output path of the module file when compiling a module unit 197 // with the `-fmodule-output` option or `-fmodule-output=` option specified. 198 // The behavior is: 199 // - If `-fmodule-output=` is specfied, then the module file is 200 // writing to the value. 201 // - Otherwise if the output object file of the module unit is specified, the 202 // output path 203 // of the module file should be the same with the output object file except 204 // the corresponding suffix. This requires both `-o` and `-c` are specified. 205 // - Otherwise, the output path of the module file will be the same with the 206 // input with the corresponding suffix. 207 llvm::SmallString<256> 208 getCXX20NamedModuleOutputPath(const llvm::opt::ArgList &Args, 209 const char *BaseInput); 210 211 } // end namespace tools 212 213 } // end namespace driver 214 } // end namespace clang 215 216 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H 217