Home | History | Annotate | Line # | Download | only in ToolChains
      1 //===- AMDGPUOpenMP.h - AMDGPUOpenMP ToolChain Implementation -*- 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-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPUOPENMP_H
     10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPUOPENMP_H
     11 
     12 #include "AMDGPU.h"
     13 #include "clang/Driver/Tool.h"
     14 #include "clang/Driver/ToolChain.h"
     15 
     16 namespace clang {
     17 namespace driver {
     18 
     19 namespace tools {
     20 
     21 namespace AMDGCN {
     22 // Runs llvm-link/opt/llc/lld, which links multiple LLVM bitcode, together with
     23 // device library, then compiles it to ISA in a shared object.
     24 class LLVM_LIBRARY_VISIBILITY OpenMPLinker : public Tool {
     25 public:
     26   OpenMPLinker(const ToolChain &TC)
     27       : Tool("AMDGCN::OpenMPLinker", "amdgcn-link", TC) {}
     28 
     29   bool hasIntegratedCPP() const override { return false; }
     30 
     31   void ConstructJob(Compilation &C, const JobAction &JA,
     32                     const InputInfo &Output, const InputInfoList &Inputs,
     33                     const llvm::opt::ArgList &TCArgs,
     34                     const char *LinkingOutput) const override;
     35 
     36 private:
     37   /// \return llvm-link output file name.
     38   const char *constructLLVMLinkCommand(Compilation &C, const JobAction &JA,
     39                                        const InputInfoList &Inputs,
     40                                        const llvm::opt::ArgList &Args,
     41                                        llvm::StringRef SubArchName,
     42                                        llvm::StringRef OutputFilePrefix) const;
     43 
     44   /// \return llc output file name.
     45   const char *constructLlcCommand(Compilation &C, const JobAction &JA,
     46                                   const InputInfoList &Inputs,
     47                                   const llvm::opt::ArgList &Args,
     48                                   llvm::StringRef SubArchName,
     49                                   llvm::StringRef OutputFilePrefix,
     50                                   const char *InputFileName,
     51                                   bool OutputIsAsm = false) const;
     52 
     53   void constructLldCommand(Compilation &C, const JobAction &JA,
     54                            const InputInfoList &Inputs, const InputInfo &Output,
     55                            const llvm::opt::ArgList &Args,
     56                            const char *InputFileName) const;
     57 };
     58 
     59 } // end namespace AMDGCN
     60 } // end namespace tools
     61 
     62 namespace toolchains {
     63 
     64 class LLVM_LIBRARY_VISIBILITY AMDGPUOpenMPToolChain final
     65     : public ROCMToolChain {
     66 public:
     67   AMDGPUOpenMPToolChain(const Driver &D, const llvm::Triple &Triple,
     68                         const ToolChain &HostTC,
     69                         const llvm::opt::ArgList &Args);
     70 
     71   const llvm::Triple *getAuxTriple() const override {
     72     return &HostTC.getTriple();
     73   }
     74 
     75   llvm::opt::DerivedArgList *
     76   TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
     77                 Action::OffloadKind DeviceOffloadKind) const override;
     78   void
     79   addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
     80                         llvm::opt::ArgStringList &CC1Args,
     81                         Action::OffloadKind DeviceOffloadKind) const override;
     82   void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
     83   CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
     84   void
     85   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
     86                             llvm::opt::ArgStringList &CC1Args) const override;
     87   void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,
     88                            llvm::opt::ArgStringList &CC1Args) const override;
     89 
     90   SanitizerMask getSupportedSanitizers() const override;
     91 
     92   VersionTuple
     93   computeMSVCVersion(const Driver *D,
     94                      const llvm::opt::ArgList &Args) const override;
     95 
     96   const ToolChain &HostTC;
     97 
     98 protected:
     99   Tool *buildLinker() const override;
    100 };
    101 
    102 } // end namespace toolchains
    103 } // end namespace driver
    104 } // end namespace clang
    105 
    106 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPUOPENMP_H
    107