211 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H11 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 21namespace clang {22class ObjCRuntime;23namespace driver {24 25namespace tools {26 27/// Clang compiler tool.28class LLVM_LIBRARY_VISIBILITY Clang : public Tool {29 // Indicates whether this instance has integrated backend using30 // internal LLVM infrastructure.31 bool HasBackend;32 33public: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 41private: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 105public: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.122class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {123public: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.145class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool {146public: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.163class LLVM_LIBRARY_VISIBILITY OffloadPackager final : public Tool {164public:165 OffloadPackager(const ToolChain &TC)166 : Tool("Offload::Packager", "llvm-offload-binary", 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.176class LLVM_LIBRARY_VISIBILITY LinkerWrapper final : public Tool {177 const Tool *Linker;178 179public: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// Calculate the output path of the module file when compiling a module unit191// with the `-fmodule-output` option or `-fmodule-output=` option specified.192// The behavior is:193// - If `-fmodule-output=` is specfied, then the module file is194// writing to the value.195// - Otherwise if the output object file of the module unit is specified, the196// output path197// of the module file should be the same with the output object file except198// the corresponding suffix. This requires both `-o` and `-c` are specified.199// - Otherwise, the output path of the module file will be the same with the200// input with the corresponding suffix.201llvm::SmallString<256>202getCXX20NamedModuleOutputPath(const llvm::opt::ArgList &Args,203 const char *BaseInput);204 205} // end namespace tools206 207} // end namespace driver208} // end namespace clang209 210#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H211