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: OpenMPLinker(const ToolChain & TC)26 OpenMPLinker(const ToolChain &TC) 27 : Tool("AMDGCN::OpenMPLinker", "amdgcn-link", TC) {} 28 hasIntegratedCPP()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 getAuxTriple()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