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