Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/Clang.h
35269 views
//===--- Clang.h - Clang Tool and ToolChain Implementations ====-*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H9#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H1011#include "MSVC.h"12#include "clang/Driver/Driver.h"13#include "clang/Driver/Tool.h"14#include "clang/Driver/Types.h"15#include "llvm/Frontend/Debug/Options.h"16#include "llvm/Option/Option.h"17#include "llvm/Support/raw_ostream.h"18#include "llvm/TargetParser/Triple.h"1920namespace clang {21class ObjCRuntime;22namespace driver {2324namespace tools {2526/// Clang compiler tool.27class LLVM_LIBRARY_VISIBILITY Clang : public Tool {28// Indicates whether this instance has integrated backend using29// internal LLVM infrastructure.30bool HasBackend;3132public:33static const char *getBaseInputName(const llvm::opt::ArgList &Args,34const InputInfo &Input);35static const char *getBaseInputStem(const llvm::opt::ArgList &Args,36const InputInfoList &Inputs);37static const char *getDependencyFileName(const llvm::opt::ArgList &Args,38const InputInfoList &Inputs);3940private:41void AddPreprocessingOptions(Compilation &C, const JobAction &JA,42const Driver &D, const llvm::opt::ArgList &Args,43llvm::opt::ArgStringList &CmdArgs,44const InputInfo &Output,45const InputInfoList &Inputs) const;4647void RenderTargetOptions(const llvm::Triple &EffectiveTriple,48const llvm::opt::ArgList &Args, bool KernelOrKext,49llvm::opt::ArgStringList &CmdArgs) const;5051void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,52llvm::opt::ArgStringList &CmdArgs) const;53void AddARMTargetArgs(const llvm::Triple &Triple,54const llvm::opt::ArgList &Args,55llvm::opt::ArgStringList &CmdArgs,56bool KernelOrKext) const;57void AddARM64TargetArgs(const llvm::opt::ArgList &Args,58llvm::opt::ArgStringList &CmdArgs) const;59void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args,60llvm::opt::ArgStringList &CmdArgs) const;61void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,62llvm::opt::ArgStringList &CmdArgs) const;63void AddPPCTargetArgs(const llvm::opt::ArgList &Args,64llvm::opt::ArgStringList &CmdArgs) const;65void AddR600TargetArgs(const llvm::opt::ArgList &Args,66llvm::opt::ArgStringList &CmdArgs) const;67void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,68llvm::opt::ArgStringList &CmdArgs) const;69void AddSparcTargetArgs(const llvm::opt::ArgList &Args,70llvm::opt::ArgStringList &CmdArgs) const;71void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,72llvm::opt::ArgStringList &CmdArgs) const;73void AddX86TargetArgs(const llvm::opt::ArgList &Args,74llvm::opt::ArgStringList &CmdArgs) const;75void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,76llvm::opt::ArgStringList &CmdArgs) const;77void AddLanaiTargetArgs(const llvm::opt::ArgList &Args,78llvm::opt::ArgStringList &CmdArgs) const;79void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,80llvm::opt::ArgStringList &CmdArgs) const;81void AddVETargetArgs(const llvm::opt::ArgList &Args,82llvm::opt::ArgStringList &CmdArgs) const;8384enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };8586ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,87const InputInfoList &inputs,88llvm::opt::ArgStringList &cmdArgs,89RewriteKind rewrite) const;9091void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,92llvm::opt::ArgStringList &CmdArgs) const;9394mutable std::unique_ptr<llvm::raw_fd_ostream> CompilationDatabase = nullptr;95void DumpCompilationDatabase(Compilation &C, StringRef Filename,96StringRef Target,97const InputInfo &Output, const InputInfo &Input,98const llvm::opt::ArgList &Args) const;99100void DumpCompilationDatabaseFragmentToDir(101StringRef Dir, Compilation &C, StringRef Target, const InputInfo &Output,102const InputInfo &Input, const llvm::opt::ArgList &Args) const;103104public:105Clang(const ToolChain &TC, bool HasIntegratedBackend = true);106~Clang() override;107108bool hasGoodDiagnostics() const override { return true; }109bool hasIntegratedAssembler() const override { return true; }110bool hasIntegratedBackend() const override { return HasBackend; }111bool hasIntegratedCPP() const override { return true; }112bool canEmitIR() const override { return true; }113114void ConstructJob(Compilation &C, const JobAction &JA,115const InputInfo &Output, const InputInfoList &Inputs,116const llvm::opt::ArgList &TCArgs,117const char *LinkingOutput) const override;118};119120/// Clang integrated assembler tool.121class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {122public:123ClangAs(const ToolChain &TC)124: Tool("clang::as", "clang integrated assembler", TC) {}125void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args,126llvm::opt::ArgStringList &CmdArgs) const;127void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,128llvm::opt::ArgStringList &CmdArgs) const;129void AddX86TargetArgs(const llvm::opt::ArgList &Args,130llvm::opt::ArgStringList &CmdArgs) const;131void AddRISCVTargetArgs(const llvm::opt::ArgList &Args,132llvm::opt::ArgStringList &CmdArgs) const;133bool hasGoodDiagnostics() const override { return true; }134bool hasIntegratedAssembler() const override { return false; }135bool hasIntegratedCPP() const override { return false; }136137void ConstructJob(Compilation &C, const JobAction &JA,138const InputInfo &Output, const InputInfoList &Inputs,139const llvm::opt::ArgList &TCArgs,140const char *LinkingOutput) const override;141};142143/// Offload bundler tool.144class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool {145public:146OffloadBundler(const ToolChain &TC)147: Tool("offload bundler", "clang-offload-bundler", TC) {}148149bool hasIntegratedCPP() const override { return false; }150void ConstructJob(Compilation &C, const JobAction &JA,151const InputInfo &Output, const InputInfoList &Inputs,152const llvm::opt::ArgList &TCArgs,153const char *LinkingOutput) const override;154void ConstructJobMultipleOutputs(Compilation &C, const JobAction &JA,155const InputInfoList &Outputs,156const InputInfoList &Inputs,157const llvm::opt::ArgList &TCArgs,158const char *LinkingOutput) const override;159};160161/// Offload binary tool.162class LLVM_LIBRARY_VISIBILITY OffloadPackager final : public Tool {163public:164OffloadPackager(const ToolChain &TC)165: Tool("Offload::Packager", "clang-offload-packager", TC) {}166167bool hasIntegratedCPP() const override { return false; }168void ConstructJob(Compilation &C, const JobAction &JA,169const InputInfo &Output, const InputInfoList &Inputs,170const llvm::opt::ArgList &TCArgs,171const char *LinkingOutput) const override;172};173174/// Linker wrapper tool.175class LLVM_LIBRARY_VISIBILITY LinkerWrapper final : public Tool {176const Tool *Linker;177178public:179LinkerWrapper(const ToolChain &TC, const Tool *Linker)180: Tool("Offload::Linker", "linker", TC), Linker(Linker) {}181182bool hasIntegratedCPP() const override { return false; }183void ConstructJob(Compilation &C, const JobAction &JA,184const InputInfo &Output, const InputInfoList &Inputs,185const llvm::opt::ArgList &TCArgs,186const char *LinkingOutput) const override;187};188189enum class DwarfFissionKind { None, Split, Single };190191DwarfFissionKind getDebugFissionKind(const Driver &D,192const llvm::opt::ArgList &Args,193llvm::opt::Arg *&Arg);194195// Calculate the output path of the module file when compiling a module unit196// with the `-fmodule-output` option or `-fmodule-output=` option specified.197// The behavior is:198// - If `-fmodule-output=` is specfied, then the module file is199// writing to the value.200// - Otherwise if the output object file of the module unit is specified, the201// output path202// of the module file should be the same with the output object file except203// the corresponding suffix. This requires both `-o` and `-c` are specified.204// - Otherwise, the output path of the module file will be the same with the205// input with the corresponding suffix.206llvm::SmallString<256>207getCXX20NamedModuleOutputPath(const llvm::opt::ArgList &Args,208const char *BaseInput);209210} // end namespace tools211212} // end namespace driver213} // end namespace clang214215#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CLANG_H216217218