1 //===--- Clang.h - Clang Tool and ToolChain Implementations ====-*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Clang_H
10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Clang_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"
27 /// Clang compiler tool.
28 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
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);
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;
44 void RenderTargetOptions(const llvm::Triple &EffectiveTriple,
45 const llvm::opt::ArgList &Args, bool KernelOrKext,
46 llvm::opt::ArgStringList &CmdArgs) const;
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;
77 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
79 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
80 llvm::opt::ArgStringList &cmdArgs,
81 RewriteKind rewrite) const;
83 void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
84 llvm::opt::ArgStringList &CmdArgs,
85 codegenoptions::DebugInfoKind *DebugInfoKind,
86 bool *EmitCodeView) const;
88 visualstudio::Compiler *getCLFallback() const;
90 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
92 mutable std::unique_ptr<llvm::raw_fd_ostream> CompilationDatabase = nullptr;
93 void DumpCompilationDatabase(Compilation &C, StringRef Filename,
95 const InputInfo &Output, const InputInfo &Input,
96 const llvm::opt::ArgList &Args) const;
98 void DumpCompilationDatabaseFragmentToDir(
99 StringRef Dir, Compilation &C, StringRef Target, const InputInfo &Output,
100 const InputInfo &Input, const llvm::opt::ArgList &Args) const;
103 Clang(const ToolChain &TC);
106 bool hasGoodDiagnostics() const override { return true; }
107 bool hasIntegratedAssembler() const override { return true; }
108 bool hasIntegratedCPP() const override { return true; }
109 bool canEmitIR() const override { return true; }
111 void ConstructJob(Compilation &C, const JobAction &JA,
112 const InputInfo &Output, const InputInfoList &Inputs,
113 const llvm::opt::ArgList &TCArgs,
114 const char *LinkingOutput) const override;
117 /// Clang integrated assembler tool.
118 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
120 ClangAs(const ToolChain &TC)
121 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
122 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
123 llvm::opt::ArgStringList &CmdArgs) const;
124 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
125 llvm::opt::ArgStringList &CmdArgs) const;
126 void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,
127 llvm::opt::ArgStringList &CmdArgs) const;
128 bool hasGoodDiagnostics() const override { return true; }
129 bool hasIntegratedAssembler() const override { return false; }
130 bool hasIntegratedCPP() const override { return false; }
132 void ConstructJob(Compilation &C, const JobAction &JA,
133 const InputInfo &Output, const InputInfoList &Inputs,
134 const llvm::opt::ArgList &TCArgs,
135 const char *LinkingOutput) const override;
138 /// Offload bundler tool.
139 class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool {
141 OffloadBundler(const ToolChain &TC)
142 : Tool("offload bundler", "clang-offload-bundler", TC) {}
144 bool hasIntegratedCPP() const override { return false; }
145 void ConstructJob(Compilation &C, const JobAction &JA,
146 const InputInfo &Output, const InputInfoList &Inputs,
147 const llvm::opt::ArgList &TCArgs,
148 const char *LinkingOutput) const override;
149 void ConstructJobMultipleOutputs(Compilation &C, const JobAction &JA,
150 const InputInfoList &Outputs,
151 const InputInfoList &Inputs,
152 const llvm::opt::ArgList &TCArgs,
153 const char *LinkingOutput) const override;
156 /// Offload wrapper tool.
157 class LLVM_LIBRARY_VISIBILITY OffloadWrapper final : public Tool {
159 OffloadWrapper(const ToolChain &TC)
160 : Tool("offload wrapper", "clang-offload-wrapper", TC) {}
162 bool hasIntegratedCPP() const override { return false; }
163 void ConstructJob(Compilation &C, const JobAction &JA,
164 const InputInfo &Output, const InputInfoList &Inputs,
165 const llvm::opt::ArgList &TCArgs,
166 const char *LinkingOutput) const override;
169 } // end namespace tools
171 } // end namespace driver
172 } // end namespace clang
174 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H