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"
23
24using namespace llvm;
25using namespace llvm::offloading;
26using namespace llvm::offloading::sycl;
27
40
41std::pair<Constant *, GlobalVariable *>
43 Constant *Addr, StringRef Name,
44 uint64_t Size, uint32_t Flags,
45 uint64_t Data, Constant *AuxAddr) {
46 const llvm::Triple &Triple = M.getTargetTriple();
47 Type *PtrTy = PointerType::getUnqual(M.getContext());
48 Type *Int64Ty = Type::getInt64Ty(M.getContext());
49 Type *Int32Ty = Type::getInt32Ty(M.getContext());
50 Type *Int16Ty = Type::getInt16Ty(M.getContext());
51
52 Constant *AddrName = ConstantDataArray::getString(M.getContext(), Name);
53
54 StringRef Prefix =
55 Triple.isNVPTX() ? "$offloading$entry_name" : ".offloading.entry_name";
56
57 // Create the constant string used to look up the symbol in the device.
58 auto *Str =
59 new GlobalVariable(M, AddrName->getType(), /*isConstant=*/true,
60 GlobalValue::InternalLinkage, AddrName, Prefix);
61 StringRef SectionName = ".llvm.rodata.offloading";
62 Str->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
63 Str->setSection(SectionName);
64 Str->setAlignment(Align(1));
65
66 // Make a metadata node for these constants so it can be queried from IR.
67 NamedMDNode *MD = M.getOrInsertNamedMetadata("llvm.offloading.symbols");
68 Metadata *MDVals[] = {ConstantAsMetadata::get(Str)};
69 MD->addOperand(llvm::MDNode::get(M.getContext(), MDVals));
70
71 // Construct the offloading entry.
72 Constant *EntryData[] = {
74 ConstantInt::get(Int16Ty, 1),
75 ConstantInt::get(Int16Ty, Kind),
76 ConstantInt::get(Int32Ty, Flags),
79 ConstantInt::get(Int64Ty, Size),
80 ConstantInt::get(Int64Ty, Data),
83 Constant *EntryInitializer = ConstantStruct::get(getEntryTy(M), EntryData);
84 return {EntryInitializer, Str};
85}
86
88 return M.getTargetTriple().isOSBinFormatMachO() ? "__LLVM,offload_entries"
89 : "llvm_offload_entries";
90}
91
92/// Returns the start/end symbol names for iterating offloading entries in a
93/// given section. Mach-O uses \1section$start$/\1section$end$ convention;
94/// ELF/COFF use __start_/__stop_ prefixes.
95static std::pair<std::string, std::string>
97 if (T.isOSBinFormatMachO()) {
98 std::string SymSection = SectionName.str();
99 std::replace(SymSection.begin(), SymSection.end(), ',', '$');
100 return {"\1section$start$" + SymSection, "\1section$end$" + SymSection};
101 }
102 return {("__start_" + SectionName).str(), ("__stop_" + SectionName).str()};
103}
104
106 Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name,
107 uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr) {
108 const llvm::Triple &Triple = M.getTargetTriple();
110
111 auto [EntryInitializer, NameGV] = getOffloadingEntryInitializer(
112 M, Kind, Addr, Name, Size, Flags, Data, AuxAddr);
113
114 StringRef Prefix =
115 Triple.isNVPTX() ? "$offloading$entry$" : ".offloading.entry.";
116 auto *Entry = new GlobalVariable(
117 M, getEntryTy(M),
118 /*isConstant=*/true, GlobalValue::WeakAnyLinkage, EntryInitializer,
119 Prefix + Name, nullptr, GlobalValue::NotThreadLocal,
120 M.getDataLayout().getDefaultGlobalsAddressSpace());
121
122 // The entry has to be created in the section the linker expects it to be.
124 Entry->setSection((SectionName + "$OE").str());
125 else
126 Entry->setSection(SectionName);
127 Entry->setAlignment(Align(object::OffloadBinary::getAlignment()));
128 return Entry;
129}
130
131std::pair<GlobalVariable *, GlobalVariable *>
133 const llvm::Triple &Triple = M.getTargetTriple();
135
136 auto *ZeroInitilaizer =
138 auto *EntryInit = Triple.isOSBinFormatCOFF() ? ZeroInitilaizer : nullptr;
139 auto *EntryType = ArrayType::get(getEntryTy(M), 0);
142
143 auto [StartName, StopName] =
145
146 auto *EntriesB = new GlobalVariable(M, EntryType, /*isConstant=*/true,
147 Linkage, EntryInit, StartName);
148 EntriesB->setVisibility(GlobalValue::HiddenVisibility);
149 auto *EntriesE = new GlobalVariable(M, EntryType, /*isConstant=*/true,
150 Linkage, EntryInit, StopName);
151 EntriesE->setVisibility(GlobalValue::HiddenVisibility);
152
153 if (Triple.isOSBinFormatELF()) {
154 // We assume that external begin/end symbols that we have created above will
155 // be defined by the linker. This is done whenever a section name with a
156 // valid C-identifier is present. We define a dummy variable here to force
157 // the linker to always provide these symbols.
158 auto *DummyEntry = new GlobalVariable(
159 M, ZeroInitilaizer->getType(), true, GlobalVariable::InternalLinkage,
160 ZeroInitilaizer, "__dummy." + SectionName);
161 DummyEntry->setSection(SectionName);
162 DummyEntry->setAlignment(Align(object::OffloadBinary::getAlignment()));
163 appendToUsed(M, DummyEntry);
164 } else if (Triple.isOSBinFormatMachO()) {
165 // Mach-O needs a dummy variable in the section (like ELF) to ensure the
166 // linker provides the section boundary symbols. Mark it used so the
167 // section survives dead-stripping.
168 auto *DummyEntry = new GlobalVariable(
169 M, ZeroInitilaizer->getType(), true, GlobalVariable::InternalLinkage,
170 ZeroInitilaizer, "__dummy." + SectionName);
171 DummyEntry->setSection(SectionName);
172 DummyEntry->setAlignment(Align(object::OffloadBinary::getAlignment()));
173 appendToUsed(M, DummyEntry);
174 } else {
175 // The COFF linker will merge sections containing a '$' together into a
176 // single section. The order of entries in this section will be sorted
177 // alphabetically by the characters following the '$' in the name. Set the
178 // sections here to ensure that the beginning and end symbols are sorted.
179 EntriesB->setSection((SectionName + "$OA").str());
180 EntriesE->setSection((SectionName + "$OZ").str());
181 }
182
183 return std::make_pair(EntriesB, EntriesE);
184}
185
187 uint32_t ImageFlags,
188 StringRef EnvTargetID) {
189 using namespace llvm::ELF;
190 StringRef EnvArch = EnvTargetID.split(":").first;
191
192 // Trivial check if the base processors match.
193 if (EnvArch != ImageArch)
194 return false;
195
196 // Check if the image is requesting xnack on or off.
197 switch (ImageFlags & EF_AMDGPU_FEATURE_XNACK_V4) {
199 // The image is 'xnack-' so the environment must be 'xnack-'.
200 if (!EnvTargetID.contains("xnack-"))
201 return false;
202 break;
204 // The image is 'xnack+' so the environment must be 'xnack+'.
205 if (!EnvTargetID.contains("xnack+"))
206 return false;
207 break;
210 default:
211 break;
212 }
213
214 // Check if the image is requesting sramecc on or off.
215 switch (ImageFlags & EF_AMDGPU_FEATURE_SRAMECC_V4) {
217 // The image is 'sramecc-' so the environment must be 'sramecc-'.
218 if (!EnvTargetID.contains("sramecc-"))
219 return false;
220 break;
222 // The image is 'sramecc+' so the environment must be 'sramecc+'.
223 if (!EnvTargetID.contains("sramecc+"))
224 return false;
225 break;
228 break;
229 }
230
231 return true;
232}
233
234namespace {
235/// Reads the AMDGPU specific per-kernel-metadata from an image.
236class KernelInfoReader {
237public:
239 : KernelInfoMap(KIM) {}
240
241 /// Process ELF note to read AMDGPU metadata from respective information
242 /// fields.
243 Error processNote(const llvm::object::ELF64LE::Note &Note, size_t Align) {
244 if (Note.getName() != "AMDGPU")
245 return Error::success(); // We are not interested in other things
246
247 assert(Note.getType() == ELF::NT_AMDGPU_METADATA &&
248 "Parse AMDGPU MetaData");
249 auto Desc = Note.getDesc(Align);
250 StringRef MsgPackString =
251 StringRef(reinterpret_cast<const char *>(Desc.data()), Desc.size());
252 msgpack::Document MsgPackDoc;
253 if (!MsgPackDoc.readFromBlob(MsgPackString, /*Multi=*/false))
254 return Error::success();
255
257 if (!Verifier.verify(MsgPackDoc.getRoot()))
258 return Error::success();
259
260 auto RootMap = MsgPackDoc.getRoot().getMap(true);
261
262 if (auto Err = iterateAMDKernels(RootMap))
263 return Err;
264
265 return Error::success();
266 }
267
268private:
269 /// Extracts the relevant information via simple string look-up in the msgpack
270 /// document elements.
271 Error
272 extractKernelData(msgpack::MapDocNode::MapTy::value_type V,
273 std::string &KernelName,
275 if (!V.first.isString())
276 return Error::success();
277
278 const auto IsKey = [](const msgpack::DocNode &DK, StringRef SK) {
279 return DK.getString() == SK;
280 };
281
282 const auto GetSequenceOfThreeInts = [](msgpack::DocNode &DN,
283 uint32_t *Vals) {
284 assert(DN.isArray() && "MsgPack DocNode is an array node");
285 auto DNA = DN.getArray();
286 assert(DNA.size() == 3 && "ArrayNode has at most three elements");
287
288 int I = 0;
289 for (auto DNABegin = DNA.begin(), DNAEnd = DNA.end(); DNABegin != DNAEnd;
290 ++DNABegin) {
291 Vals[I++] = DNABegin->getUInt();
292 }
293 };
294
295 if (IsKey(V.first, ".name")) {
296 KernelName = V.second.toString();
297 } else if (IsKey(V.first, ".sgpr_count")) {
298 KernelData.SGPRCount = V.second.getUInt();
299 } else if (IsKey(V.first, ".sgpr_spill_count")) {
300 KernelData.SGPRSpillCount = V.second.getUInt();
301 } else if (IsKey(V.first, ".vgpr_count")) {
302 KernelData.VGPRCount = V.second.getUInt();
303 } else if (IsKey(V.first, ".vgpr_spill_count")) {
304 KernelData.VGPRSpillCount = V.second.getUInt();
305 } else if (IsKey(V.first, ".agpr_count")) {
306 KernelData.AGPRCount = V.second.getUInt();
307 } else if (IsKey(V.first, ".private_segment_fixed_size")) {
308 KernelData.PrivateSegmentSize = V.second.getUInt();
309 } else if (IsKey(V.first, ".group_segment_fixed_size")) {
310 KernelData.GroupSegmentList = V.second.getUInt();
311 } else if (IsKey(V.first, ".reqd_workgroup_size")) {
312 GetSequenceOfThreeInts(V.second, KernelData.RequestedWorkgroupSize);
313 } else if (IsKey(V.first, ".workgroup_size_hint")) {
314 GetSequenceOfThreeInts(V.second, KernelData.WorkgroupSizeHint);
315 } else if (IsKey(V.first, ".wavefront_size")) {
316 KernelData.WavefrontSize = V.second.getUInt();
317 } else if (IsKey(V.first, ".max_flat_workgroup_size")) {
318 KernelData.MaxFlatWorkgroupSize = V.second.getUInt();
319 } else if (IsKey(V.first, ".args")) {
320 auto ArgsArray = V.second.getArray();
321 for (auto ArgIt = ArgsArray.begin(), ArgEnd = ArgsArray.end();
322 ArgIt != ArgEnd; ++ArgIt) {
323 auto ArgMap = ArgIt->getMap();
324
325 auto OffsetIt = ArgMap.find(".offset");
326 if (OffsetIt == ArgMap.end())
327 return createStringError(
329 "Missing required .offset key in kernel argument metadata map");
330
331 auto SizeIt = ArgMap.find(".size");
332 if (SizeIt == ArgMap.end())
333 return createStringError(
335 "Missing required .size key in kernel argument metadata map");
336
337 KernelData.ArgMDs.emplace_back(OffsetIt->second.getUInt(),
338 SizeIt->second.getUInt());
339 }
340 }
341
342 return Error::success();
343 }
344
345 /// Get the "amdhsa.kernels" element from the msgpack Document
346 Expected<msgpack::ArrayDocNode> getAMDKernelsArray(msgpack::MapDocNode &MDN) {
347 auto Res = MDN.find("amdhsa.kernels");
348 if (Res == MDN.end())
350 "Could not find amdhsa.kernels key");
351
352 auto Pair = *Res;
353 assert(Pair.second.isArray() &&
354 "AMDGPU kernel entries are arrays of entries");
355
356 return Pair.second.getArray();
357 }
358
359 /// Iterate all entries for one "amdhsa.kernels" entry. Each entry is a
360 /// MapDocNode that either maps a string to a single value (most of them) or
361 /// to another array of things. Currently, we only handle the case that maps
362 /// to scalar value.
363 Error generateKernelInfo(msgpack::ArrayDocNode::ArrayTy::iterator It) {
364 offloading::amdgpu::AMDGPUKernelMetaData KernelData;
365 std::string KernelName;
366 auto Entry = (*It).getMap();
367 for (auto MI = Entry.begin(), E = Entry.end(); MI != E; ++MI)
368 if (auto Err = extractKernelData(*MI, KernelName, KernelData))
369 return Err;
370
371 KernelInfoMap.insert({KernelName, KernelData});
372 return Error::success();
373 }
374
375 /// Go over the list of AMD kernels in the "amdhsa.kernels" entry
376 Error iterateAMDKernels(msgpack::MapDocNode &MDN) {
377 auto KernelsOrErr = getAMDKernelsArray(MDN);
378 if (auto Err = KernelsOrErr.takeError())
379 return Err;
380
381 auto KernelsArr = *KernelsOrErr;
382 for (auto It = KernelsArr.begin(), E = KernelsArr.end(); It != E; ++It) {
383 if (!It->isMap())
384 continue; // we expect <key,value> pairs
385
386 // Obtain the value for the different entries. Each array entry is a
387 // MapDocNode
388 if (auto Err = generateKernelInfo(It))
389 return Err;
390 }
391 return Error::success();
392 }
393
394 // Kernel names are the keys
395 StringMap<offloading::amdgpu::AMDGPUKernelMetaData> &KernelInfoMap;
396};
397} // namespace
398
400 MemoryBufferRef MemBuffer,
402 uint16_t &ELFABIVersion) {
403 Error Err = Error::success(); // Used later as out-parameter
404
405 auto ELFOrError = object::ELF64LEFile::create(MemBuffer.getBuffer());
406 if (auto Err = ELFOrError.takeError())
407 return Err;
408
409 const object::ELF64LEFile ELFObj = ELFOrError.get();
411 if (!Sections)
412 return Sections.takeError();
413 KernelInfoReader Reader(KernelInfoMap);
414
415 // Read the code object version from ELF image header
416 auto Header = ELFObj.getHeader();
417 ELFABIVersion = (uint8_t)(Header.e_ident[ELF::EI_ABIVERSION]);
418 for (const auto &S : *Sections) {
419 if (S.sh_type != ELF::SHT_NOTE)
420 continue;
421
422 for (const auto N : ELFObj.notes(S, Err)) {
423 if (Err)
424 return Err;
425 // Fills the KernelInfoTabel entries in the reader
426 if ((Err = Reader.processNote(N, S.sh_addralign)))
427 return Err;
428 }
429 }
430 return Error::success();
431}
432
433Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
435 object::ImageKind ImageKind,
436 object::OffloadKind OffloadKind,
437 int32_t ImageFlags,
439 using namespace object;
440
441 // Create inner OffloadBinary containing the raw image.
442 OffloadBinary::OffloadingImage InnerImage;
443 InnerImage.TheImageKind = ImageKind;
444 InnerImage.TheOffloadKind = OffloadKind;
445 InnerImage.Flags = ImageFlags;
446
447 InnerImage.StringData["triple"] = Triple.getTriple();
448 for (const auto &[Key, Value] : MetaData)
449 InnerImage.StringData[Key] = Value;
450
451 InnerImage.Image = std::move(Img);
452
453 SmallString<0> InnerBinaryData = OffloadBinary::write(InnerImage);
454
455 Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
456 return Error::success();
457}
458
460 std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
461 StringRef CompileOpts, StringRef LinkOpts) {
462 constexpr char INTEL_ONEOMP_OFFLOAD_VERSION[] = "1.0";
463
465 "Expected SPIR-V triple with Intel vendor");
466
468 MetaData["version"] = INTEL_ONEOMP_OFFLOAD_VERSION;
469 if (!CompileOpts.empty())
470 MetaData["compile-opts"] = CompileOpts;
471 if (!LinkOpts.empty())
472 MetaData["link-opts"] = LinkOpts;
473
475 object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
476 MetaData);
477}
478
480 uint32_t Count = Names.size();
481
482 // Compute the byte offset where string data begins: right after the header
483 // and the entry array.
484 uint32_t StringDataOffset =
485 sizeof(SymbolTableHeader) + Count * sizeof(SymbolTableEntry);
486
487 // Compute total size and reserve to prevent reallocation while writing
488 // entries via pointer (append() could otherwise invalidate the pointer).
489 uint32_t TotalSize = StringDataOffset;
490 for (StringRef N : Names)
491 TotalSize += N.size() + 1;
492 Out.reserve(TotalSize);
493 Out.resize(StringDataOffset);
494
495 // Write the header.
496 auto *Header = reinterpret_cast<SymbolTableHeader *>(Out.data());
497 Header->Count = Count;
498
499 // Write each entry and append the corresponding null-terminated name.
500 auto *Entries = reinterpret_cast<SymbolTableEntry *>(Header + 1);
501 uint32_t CurrentOffset = StringDataOffset;
502 for (uint32_t I = 0; I < Count; ++I) {
503 Entries[I].OffsetToSymbol = CurrentOffset;
504 Entries[I].SymbolSize = Names[I].size();
505 Out.append(Names[I]);
506 Out.push_back('\0');
507 CurrentOffset += Names[I].size() + 1;
508 }
509}
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...
This file declares classes for handling the YAML representation of ELF.
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:96
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 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:873
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:867
const std::string & getTriple() const
Definition Triple.h:579
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:985
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition Triple.h:518
bool isSPIRV() const
Tests whether the target is SPIR-V (32/64-bit/Logical).
Definition Triple.h:973
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:864
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:1996
@ EI_ABIVERSION
Definition ELF.h:59
@ SHT_NOTE
Definition ELF.h:1162
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
Definition ELF.h:909
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
Definition ELF.h:920
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
Definition ELF.h:924
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
Definition ELF.h:907
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
Definition ELF.h:911
@ EF_AMDGPU_FEATURE_XNACK_V4
Definition ELF.h:905
@ EF_AMDGPU_FEATURE_SRAMECC_V4
Definition ELF.h:918
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
Definition ELF.h:913
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
Definition ELF.h:922
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
Definition ELF.h:926
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:399
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:186
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:459
LLVM_ABI void writeSymbolTable(ArrayRef< StringRef > Names, SmallString< 0 > &Out)
Serialize Names into Out.
Definition Utility.cpp:479
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:433
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:42
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:28
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:105
LLVM_ABI std::pair< GlobalVariable *, GlobalVariable * > getOffloadEntryArray(Module &M)
Creates a pair of globals used to iterate the array of offloading entries by accessing the section va...
Definition Utility.cpp:132
LLVM_ABI StringRef getOffloadEntrySection(Module &M)
Create an offloading section struct used to register this global at runtime.
Definition Utility.cpp:87
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:128
uint32_t SGPRSpillCount
Number of stores from a scalar register to a register allocator created spill location.
Definition Utility.h:143
uint32_t SGPRCount
Number of scalar registers required by a wavefront.
Definition Utility.h:138
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:161
uint32_t VGPRSpillCount
Number of stores from a vector register to a register allocator created spill location.
Definition Utility.h:146
uint32_t VGPRCount
Number of vector registers required by each work-item.
Definition Utility.h:140
uint32_t PrivateSegmentSize
The amount of fixed private address space memory required for a work-item in bytes.
Definition Utility.h:136
uint32_t GroupSegmentList
The amount of group segment memory required by a work-group in bytes.
Definition Utility.h:133
uint32_t MaxFlatWorkgroupSize
Maximum flat work-group size supported by the kernel in work-items.
Definition Utility.h:157
uint32_t WorkgroupSizeHint[3]
Corresponds to the OpenCL work_group_size_hint attribute.
Definition Utility.h:153
uint32_t AGPRCount
Number of accumulator registers required by each work-item.
Definition Utility.h:148
uint32_t RequestedWorkgroupSize[3]
Corresponds to the OpenCL reqd_work_group_size attribute.
Definition Utility.h:150
Serialized symbol table stored in the "symbols" entry of a SYCL OffloadBinary.
Definition Utility.h:200
uint32_t Count
Number of symbol entries.
Definition Utility.h:201
Common declarations for yaml2obj.