clang 24.0.0git
TargetID.cpp
Go to the documentation of this file.
1//===--- TargetID.cpp - Utilities for parsing target ID -------------------===//
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
11#include "llvm/ADT/DenseMap.h"
12#include "llvm/Support/Path.h"
13#include "llvm/TargetParser/AMDGPUTargetParser.h"
14
15namespace clang {
16
17llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T,
18 llvm::StringRef ArchName) {
19 auto Split = ArchName.split(':');
20 if (!T.isAMDGPU())
21 return Split.first;
22
23 if (llvm::StringRef Name = llvm::AMDGPU::getCanonicalArchName(T, Split.first);
24 !Name.empty())
25 return Name;
26
27 // Accept the AMDGPU subarch triple spelling (e.g. "amdgpu9.00") as an alias
28 // for the corresponding gfx processor.
30 getSubArchOffloadArch(llvm::Triple::parseSubArch(Split.first));
31 if (Arch.isUnknown())
32 return {};
34}
35
36// For a specific processor, a feature either shows up in all target IDs, or
37// does not show up in any target IDs. Otherwise the target ID combination is
38// invalid.
39std::optional<std::pair<llvm::StringRef, llvm::StringRef>>
41 struct Info {
42 llvm::StringRef TargetID;
43 bool HasXnack;
44 bool HasSramEcc;
45 };
46
47 llvm::SmallDenseMap<llvm::AMDGPU::GPUKind, Info> Seen;
48 for (const auto &[T, ID] : Entries) {
49 std::optional<llvm::AMDGPU::TargetID> Parsed =
50 llvm::AMDGPU::TargetID::parse(T, ID);
51 if (!Parsed)
52 continue;
53
54 // A feature is present in a target ID only when an explicit '+'/'-'
55 // modifier is given, not when it is left unspecified.
56 Info Cur{ID, Parsed->isXnackOnOrOff(), Parsed->isSramEccOnOrOff()};
57 auto [Loc, Inserted] = Seen.try_emplace(Parsed->getGPUKind(), Cur);
58 if (Inserted)
59 continue;
60
61 const Info &Prev = Loc->second;
62 if (Cur.HasXnack != Prev.HasXnack || Cur.HasSramEcc != Prev.HasSramEcc)
63 return std::make_pair(Prev.TargetID, ID);
64 }
65 return std::nullopt;
66}
67
68std::string sanitizeTargetIDInFileName(llvm::StringRef TargetID) {
69 std::string FileName = TargetID.str();
70 if (llvm::sys::path::is_style_windows(llvm::sys::path::Style::native))
71 llvm::replace(FileName, ':', '@');
72 return FileName;
73}
74
75} // namespace clang
A processor an offloading action can target.
Definition OffloadArch.h:32
Top level wrappers for InstallAPI frontend operations.
OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch)
std::string sanitizeTargetIDInFileName(llvm::StringRef TargetID)
Sanitize a target ID string for use in a file name.
Definition TargetID.cpp:68
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
Definition TargetID.cpp:17
std::optional< std::pair< llvm::StringRef, llvm::StringRef > > getConflictTargetIDCombination(llvm::ArrayRef< TargetIDEntry > Entries)
Get the conflicted pair of target IDs for a compilation or a bundled code object.
Definition TargetID.cpp:40
const FunctionProtoType * T
const char * OffloadArchToString(OffloadArch A)