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