clang  15.0.0git
ROCm.h
Go to the documentation of this file.
1 //===--- ROCm.h - ROCm installation detector --------------------*- 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_ROCM_H
10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ROCM_H
11 
12 #include "clang/Basic/Cuda.h"
13 #include "clang/Basic/LLVM.h"
14 #include "clang/Driver/Driver.h"
15 #include "clang/Driver/Options.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/StringMap.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Option/ArgList.h"
20 #include "llvm/Support/VersionTuple.h"
21 
22 namespace clang {
23 namespace driver {
24 
25 /// ABI version of device library.
27  unsigned ABIVersion = 0;
29  static DeviceLibABIVersion fromCodeObjectVersion(unsigned CodeObjectVersion) {
30  if (CodeObjectVersion < 4)
31  CodeObjectVersion = 4;
32  return DeviceLibABIVersion(CodeObjectVersion * 100);
33  }
34  /// Whether ABI version bc file is requested.
35  /// ABIVersion is code object version multiplied by 100. Code object v4
36  /// and below works with ROCm 5.0 and below which does not have
37  /// abi_version_*.bc. Code object v5 requires abi_version_500.bc.
38  bool requiresLibrary() { return ABIVersion >= 500; }
40  assert(ABIVersion % 100 == 0 && "Not supported");
41  return Twine(ABIVersion / 100).str();
42  }
43 };
44 
45 /// A class to find a viable ROCM installation
46 /// TODO: Generalize to handle libclc.
48 private:
49  struct ConditionalLibrary {
50  SmallString<0> On;
51  SmallString<0> Off;
52 
53  bool isValid() const { return !On.empty() && !Off.empty(); }
54 
55  StringRef get(bool Enabled) const {
56  assert(isValid());
57  return Enabled ? On : Off;
58  }
59  };
60 
61  // Installation path candidate.
62  struct Candidate {
64  bool StrictChecking;
65  // Release string for ROCm packages built with SPACK if not empty. The
66  // installation directories of ROCm packages built with SPACK follow the
67  // convention <package_name>-<rocm_release_string>-<hash>.
68  std::string SPACKReleaseStr;
69 
70  bool isSPACK() const { return !SPACKReleaseStr.empty(); }
71  Candidate(std::string Path, bool StrictChecking = false,
72  StringRef SPACKReleaseStr = {})
73  : Path(Path), StrictChecking(StrictChecking),
74  SPACKReleaseStr(SPACKReleaseStr.str()) {}
75  };
76 
77  const Driver &D;
78  bool HasHIPRuntime = false;
79  bool HasDeviceLibrary = false;
80 
81  // Default version if not detected or specified.
82  const unsigned DefaultVersionMajor = 3;
83  const unsigned DefaultVersionMinor = 5;
84  const char *DefaultVersionPatch = "0";
85 
86  // The version string in Major.Minor.Patch format.
87  std::string DetectedVersion;
88  // Version containing major and minor.
89  llvm::VersionTuple VersionMajorMinor;
90  // Version containing patch.
91  std::string VersionPatch;
92 
93  // ROCm path specified by --rocm-path.
94  StringRef RocmPathArg;
95  // ROCm device library paths specified by --rocm-device-lib-path.
96  std::vector<std::string> RocmDeviceLibPathArg;
97  // HIP runtime path specified by --hip-path.
98  StringRef HIPPathArg;
99  // HIP version specified by --hip-version.
100  StringRef HIPVersionArg;
101  // Wheter -nogpulib is specified.
102  bool NoBuiltinLibs = false;
103 
104  // Paths
105  SmallString<0> InstallPath;
106  SmallString<0> BinPath;
107  SmallString<0> LibPath;
108  SmallString<0> LibDevicePath;
109  SmallString<0> IncludePath;
110  llvm::StringMap<std::string> LibDeviceMap;
111 
112  // Libraries that are always linked.
113  SmallString<0> OCML;
114  SmallString<0> OCKL;
115 
116  // Libraries that are always linked depending on the language
117  SmallString<0> OpenCL;
118  SmallString<0> HIP;
119 
120  // Asan runtime library
121  SmallString<0> AsanRTL;
122 
123  // Libraries swapped based on compile flags.
124  ConditionalLibrary WavefrontSize64;
125  ConditionalLibrary FiniteOnly;
126  ConditionalLibrary UnsafeMath;
127  ConditionalLibrary DenormalsAreZero;
128  ConditionalLibrary CorrectlyRoundedSqrt;
129 
130  // Maps ABI version to library path. The version number is in the format of
131  // three digits as used in the ABI version library name.
132  std::map<unsigned, std::string> ABIVersionMap;
133 
134  // Cache ROCm installation search paths.
135  SmallVector<Candidate, 4> ROCmSearchDirs;
136  bool PrintROCmSearchDirs;
137  bool Verbose;
138 
139  bool allGenericLibsValid() const {
140  return !OCML.empty() && !OCKL.empty() && !OpenCL.empty() && !HIP.empty() &&
141  WavefrontSize64.isValid() && FiniteOnly.isValid() &&
142  UnsafeMath.isValid() && DenormalsAreZero.isValid() &&
143  CorrectlyRoundedSqrt.isValid();
144  }
145 
146  void scanLibDevicePath(llvm::StringRef Path);
147  bool parseHIPVersionFile(llvm::StringRef V);
148  const SmallVectorImpl<Candidate> &getInstallationPathCandidates();
149 
150  /// Find the path to a SPACK package under the ROCm candidate installation
151  /// directory if the candidate is a SPACK ROCm candidate. \returns empty
152  /// string if the candidate is not SPACK ROCm candidate or the requested
153  /// package is not found.
154  llvm::SmallString<0> findSPACKPackage(const Candidate &Cand,
155  StringRef PackageName);
156 
157 public:
158  RocmInstallationDetector(const Driver &D, const llvm::Triple &HostTriple,
159  const llvm::opt::ArgList &Args,
160  bool DetectHIPRuntime = true,
161  bool DetectDeviceLib = false);
162 
163  /// Get file paths of default bitcode libraries common to AMDGPU based
164  /// toolchains.
166  getCommonBitcodeLibs(const llvm::opt::ArgList &DriverArgs,
167  StringRef LibDeviceFile, bool Wave64, bool DAZ,
168  bool FiniteOnly, bool UnsafeMathOpt,
169  bool FastRelaxedMath, bool CorrectSqrt,
170  DeviceLibABIVersion ABIVer, bool isOpenMP) const;
171  /// Check file paths of default bitcode libraries common to AMDGPU based
172  /// toolchains. \returns false if there are invalid or missing files.
173  bool checkCommonBitcodeLibs(StringRef GPUArch, StringRef LibDeviceFile,
174  DeviceLibABIVersion ABIVer) const;
175 
176  /// Check whether we detected a valid HIP runtime.
177  bool hasHIPRuntime() const { return HasHIPRuntime; }
178 
179  /// Check whether we detected a valid ROCm device library.
180  bool hasDeviceLibrary() const { return HasDeviceLibrary; }
181 
182  /// Print information about the detected ROCm installation.
183  void print(raw_ostream &OS) const;
184 
185  /// Get the detected Rocm install's version.
186  // RocmVersion version() const { return Version; }
187 
188  /// Get the detected Rocm installation path.
189  StringRef getInstallPath() const { return InstallPath; }
190 
191  /// Get the detected path to Rocm's bin directory.
192  // StringRef getBinPath() const { return BinPath; }
193 
194  /// Get the detected Rocm Include path.
195  StringRef getIncludePath() const { return IncludePath; }
196 
197  /// Get the detected Rocm library path.
198  StringRef getLibPath() const { return LibPath; }
199 
200  /// Get the detected Rocm device library path.
201  StringRef getLibDevicePath() const { return LibDevicePath; }
202 
203  StringRef getOCMLPath() const {
204  assert(!OCML.empty());
205  return OCML;
206  }
207 
208  StringRef getOCKLPath() const {
209  assert(!OCKL.empty());
210  return OCKL;
211  }
212 
213  StringRef getOpenCLPath() const {
214  assert(!OpenCL.empty());
215  return OpenCL;
216  }
217 
218  StringRef getHIPPath() const {
219  assert(!HIP.empty());
220  return HIP;
221  }
222 
223  /// Returns empty string of Asan runtime library is not available.
224  StringRef getAsanRTLPath() const { return AsanRTL; }
225 
226  StringRef getWavefrontSize64Path(bool Enabled) const {
227  return WavefrontSize64.get(Enabled);
228  }
229 
230  StringRef getFiniteOnlyPath(bool Enabled) const {
231  return FiniteOnly.get(Enabled);
232  }
233 
234  StringRef getUnsafeMathPath(bool Enabled) const {
235  return UnsafeMath.get(Enabled);
236  }
237 
238  StringRef getDenormalsAreZeroPath(bool Enabled) const {
239  return DenormalsAreZero.get(Enabled);
240  }
241 
242  StringRef getCorrectlyRoundedSqrtPath(bool Enabled) const {
243  return CorrectlyRoundedSqrt.get(Enabled);
244  }
245 
246  StringRef getABIVersionPath(DeviceLibABIVersion ABIVer) const {
247  auto Loc = ABIVersionMap.find(ABIVer.ABIVersion);
248  if (Loc == ABIVersionMap.end())
249  return StringRef();
250  return Loc->second;
251  }
252 
253  /// Get libdevice file for given architecture
254  std::string getLibDeviceFile(StringRef Gpu) const {
255  return LibDeviceMap.lookup(Gpu);
256  }
257 
258  void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
259  llvm::opt::ArgStringList &CC1Args) const;
260 
261  void detectDeviceLibrary();
262  void detectHIPRuntime();
263 
264  /// Get the values for --rocm-device-lib-path arguments
265  std::vector<std::string> getRocmDeviceLibPathArg() const {
266  return RocmDeviceLibPathArg;
267  }
268 
269  /// Get the value for --rocm-path argument
270  StringRef getRocmPathArg() const { return RocmPathArg; }
271 
272  /// Get the value for --hip-version argument
273  StringRef getHIPVersionArg() const { return HIPVersionArg; }
274 
275  std::string getHIPVersion() const { return DetectedVersion; }
276 };
277 
278 } // end namespace driver
279 } // end namespace clang
280 
281 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ROCM_H
clang::OpenCL
@ OpenCL
Definition: LangStandard.h:62
clang::driver::RocmInstallationDetector::detectHIPRuntime
void detectHIPRuntime()
Definition: AMDGPU.cpp:441
clang::driver::RocmInstallationDetector::getLibPath
StringRef getLibPath() const
Get the detected Rocm library path.
Definition: ROCm.h:198
clang::driver::RocmInstallationDetector::getHIPVersion
std::string getHIPVersion() const
Definition: ROCm.h:275
clang::driver::RocmInstallationDetector::getInstallPath
StringRef getInstallPath() const
Get the detected Rocm install's version.
Definition: ROCm.h:189
clang::driver::RocmInstallationDetector::hasHIPRuntime
bool hasHIPRuntime() const
Check whether we detected a valid HIP runtime.
Definition: ROCm.h:177
clang::driver::RocmInstallationDetector::AddHIPIncludeArgs
void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
Definition: AMDGPU.cpp:486
clang::driver::RocmInstallationDetector::getDenormalsAreZeroPath
StringRef getDenormalsAreZeroPath(bool Enabled) const
Definition: ROCm.h:238
clang::driver::RocmInstallationDetector::getAsanRTLPath
StringRef getAsanRTLPath() const
Returns empty string of Asan runtime library is not available.
Definition: ROCm.h:224
Driver.h
string
string(SUBSTRING ${CMAKE_CURRENT_BINARY_DIR} 0 ${PATH_LIB_START} PATH_HEAD) string(SUBSTRING $
Definition: CMakeLists.txt:22
clang::driver::RocmInstallationDetector::getLibDevicePath
StringRef getLibDevicePath() const
Get the detected Rocm device library path.
Definition: ROCm.h:201
llvm::SmallVector< Candidate, 4 >
clang::driver::RocmInstallationDetector::detectDeviceLibrary
void detectDeviceLibrary()
Definition: AMDGPU.cpp:362
clang::driver::DeviceLibABIVersion::fromCodeObjectVersion
static DeviceLibABIVersion fromCodeObjectVersion(unsigned CodeObjectVersion)
Definition: ROCm.h:29
clang::driver::RocmInstallationDetector::getABIVersionPath
StringRef getABIVersionPath(DeviceLibABIVersion ABIVer) const
Definition: ROCm.h:246
clang::driver::RocmInstallationDetector::RocmInstallationDetector
RocmInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, const llvm::opt::ArgList &Args, bool DetectHIPRuntime=true, bool DetectDeviceLib=false)
Definition: AMDGPU.cpp:313
clang::driver::RocmInstallationDetector::checkCommonBitcodeLibs
bool checkCommonBitcodeLibs(StringRef GPUArch, StringRef LibDeviceFile, DeviceLibABIVersion ABIVer) const
Check file paths of default bitcode libraries common to AMDGPU based toolchains.
Definition: AMDGPU.cpp:872
clang::driver::DeviceLibABIVersion::ABIVersion
unsigned ABIVersion
Definition: ROCm.h:27
clang::driver::DeviceLibABIVersion
ABI version of device library.
Definition: ROCm.h:26
clang::driver::RocmInstallationDetector::getIncludePath
StringRef getIncludePath() const
Get the detected path to Rocm's bin directory.
Definition: ROCm.h:195
V
#define V(N, I)
Definition: ASTContext.h:3176
Options.h
clang::driver::RocmInstallationDetector::getOCKLPath
StringRef getOCKLPath() const
Definition: ROCm.h:208
clang::driver::RocmInstallationDetector::getCorrectlyRoundedSqrtPath
StringRef getCorrectlyRoundedSqrtPath(bool Enabled) const
Definition: ROCm.h:242
clang::driver::RocmInstallationDetector::getWavefrontSize64Path
StringRef getWavefrontSize64Path(bool Enabled) const
Definition: ROCm.h:226
clang::driver::RocmInstallationDetector::getOpenCLPath
StringRef getOpenCLPath() const
Definition: ROCm.h:213
llvm::SmallString< 0 >
clang::driver::RocmInstallationDetector::hasDeviceLibrary
bool hasDeviceLibrary() const
Check whether we detected a valid ROCm device library.
Definition: ROCm.h:180
clang::driver::RocmInstallationDetector::print
void print(raw_ostream &OS) const
Print information about the detected ROCm installation.
Definition: AMDGPU.cpp:480
clang::driver::DeviceLibABIVersion::DeviceLibABIVersion
DeviceLibABIVersion(unsigned V)
Definition: ROCm.h:28
clang::driver::RocmInstallationDetector::getHIPPath
StringRef getHIPPath() const
Definition: ROCm.h:218
clang::driver::RocmInstallationDetector::getHIPVersionArg
StringRef getHIPVersionArg() const
Get the value for –hip-version argument.
Definition: ROCm.h:273
clang::driver::RocmInstallationDetector::getFiniteOnlyPath
StringRef getFiniteOnlyPath(bool Enabled) const
Definition: ROCm.h:230
clang::driver::RocmInstallationDetector::getOCMLPath
StringRef getOCMLPath() const
Definition: ROCm.h:203
LLVM.h
clang::driver::RocmInstallationDetector
A class to find a viable ROCM installation TODO: Generalize to handle libclc.
Definition: ROCm.h:47
Cuda.h
clang::driver::RocmInstallationDetector::getLibDeviceFile
std::string getLibDeviceFile(StringRef Gpu) const
Get libdevice file for given architecture.
Definition: ROCm.h:254
clang
Definition: CalledOnceCheck.h:17
clang::driver::Driver
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Definition: Driver.h:71
clang::driver::RocmInstallationDetector::getRocmDeviceLibPathArg
std::vector< std::string > getRocmDeviceLibPathArg() const
Get the values for –rocm-device-lib-path arguments.
Definition: ROCm.h:265
clang::driver::RocmInstallationDetector::getUnsafeMathPath
StringRef getUnsafeMathPath(bool Enabled) const
Definition: ROCm.h:234
clang::driver::DeviceLibABIVersion::requiresLibrary
bool requiresLibrary()
Whether ABI version bc file is requested.
Definition: ROCm.h:38
clang::Language::HIP
@ HIP
llvm::SmallVectorImpl
Definition: Randstruct.h:18
clang::driver::RocmInstallationDetector::getRocmPathArg
StringRef getRocmPathArg() const
Get the value for –rocm-path argument.
Definition: ROCm.h:270
clang::driver::DeviceLibABIVersion::toString
std::string toString()
Definition: ROCm.h:39
clang::driver::RocmInstallationDetector::getCommonBitcodeLibs
llvm::SmallVector< std::string, 12 > getCommonBitcodeLibs(const llvm::opt::ArgList &DriverArgs, StringRef LibDeviceFile, bool Wave64, bool DAZ, bool FiniteOnly, bool UnsafeMathOpt, bool FastRelaxedMath, bool CorrectSqrt, DeviceLibABIVersion ABIVer, bool isOpenMP) const
Get file paths of default bitcode libraries common to AMDGPU based toolchains.
Definition: AMDGPU.cpp:891