brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 6193328 Raw
190 lines · c
1//===--- Cuda.h - Cuda 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_CUDA_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H11 12#include "clang/Basic/Cuda.h"13#include "clang/Driver/Action.h"14#include "clang/Driver/CudaInstallationDetector.h"15#include "clang/Driver/Multilib.h"16#include "clang/Driver/Tool.h"17#include "clang/Driver/ToolChain.h"18#include "llvm/Support/Compiler.h"19#include "llvm/Support/VersionTuple.h"20#include <bitset>21#include <set>22#include <vector>23 24namespace clang {25namespace driver {26namespace tools {27namespace NVPTX {28 29// Run ptxas, the NVPTX assembler.30class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool {31public:32  Assembler(const ToolChain &TC) : Tool("NVPTX::Assembler", "ptxas", TC) {}33 34  bool hasIntegratedCPP() const override { return false; }35 36  void ConstructJob(Compilation &C, const JobAction &JA,37                    const InputInfo &Output, const InputInfoList &Inputs,38                    const llvm::opt::ArgList &TCArgs,39                    const char *LinkingOutput) const override;40};41 42// Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX43// assembly into a single output file.44class LLVM_LIBRARY_VISIBILITY FatBinary : public Tool {45public:46  FatBinary(const ToolChain &TC) : Tool("NVPTX::Linker", "fatbinary", TC) {}47 48  bool hasIntegratedCPP() const override { return false; }49 50  void ConstructJob(Compilation &C, const JobAction &JA,51                    const InputInfo &Output, const InputInfoList &Inputs,52                    const llvm::opt::ArgList &TCArgs,53                    const char *LinkingOutput) const override;54};55 56// Runs nvlink, which links GPU object files ("cubin" files) into a single file.57class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {58public:59  Linker(const ToolChain &TC) : Tool("NVPTX::Linker", "nvlink", TC) {}60 61  bool hasIntegratedCPP() const override { return false; }62 63  void ConstructJob(Compilation &C, const JobAction &JA,64                    const InputInfo &Output, const InputInfoList &Inputs,65                    const llvm::opt::ArgList &TCArgs,66                    const char *LinkingOutput) const override;67};68 69void getNVPTXTargetFeatures(const Driver &D, const llvm::Triple &Triple,70                            const llvm::opt::ArgList &Args,71                            std::vector<StringRef> &Features);72 73} // end namespace NVPTX74} // end namespace tools75 76namespace toolchains {77 78class LLVM_LIBRARY_VISIBILITY NVPTXToolChain : public ToolChain {79public:80  NVPTXToolChain(const Driver &D, const llvm::Triple &Triple,81                 const llvm::Triple &HostTriple,82                 const llvm::opt::ArgList &Args);83 84  NVPTXToolChain(const Driver &D, const llvm::Triple &Triple,85                 const llvm::opt::ArgList &Args);86 87  llvm::opt::DerivedArgList *88  TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,89                Action::OffloadKind DeviceOffloadKind) const override;90 91  void92  addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,93                        llvm::opt::ArgStringList &CC1Args,94                        Action::OffloadKind DeviceOffloadKind) const override;95  void96  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,97                            llvm::opt::ArgStringList &CC1Args) const override;98 99  // Never try to use the integrated assembler with CUDA; always fork out to100  // ptxas.101  bool useIntegratedAs() const override { return false; }102  bool isCrossCompiling() const override { return true; }103  bool isPICDefault() const override { return false; }104  bool isPIEDefault(const llvm::opt::ArgList &Args) const override {105    return false;106  }107  bool HasNativeLLVMSupport() const override { return true; }108  bool isPICDefaultForced() const override { return false; }109  bool SupportsProfiling() const override { return false; }110 111  bool IsMathErrnoDefault() const override { return false; }112 113  bool supportsDebugInfoOption(const llvm::opt::Arg *A) const override;114  void adjustDebugInfoKind(llvm::codegenoptions::DebugInfoKind &DebugInfoKind,115                           const llvm::opt::ArgList &Args) const override;116 117  // NVPTX supports only DWARF2.118  unsigned GetDefaultDwarfVersion() const override { return 2; }119  unsigned getMaxDwarfVersion() const override { return 2; }120 121  /// Uses nvptx-arch tool to get arch of the system GPU. Will return error122  /// if unable to find one.123  virtual Expected<SmallVector<std::string>>124  getSystemGPUArchs(const llvm::opt::ArgList &Args) const override;125 126  CudaInstallationDetector CudaInstallation;127 128protected:129  Tool *buildAssembler() const override; // ptxas.130  Tool *buildLinker() const override;    // nvlink.131};132 133class LLVM_LIBRARY_VISIBILITY CudaToolChain : public NVPTXToolChain {134public:135  CudaToolChain(const Driver &D, const llvm::Triple &Triple,136                const ToolChain &HostTC, const llvm::opt::ArgList &Args);137 138  const llvm::Triple *getAuxTriple() const override {139    return &HostTC.getTriple();140  }141 142  bool HasNativeLLVMSupport() const override { return false; }143 144  std::string getInputFilename(const InputInfo &Input) const override;145 146  llvm::opt::DerivedArgList *147  TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,148                Action::OffloadKind DeviceOffloadKind) const override;149  void150  addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,151                        llvm::opt::ArgStringList &CC1Args,152                        Action::OffloadKind DeviceOffloadKind) const override;153 154  llvm::DenormalMode getDefaultDenormalModeForType(155      const llvm::opt::ArgList &DriverArgs, const JobAction &JA,156      const llvm::fltSemantics *FPType = nullptr) const override;157 158  void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,159                          llvm::opt::ArgStringList &CC1Args) const override;160 161  void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;162  CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;163  void164  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,165                            llvm::opt::ArgStringList &CC1Args) const override;166  void AddClangCXXStdlibIncludeArgs(167      const llvm::opt::ArgList &Args,168      llvm::opt::ArgStringList &CC1Args) const override;169  void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,170                           llvm::opt::ArgStringList &CC1Args) const override;171 172  SanitizerMask getSupportedSanitizers() const override;173 174  VersionTuple175  computeMSVCVersion(const Driver *D,176                     const llvm::opt::ArgList &Args) const override;177 178  const ToolChain &HostTC;179 180protected:181  Tool *buildAssembler() const override; // ptxas182  Tool *buildLinker() const override;    // fatbinary (ok, not really a linker)183};184 185} // end namespace toolchains186} // end namespace driver187} // end namespace clang188 189#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_CUDA_H190