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