brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 9adad5c Raw
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