LLVM 24.0.0git
Utility.cpp
Go to the documentation of this file.
1//===- Utility.cpp ------ Collection of generic offloading utilities ------===//
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
13#include "llvm/IR/Constants.h"
14#include "llvm/IR/GlobalValue.h"
16#include "llvm/IR/Value.h"
22
23using namespace llvm;
24using namespace llvm::offloading;
25using namespace llvm::offloading::sycl;
26
39
40std::pair<Constant *, GlobalVariable *>
42 Constant *Addr, StringRef Name,
43 uint64_t Size, uint32_t Flags,
44 uint64_t Data, Constant *AuxAddr) {
45 const llvm::Triple &Triple = M.getTargetTriple();
46 Type *PtrTy = PointerType::getUnqual(M.getContext());
47 Type *Int64Ty = Type::getInt64Ty(M.getContext());
48 Type *Int32Ty = Type::getInt32Ty(M.getContext());
49 Type *Int16Ty = Type::getInt16Ty(M.getContext());
50
51 Constant *AddrName = ConstantDataArray::getString(M.getContext(), Name);
52
53 StringRef Prefix =
54 Triple.isNVPTX() ? "$offloading$entry_name" : ".offloading.entry_name";
55
56 // Create the constant string used to look up the symbol in the device.
57 auto *Str =
58 new GlobalVariable(M, AddrName->getType(), /*isConstant=*/true,
59 GlobalValue::InternalLinkage, AddrName, Prefix);
60 StringRef SectionName = ".llvm.rodata.offloading";
61 Str->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
62 Str->setSection(SectionName);
63 Str->setAlignment(Align(1));
64
65 // Make a metadata node for these constants so it can be queried from IR.
66 NamedMDNode *MD = M.getOrInsertNamedMetadata("llvm.offloading.symbols");
67 Metadata *MDVals[] = {ConstantAsMetadata::get(Str)};
68 MD->addOperand(llvm::MDNode::get(M.getContext(), MDVals));
69
70 // Construct the offloading entry.
71 Constant *EntryData[] = {
73 ConstantInt::get(Int16Ty, 1),
74 ConstantInt::get(Int16Ty, Kind),
75 ConstantInt::get(Int32Ty, Flags),
78 ConstantInt::get(Int64Ty, Size),
79 ConstantInt::get(Int64Ty, Data),
82 Constant *EntryInitializer = ConstantStruct::get(getEntryTy(M), EntryData);
83 return {EntryInitializer, Str};
84}
85
87 return M.getTargetTriple().isOSBinFormatMachO() ? "__LLVM,offload_entries"
88 : "llvm_offload_entries";
89}
90
91/// Returns the start/end symbol names for iterating offloading entries in a
92/// given section. Mach-O uses \1section$start$/\1section$end$ convention;
93/// ELF/COFF use __start_/__stop_ prefixes.
94static std::pair<std::string, std::string>
96 if (T.isOSBinFormatMachO()) {
97 std::string SymSection = SectionName.str();
98 std::replace(SymSection.begin(), SymSection.end(), ',', '$');
99 return {"\1section$start$" + SymSection, "\1section$end$" + SymSection};
100 }
101 return {("__start_" + SectionName).str(), ("__stop_" + SectionName).str()};
102}
103
105 Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name,
106 uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr) {
107 const llvm::Triple &Triple = M.getTargetTriple();
109
110 auto [EntryInitializer, NameGV] = getOffloadingEntryInitializer(
111 M, Kind, Addr, Name, Size, Flags, Data, AuxAddr);
112
113 StringRef Prefix =
114 Triple.isNVPTX() ? "$offloading$entry$" : ".offloading.entry.";
115 auto *Entry = new GlobalVariable(
116 M, getEntryTy(M),
117 /*isConstant=*/true, GlobalValue::WeakAnyLinkage, EntryInitializer,
118 Prefix + Name, nullptr, GlobalValue::NotThreadLocal,
119 M.getDataLayout().getDefaultGlobalsAddressSpace());
120
121 // The entry has to be created in the section the linker expects it to be.
123 Entry->setSection((SectionName + "$OE").str());
124 else
125 Entry->setSection(SectionName);
126 Entry->setAlignment(Align(object::OffloadBinary::getAlignment()));
127 return Entry;
128}
129
130std::pair<Constant *, Constant *> offloading::getOffloadEntryArray(Module &M) {
131 const llvm::Triple &Triple = M.getTargetTriple();
133
134 constexpr unsigned COFFSentinelEntryCount = 1;
135 unsigned EntryCount =
136 Triple.isOSBinFormatCOFF() ? COFFSentinelEntryCount : 0u;
137 auto *ZeroInitializer =
139 auto *EntryInit = Triple.isOSBinFormatCOFF() ? ZeroInitializer : nullptr;
140 auto *EntryType = ZeroInitializer->getType();
143
144 auto [StartName, StopName] =
146
147 auto *EntriesB = new GlobalVariable(M, EntryType, /*isConstant=*/true,
148 Linkage, EntryInit, StartName);
149 EntriesB->setVisibility(GlobalValue::HiddenVisibility);
150 auto *EntriesE = new GlobalVariable(M, EntryType, /*isConstant=*/true,
151 Linkage, EntryInit, StopName);
152 EntriesE->setVisibility(GlobalValue::HiddenVisibility);
153
154 if (Triple.isOSBinFormatELF()) {
155 // We assume that external begin/end symbols that we have created above will
156 // be defined by the linker. This is done whenever a section name with a
157 // valid C-identifier is present. We define a dummy variable here to force
158 // the linker to always provide these symbols.
159 auto *DummyEntry = new GlobalVariable(
160 M, ZeroInitializer->getType(), true, GlobalVariable::InternalLinkage,
161 ZeroInitializer, "__dummy." + SectionName);
162 DummyEntry->setSection(SectionName);
163 DummyEntry->setAlignment(Align(object::OffloadBinary::getAlignment()));
164 appendToUsed(M, DummyEntry);
165 } else if (Triple.isOSBinFormatMachO()) {
166 // Mach-O needs a dummy variable in the section (like ELF) to ensure the
167 // linker provides the section boundary symbols. Mark it used so the
168 // section survives dead-stripping.
169 auto *DummyEntry = new GlobalVariable(
170 M, ZeroInitializer->getType(), true, GlobalVariable::InternalLinkage,
171 ZeroInitializer, "__dummy." + SectionName);
172 DummyEntry->setSection(SectionName);
173 DummyEntry->setAlignment(Align(object::OffloadBinary::getAlignment()));
174 appendToUsed(M, DummyEntry);
175 } else {
176 // The COFF linker will merge sections containing a '$' together into a
177 // single section. The order of entries in this section will be sorted
178 // alphabetically by the characters following the '$' in the name. Set the
179 // sections here to ensure that the beginning and end symbols are sorted.
180 EntriesB->setSection((SectionName + "$OA").str());
181 EntriesE->setSection((SectionName + "$OZ").str());
182 EntriesB->setAlignment(Align(object::OffloadBinary::getAlignment()));
183 EntriesE->setAlignment(Align(object::OffloadBinary::getAlignment()));
184
185 // COFF lays out offload entries by sorted subsections: $OA is a synthetic
186 // begin sentinel, $OE contains real entries, and $OZ is a synthetic end
187 // sentinel. Keep the boundary sections non-empty so lld-link does not
188 // discard them under /opt:ref, but skip the begin sentinel for runtime
189 // users.
190 Type *Int32Ty = Type::getInt32Ty(M.getContext());
191 Constant *Indices[] = {ConstantInt::get(Int32Ty, 0),
192 ConstantInt::get(Int32Ty, COFFSentinelEntryCount)};
194 EntriesB->getValueType(), EntriesB, Indices);
195 return std::make_pair(BeginAfterSentinel, EntriesE);
196 }
197
198 return std::make_pair(EntriesB, EntriesE);
199}
200
202 uint32_t ImageFlags,
203 StringRef EnvTargetID) {
204 using namespace llvm::ELF;
205 StringRef EnvArch = EnvTargetID.split(":").first;
206
207 // Trivial check if the base processors match.
208 if (EnvArch != ImageArch)
209 return false;
210
211 // Check if the image is requesting xnack on or off.
212 switch (ImageFlags & EF_AMDGPU_FEATURE_XNACK_V4) {
214 // The image is 'xnack-' so the environment must be 'xnack-'.
215 if (!EnvTargetID.contains("xnack-"))
216 return false;
217 break;
219 // The image is 'xnack+' so the environment must be 'xnack+'.
220 if (!EnvTargetID.contains("xnack+"))
221 return false;
222 break;
225 default:
226 break;
227 }
228
229 // Check if the image is requesting sramecc on or off.
230 switch (ImageFlags & EF_AMDGPU_FEATURE_SRAMECC_V4) {
232 // The image is 'sramecc-' so the environment must be 'sramecc-'.
233 if (!EnvTargetID.contains("sramecc-"))
234 return false;
235 break;
237 // The image is 'sramecc+' so the environment must be 'sramecc+'.
238 if (!EnvTargetID.contains("sramecc+"))
239 return false;
240 break;
243 break;
244 }
245
246 return true;
247}
248
249namespace {
250/// Reads the AMDGPU specific per-kernel-metadata from an image.
251class KernelInfoReader {
252public:
254 : KernelInfoMap(KIM) {}
255
256 /// Process ELF note to read AMDGPU metadata from respective information
257 /// fields.
258 Error processNote(const llvm::object::ELF64LE::Note &Note, size_t Align) {
259 if (Note.getName() != "AMDGPU")
260 return Error::success(); // We are not interested in other things
261
262 assert(Note.getType() == ELF::NT_AMDGPU_METADATA &&
263 "Parse AMDGPU MetaData");
264 auto Desc = Note.getDesc(Align);
265 StringRef MsgPackString =
266 StringRef(reinterpret_cast<const char *>(Desc.data()), Desc.size());
267 msgpack::Document MsgPackDoc;
268 if (!MsgPackDoc.readFromBlob(MsgPackString, /*Multi=*/false))
269 return Error::success();
270
272 if (!Verifier.verify(MsgPackDoc.getRoot()))
273 return Error::success();
274
275 auto RootMap = MsgPackDoc.getRoot().getMap(true);
276
277 if (auto Err = iterateAMDKernels(RootMap))
278 return Err;
279
280 return Error::success();
281 }
282
283private:
284 /// Extracts the relevant information via simple string look-up in the msgpack
285 /// document elements.
286 Error
287 extractKernelData(msgpack::MapDocNode::MapTy::value_type V,
288 std::string &KernelName,
290 if (!V.first.isString())
291 return Error::success();
292
293 const auto IsKey = [](const msgpack::DocNode &DK, StringRef SK) {
294 return DK.getString() == SK;
295 };
296
297 const auto GetSequenceOfThreeInts = [](msgpack::DocNode &DN,
298 uint32_t *Vals) {
299 assert(DN.isArray() && "MsgPack DocNode is an array node");
300 auto DNA = DN.getArray();
301 assert(DNA.size() == 3 && "ArrayNode has at most three elements");
302
303 int I = 0;
304 for (auto DNABegin = DNA.begin(), DNAEnd = DNA.end(); DNABegin != DNAEnd;
305 ++DNABegin) {
306 Vals[I++] = DNABegin->getUInt();
307 }
308 };
309
310 if (IsKey(V.first, ".name")) {
311 KernelName = V.second.toString();
312 } else if (IsKey(V.first, ".sgpr_count")) {
313 KernelData.SGPRCount = V.second.getUInt();
314 } else if (IsKey(V.first, ".sgpr_spill_count")) {
315 KernelData.SGPRSpillCount = V.second.getUInt();
316 } else if (IsKey(V.first, ".vgpr_count")) {
317 KernelData.VGPRCount = V.second.getUInt();
318 } else if (IsKey(V.first, ".vgpr_spill_count")) {
319 KernelData.VGPRSpillCount = V.second.getUInt();
320 } else if (IsKey(V.first, ".agpr_count")) {
321 KernelData.AGPRCount = V.second.getUInt();
322 } else if (IsKey(V.first, ".private_segment_fixed_size")) {
323 KernelData.PrivateSegmentSize = V.second.getUInt();
324 } else if (IsKey(V.first, ".group_segment_fixed_size")) {
325 KernelData.GroupSegmentList = V.second.getUInt();
326 } else if (IsKey(V.first, ".reqd_workgroup_size")) {
327 GetSequenceOfThreeInts(V.second, KernelData.RequestedWorkgroupSize);
328 } else if (IsKey(V.first, ".workgroup_size_hint")) {
329 GetSequenceOfThreeInts(V.second, KernelData.WorkgroupSizeHint);
330 } else if (IsKey(V.first, ".wavefront_size")) {
331 KernelData.WavefrontSize = V.second.getUInt();
332 } else if (IsKey(V.first, ".max_flat_workgroup_size")) {
333 KernelData.MaxFlatWorkgroupSize = V.second.getUInt();
334 } else if (IsKey(V.first, ".args")) {
335 auto ArgsArray = V.second.getArray();
336 for (auto ArgIt = ArgsArray.begin(), ArgEnd = ArgsArray.end();
337 ArgIt != ArgEnd; ++ArgIt) {
338 auto ArgMap = ArgIt->getMap();
339
340 auto OffsetIt = ArgMap.find(".offset");
341 if (OffsetIt == ArgMap.end())
342 return createStringError(
344 "Missing required .offset key in kernel argument metadata map");
345
346 auto SizeIt = ArgMap.find(".size");
347 if (SizeIt == ArgMap.end())
348 return createStringError(
350 "Missing required .size key in kernel argument metadata map");
351
352 KernelData.ArgMDs.emplace_back(OffsetIt->second.getUInt(),
353 SizeIt->second.getUInt());
354 }
355 }
356
357 return Error::success();
358 }
359
360 /// Get the "amdhsa.kernels" element from the msgpack Document
361 Expected<msgpack::ArrayDocNode> getAMDKernelsArray(msgpack::MapDocNode &MDN) {
362 auto Res = MDN.find("amdhsa.kernels");
363 if (Res == MDN.end())
365 "Could not find amdhsa.kernels key");
366
367 auto Pair = *Res;
368 assert(Pair.second.isArray() &&
369 "AMDGPU kernel entries are arrays of entries");
370
371 return Pair.second.getArray();
372 }
373
374 /// Iterate all entries for one "amdhsa.kernels" entry. Each entry is a
375 /// MapDocNode that either maps a string to a single value (most of them) or
376 /// to another array of things. Currently, we only handle the case that maps
377 /// to scalar value.
378 Error generateKernelInfo(msgpack::ArrayDocNode::ArrayTy::iterator It) {
379 offloading::amdgpu::AMDGPUKernelMetaData KernelData;
380 std::string KernelName;
381 auto Entry = (*It).getMap();
382 for (auto MI = Entry.begin(), E = Entry.end(); MI != E; ++MI)
383 if (auto Err = extractKernelData(*MI, KernelName, KernelData))
384 return Err;
385
386 KernelInfoMap.insert({KernelName, KernelData});
387 return Error::success();
388 }
389
390 /// Go over the list of AMD kernels in the "amdhsa.kernels" entry
391 Error iterateAMDKernels(msgpack::MapDocNode &MDN) {
392 auto KernelsOrErr = getAMDKernelsArray(MDN);
393 if (auto Err = KernelsOrErr.takeError())
394 return Err;
395
396 auto KernelsArr = *KernelsOrErr;
397 for (auto It = KernelsArr.begin(), E = KernelsArr.end(); It != E; ++It) {
398 if (!It->isMap())
399 continue; // we expect <key,value> pairs
400
401 // Obtain the value for the different entries. Each array entry is a
402 // MapDocNode
403 if (auto Err = generateKernelInfo(It))
404 return Err;
405 }
406 return Error::success();
407 }
408
409 // Kernel names are the keys
410 StringMap<offloading::amdgpu::AMDGPUKernelMetaData> &KernelInfoMap;
411};
412} // namespace
413
415 MemoryBufferRef MemBuffer,
417 uint16_t &ELFABIVersion) {
418 Error Err = Error::success(); // Used later as out-parameter
419
420 auto ELFOrError = object::ELF64LEFile::create(MemBuffer.getBuffer());
421 if (auto Err = ELFOrError.takeError())
422 return Err;
423
424 const object::ELF64LEFile ELFObj = ELFOrError.get();
426 if (!Sections)
427 return Sections.takeError();
428 KernelInfoReader Reader(KernelInfoMap);
429
430 // Read the code object version from ELF image header
431 auto Header = ELFObj.getHeader();
432 ELFABIVersion = (uint8_t)(Header.e_ident[ELF::EI_ABIVERSION]);
433 for (const auto &S : *Sections) {
434 if (S.sh_type != ELF::SHT_NOTE)
435 continue;
436
437 for (const auto N : ELFObj.notes(S, Err)) {
438 if (Err)
439 return Err;
440 // Fills the KernelInfoTabel entries in the reader
441 if ((Err = Reader.processNote(N, S.sh_addralign)))
442 return Err;
443 }
444 }
445 return Error::success();
446}
447
448Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
450 object::ImageKind ImageKind,
451 object::OffloadKind OffloadKind,
452 int32_t ImageFlags,
454 using namespace object;
455
456 // Create inner OffloadBinary containing the raw image.
457 OffloadBinary::OffloadingImage InnerImage;
458 InnerImage.TheImageKind = ImageKind;
459 InnerImage.TheOffloadKind = OffloadKind;
460 InnerImage.Flags = ImageFlags;
461
462 InnerImage.StringData["triple"] = Triple.getTriple();
463 for (const auto &[Key, Value] : MetaData)
464 InnerImage.StringData[Key] = Value;
465
466 InnerImage.Image = std::move(Img);
467
468 SmallString<0> InnerBinaryData = OffloadBinary::write(InnerImage);
469
470 Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
471 return Error::success();
472}
473
475 std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
476 StringRef CompileOpts, StringRef LinkOpts) {
477 constexpr char INTEL_ONEOMP_OFFLOAD_VERSION[] = "1.0";
478
480 "Expected SPIR-V triple with Intel vendor");
481
483 MetaData["version"] = INTEL_ONEOMP_OFFLOAD_VERSION;
484 if (!CompileOpts.empty())
485 MetaData["compile-opts"] = CompileOpts;
486 if (!LinkOpts.empty())
487 MetaData["link-opts"] = LinkOpts;
488
490 object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
491 MetaData);
492}
493
495 uint32_t Count = Names.size();
496
497 // Compute the byte offset where string data begins: right after the header
498 // and the entry array.
499 uint32_t StringDataOffset =
500 sizeof(SymbolTableHeader) + Count * sizeof(SymbolTableEntry);
501
502 // Compute total size and reserve to prevent reallocation while writing
503 // entries via pointer (append() could otherwise invalidate the pointer).
504 uint32_t TotalSize = StringDataOffset;
505 for (StringRef N : Names)
506 TotalSize += N.size() + 1;
507 Out.reserve(TotalSize);
508 Out.resize(StringDataOffset);
509
510 // Write the header.
511 auto *Header = reinterpret_cast<SymbolTableHeader *>(Out.data());
512 Header->Count = Count;
513
514 // Write each entry and append the corresponding null-terminated name.
515 auto *Entries = reinterpret_cast<SymbolTableEntry *>(Header + 1);
516 uint32_t CurrentOffset = StringDataOffset;
517 for (uint32_t I = 0; I < Count; ++I) {
518 Entries[I].OffsetToSymbol = CurrentOffset;
519 Entries[I].SymbolSize = Names[I].size();
520 Out.append(Names[I]);
521 Out.push_back('\0');
522 CurrentOffset += Names[I].size() + 1;
523 }
524}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This is a verifier for AMDGPU HSA metadata, which can verify both well-typed metadata and untyped met...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
#define T
This file declares a class that exposes a simple in-memory representation of a document of MsgPack ob...
verify safepoint Safepoint IR Verifier
static std::pair< std::string, std::string > getOffloadEntryBoundarySymbols(const Triple &T, StringRef SectionName)
Returns the start/end symbol names for iterating offloading entries in a given section.
Definition Utility.cpp:95
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
Definition Constants.h:1507
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:58
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
StringRef getBuffer() const
static std::unique_ptr< MemoryBuffer > getMemBufferCopy(StringRef InputData, const Twine &BufferName="")
Open the specified memory range as a MemoryBuffer, copying the contents and taking ownership of it.
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A tuple of MDNodes.
Definition Metadata.h:1755
LLVM_ABI void addOperand(MDNode *M)
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
void append(StringRef RHS)
Append from a StringRef.
Definition SmallString.h:68
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:128
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:736
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
Class to represent struct types.
static LLVM_ABI StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
Definition Type.cpp:802
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Definition Type.cpp:683
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition Triple.h:874
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:868
const std::string & getTriple() const
Definition Triple.h:580
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:986
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition Triple.h:519
bool isSPIRV() const
Tests whether the target is SPIR-V (32/64-bit/Logical).
Definition Triple.h:974
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:865
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
Definition Type.cpp:308
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
A node in a MsgPack Document.
MapDocNode & getMap(bool Convert=false)
Get a MapDocNode for a map node.
ArrayDocNode & getArray(bool Convert=false)
Get an ArrayDocNode for an array node.
StringRef getString() const
Simple in-memory representation of a document of msgpack objects with ability to find and create arra...
DocNode & getRoot()
Get ref to the document's root element.
LLVM_ABI bool readFromBlob(StringRef Blob, bool Multi, function_ref< int(DocNode *DestNode, DocNode SrcNode, DocNode MapKey)> Merger=[](DocNode *DestNode, DocNode SrcNode, DocNode MapKey) { return -1;})
Read a document from a binary msgpack blob, merging into anything already in the Document.
MapTy::iterator find(DocNode Key)
const Elf_Ehdr & getHeader() const
Definition ELF.h:346
static Expected< ELFFile > create(StringRef Object)
iterator_range< Elf_Note_Iterator > notes(const Elf_Phdr &Phdr, Error &Err) const
Get an iterator range over notes of a program header.
Definition ELF.h:535
Expected< Elf_Shdr_Range > sections() const
Definition ELF.h:1037
static uint64_t getAlignment()
@ Entry
Definition COFF.h:862
@ NT_AMDGPU_METADATA
Definition ELF.h:1998
@ EI_ABIVERSION
Definition ELF.h:59
@ SHT_NOTE
Definition ELF.h:1163
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
Definition ELF.h:910
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
Definition ELF.h:921
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
Definition ELF.h:925
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
Definition ELF.h:908
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
Definition ELF.h:912
@ EF_AMDGPU_FEATURE_XNACK_V4
Definition ELF.h:906
@ EF_AMDGPU_FEATURE_SRAMECC_V4
Definition ELF.h:919
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
Definition ELF.h:914
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
Definition ELF.h:923
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
Definition ELF.h:927
OffloadKind
The producer of the associated offloading image.
ImageKind
The type of contents the offloading image contains.
ELFFile< ELF64LE > ELF64LEFile
Definition ELF.h:601
LLVM_ABI Error getAMDGPUMetaDataFromImage(MemoryBufferRef MemBuffer, StringMap< AMDGPUKernelMetaData > &KernelInfoMap, uint16_t &ELFABIVersion)
Reads AMDGPU specific metadata from the ELF file and propagates the KernelInfoMap.
Definition Utility.cpp:414
LLVM_ABI bool isImageCompatibleWithEnv(StringRef ImageArch, uint32_t ImageFlags, StringRef EnvTargetID)
Check if an image is compatible with current system's environment.
Definition Utility.cpp:201
LLVM_ABI Error containerizeOpenMPSPIRVImage(std::unique_ptr< MemoryBuffer > &Binary, llvm::Triple Triple, StringRef CompileOpts="", StringRef LinkOpts="")
Containerizes an OpenMP SPIR-V image into an OffloadBinary image.
Definition Utility.cpp:474
LLVM_ABI void writeSymbolTable(ArrayRef< StringRef > Names, SmallString< 0 > &Out)
Serialize Names into Out.
Definition Utility.cpp:494
LLVM_ABI std::pair< Constant *, Constant * > getOffloadEntryArray(Module &M)
Creates a pair of constants used to iterate the array of offloading entries by accessing the section ...
Definition Utility.cpp:130
LLVM_ABI Error containerizeImage(std::unique_ptr< MemoryBuffer > &Binary, llvm::Triple Triple, object::ImageKind ImageKind, object::OffloadKind OffloadKind, int32_t ImageFlags, MapVector< StringRef, StringRef > &MetaData)
Containerizes an image within an OffloadBinary image.
Definition Utility.cpp:448
LLVM_ABI std::pair< Constant *, GlobalVariable * > getOffloadingEntryInitializer(Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name, uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr)
Create a constant struct initializer used to register this global at runtime.
Definition Utility.cpp:41
LLVM_ABI StructType * getEntryTy(Module &M)
Returns the type of the offloading entry we use to store kernels and globals that will be registered ...
Definition Utility.cpp:27
LLVM_ABI GlobalVariable * emitOffloadingEntry(Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name, uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr=nullptr)
Definition Utility.cpp:104
LLVM_ABI StringRef getOffloadEntrySection(Module &M)
Create an offloading section struct used to register this global at runtime.
Definition Utility.cpp:86
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition Error.cpp:94
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321
Op::Description Desc
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI void appendToUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.used list.
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Elf_Note_Impl< ELFType< E, Is64 > > Note
Definition ELFTypes.h:90
This is the record of an object that just be registered with the offloading runtime.
Definition Utility.h:31
Struct for holding metadata related to AMDGPU kernels, for more information about the metadata and it...
Definition Utility.h:127
uint32_t SGPRSpillCount
Number of stores from a scalar register to a register allocator created spill location.
Definition Utility.h:142
uint32_t SGPRCount
Number of scalar registers required by a wavefront.
Definition Utility.h:137
SmallVector< std::pair< uint32_t, uint32_t >, 8 > ArgMDs
Per-argument {offset, size} in bytes, read from the ".args" array in code object metadata.
Definition Utility.h:160
uint32_t VGPRSpillCount
Number of stores from a vector register to a register allocator created spill location.
Definition Utility.h:145
uint32_t VGPRCount
Number of vector registers required by each work-item.
Definition Utility.h:139
uint32_t PrivateSegmentSize
The amount of fixed private address space memory required for a work-item in bytes.
Definition Utility.h:135
uint32_t GroupSegmentList
The amount of group segment memory required by a work-group in bytes.
Definition Utility.h:132
uint32_t MaxFlatWorkgroupSize
Maximum flat work-group size supported by the kernel in work-items.
Definition Utility.h:156
uint32_t WorkgroupSizeHint[3]
Corresponds to the OpenCL work_group_size_hint attribute.
Definition Utility.h:152
uint32_t AGPRCount
Number of accumulator registers required by each work-item.
Definition Utility.h:147
uint32_t RequestedWorkgroupSize[3]
Corresponds to the OpenCL reqd_work_group_size attribute.
Definition Utility.h:149
Serialized symbol table stored in the "symbols" entry of a SYCL OffloadBinary.
Definition Utility.h:199
uint32_t Count
Number of symbol entries.
Definition Utility.h:200
Common declarations for yaml2obj.