LLVM 23.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 appendToCompilerUsed(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.
167 auto *DummyEntry = new GlobalVariable(
168 M, ZeroInitilaizer->getType(), true, GlobalVariable::InternalLinkage,
169 ZeroInitilaizer, "__dummy." + SectionName);
170 DummyEntry->setSection(SectionName);
171 DummyEntry->setAlignment(Align(object::OffloadBinary::getAlignment()));
172 appendToCompilerUsed(M, DummyEntry);
173 } else {
174 // The COFF linker will merge sections containing a '$' together into a
175 // single section. The order of entries in this section will be sorted
176 // alphabetically by the characters following the '$' in the name. Set the
177 // sections here to ensure that the beginning and end symbols are sorted.
178 EntriesB->setSection((SectionName + "$OA").str());
179 EntriesE->setSection((SectionName + "$OZ").str());
180 }
181
182 return std::make_pair(EntriesB, EntriesE);
183}
184
186 uint32_t ImageFlags,
187 StringRef EnvTargetID) {
188 using namespace llvm::ELF;
189 StringRef EnvArch = EnvTargetID.split(":").first;
190
191 // Trivial check if the base processors match.
192 if (EnvArch != ImageArch)
193 return false;
194
195 // Check if the image is requesting xnack on or off.
196 switch (ImageFlags & EF_AMDGPU_FEATURE_XNACK_V4) {
198 // The image is 'xnack-' so the environment must be 'xnack-'.
199 if (!EnvTargetID.contains("xnack-"))
200 return false;
201 break;
203 // The image is 'xnack+' so the environment must be 'xnack+'.
204 if (!EnvTargetID.contains("xnack+"))
205 return false;
206 break;
209 default:
210 break;
211 }
212
213 // Check if the image is requesting sramecc on or off.
214 switch (ImageFlags & EF_AMDGPU_FEATURE_SRAMECC_V4) {
216 // The image is 'sramecc-' so the environment must be 'sramecc-'.
217 if (!EnvTargetID.contains("sramecc-"))
218 return false;
219 break;
221 // The image is 'sramecc+' so the environment must be 'sramecc+'.
222 if (!EnvTargetID.contains("sramecc+"))
223 return false;
224 break;
227 break;
228 }
229
230 return true;
231}
232
233namespace {
234/// Reads the AMDGPU specific per-kernel-metadata from an image.
235class KernelInfoReader {
236public:
238 : KernelInfoMap(KIM) {}
239
240 /// Process ELF note to read AMDGPU metadata from respective information
241 /// fields.
242 Error processNote(const llvm::object::ELF64LE::Note &Note, size_t Align) {
243 if (Note.getName() != "AMDGPU")
244 return Error::success(); // We are not interested in other things
245
246 assert(Note.getType() == ELF::NT_AMDGPU_METADATA &&
247 "Parse AMDGPU MetaData");
248 auto Desc = Note.getDesc(Align);
249 StringRef MsgPackString =
250 StringRef(reinterpret_cast<const char *>(Desc.data()), Desc.size());
251 msgpack::Document MsgPackDoc;
252 if (!MsgPackDoc.readFromBlob(MsgPackString, /*Multi=*/false))
253 return Error::success();
254
256 if (!Verifier.verify(MsgPackDoc.getRoot()))
257 return Error::success();
258
259 auto RootMap = MsgPackDoc.getRoot().getMap(true);
260
261 if (auto Err = iterateAMDKernels(RootMap))
262 return Err;
263
264 return Error::success();
265 }
266
267private:
268 /// Extracts the relevant information via simple string look-up in the msgpack
269 /// document elements.
270 Error
271 extractKernelData(msgpack::MapDocNode::MapTy::value_type V,
272 std::string &KernelName,
274 if (!V.first.isString())
275 return Error::success();
276
277 const auto IsKey = [](const msgpack::DocNode &DK, StringRef SK) {
278 return DK.getString() == SK;
279 };
280
281 const auto GetSequenceOfThreeInts = [](msgpack::DocNode &DN,
282 uint32_t *Vals) {
283 assert(DN.isArray() && "MsgPack DocNode is an array node");
284 auto DNA = DN.getArray();
285 assert(DNA.size() == 3 && "ArrayNode has at most three elements");
286
287 int I = 0;
288 for (auto DNABegin = DNA.begin(), DNAEnd = DNA.end(); DNABegin != DNAEnd;
289 ++DNABegin) {
290 Vals[I++] = DNABegin->getUInt();
291 }
292 };
293
294 if (IsKey(V.first, ".name")) {
295 KernelName = V.second.toString();
296 } else if (IsKey(V.first, ".sgpr_count")) {
297 KernelData.SGPRCount = V.second.getUInt();
298 } else if (IsKey(V.first, ".sgpr_spill_count")) {
299 KernelData.SGPRSpillCount = V.second.getUInt();
300 } else if (IsKey(V.first, ".vgpr_count")) {
301 KernelData.VGPRCount = V.second.getUInt();
302 } else if (IsKey(V.first, ".vgpr_spill_count")) {
303 KernelData.VGPRSpillCount = V.second.getUInt();
304 } else if (IsKey(V.first, ".agpr_count")) {
305 KernelData.AGPRCount = V.second.getUInt();
306 } else if (IsKey(V.first, ".private_segment_fixed_size")) {
307 KernelData.PrivateSegmentSize = V.second.getUInt();
308 } else if (IsKey(V.first, ".group_segment_fixed_size")) {
309 KernelData.GroupSegmentList = V.second.getUInt();
310 } else if (IsKey(V.first, ".reqd_workgroup_size")) {
311 GetSequenceOfThreeInts(V.second, KernelData.RequestedWorkgroupSize);
312 } else if (IsKey(V.first, ".workgroup_size_hint")) {
313 GetSequenceOfThreeInts(V.second, KernelData.WorkgroupSizeHint);
314 } else if (IsKey(V.first, ".wavefront_size")) {
315 KernelData.WavefrontSize = V.second.getUInt();
316 } else if (IsKey(V.first, ".max_flat_workgroup_size")) {
317 KernelData.MaxFlatWorkgroupSize = V.second.getUInt();
318 }
319
320 return Error::success();
321 }
322
323 /// Get the "amdhsa.kernels" element from the msgpack Document
324 Expected<msgpack::ArrayDocNode> getAMDKernelsArray(msgpack::MapDocNode &MDN) {
325 auto Res = MDN.find("amdhsa.kernels");
326 if (Res == MDN.end())
328 "Could not find amdhsa.kernels key");
329
330 auto Pair = *Res;
331 assert(Pair.second.isArray() &&
332 "AMDGPU kernel entries are arrays of entries");
333
334 return Pair.second.getArray();
335 }
336
337 /// Iterate all entries for one "amdhsa.kernels" entry. Each entry is a
338 /// MapDocNode that either maps a string to a single value (most of them) or
339 /// to another array of things. Currently, we only handle the case that maps
340 /// to scalar value.
341 Error generateKernelInfo(msgpack::ArrayDocNode::ArrayTy::iterator It) {
342 offloading::amdgpu::AMDGPUKernelMetaData KernelData;
343 std::string KernelName;
344 auto Entry = (*It).getMap();
345 for (auto MI = Entry.begin(), E = Entry.end(); MI != E; ++MI)
346 if (auto Err = extractKernelData(*MI, KernelName, KernelData))
347 return Err;
348
349 KernelInfoMap.insert({KernelName, KernelData});
350 return Error::success();
351 }
352
353 /// Go over the list of AMD kernels in the "amdhsa.kernels" entry
354 Error iterateAMDKernels(msgpack::MapDocNode &MDN) {
355 auto KernelsOrErr = getAMDKernelsArray(MDN);
356 if (auto Err = KernelsOrErr.takeError())
357 return Err;
358
359 auto KernelsArr = *KernelsOrErr;
360 for (auto It = KernelsArr.begin(), E = KernelsArr.end(); It != E; ++It) {
361 if (!It->isMap())
362 continue; // we expect <key,value> pairs
363
364 // Obtain the value for the different entries. Each array entry is a
365 // MapDocNode
366 if (auto Err = generateKernelInfo(It))
367 return Err;
368 }
369 return Error::success();
370 }
371
372 // Kernel names are the keys
373 StringMap<offloading::amdgpu::AMDGPUKernelMetaData> &KernelInfoMap;
374};
375} // namespace
376
378 MemoryBufferRef MemBuffer,
380 uint16_t &ELFABIVersion) {
381 Error Err = Error::success(); // Used later as out-parameter
382
383 auto ELFOrError = object::ELF64LEFile::create(MemBuffer.getBuffer());
384 if (auto Err = ELFOrError.takeError())
385 return Err;
386
387 const object::ELF64LEFile ELFObj = ELFOrError.get();
389 if (!Sections)
390 return Sections.takeError();
391 KernelInfoReader Reader(KernelInfoMap);
392
393 // Read the code object version from ELF image header
394 auto Header = ELFObj.getHeader();
395 ELFABIVersion = (uint8_t)(Header.e_ident[ELF::EI_ABIVERSION]);
396 for (const auto &S : *Sections) {
397 if (S.sh_type != ELF::SHT_NOTE)
398 continue;
399
400 for (const auto N : ELFObj.notes(S, Err)) {
401 if (Err)
402 return Err;
403 // Fills the KernelInfoTabel entries in the reader
404 if ((Err = Reader.processNote(N, S.sh_addralign)))
405 return Err;
406 }
407 }
408 return Error::success();
409}
410
411Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
413 object::ImageKind ImageKind,
414 object::OffloadKind OffloadKind,
415 int32_t ImageFlags,
417 using namespace object;
418
419 // Create inner OffloadBinary containing the raw image.
420 OffloadBinary::OffloadingImage InnerImage;
421 InnerImage.TheImageKind = ImageKind;
422 InnerImage.TheOffloadKind = OffloadKind;
423 InnerImage.Flags = ImageFlags;
424
425 InnerImage.StringData["triple"] = Triple.getTriple();
426 for (const auto &[Key, Value] : MetaData)
427 InnerImage.StringData[Key] = Value;
428
429 InnerImage.Image = std::move(Img);
430
431 SmallString<0> InnerBinaryData = OffloadBinary::write(InnerImage);
432
433 Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
434 return Error::success();
435}
436
438 std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
439 StringRef CompileOpts, StringRef LinkOpts) {
440 constexpr char INTEL_ONEOMP_OFFLOAD_VERSION[] = "1.0";
441
443 "Expected SPIR-V triple with Intel vendor");
444
446 MetaData["version"] = INTEL_ONEOMP_OFFLOAD_VERSION;
447 if (!CompileOpts.empty())
448 MetaData["compile-opts"] = CompileOpts;
449 if (!LinkOpts.empty())
450 MetaData["link-opts"] = LinkOpts;
451
453 object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
454 MetaData);
455}
456
458 uint32_t Count = Names.size();
459
460 // Compute the byte offset where string data begins: right after the header
461 // and the entry array.
462 uint32_t StringDataOffset =
463 sizeof(SymbolTableHeader) + Count * sizeof(SymbolTableEntry);
464
465 // Pre-size the output to hold the header and entry array; string data is
466 // appended below.
467 Out.resize(StringDataOffset);
468
469 // Write the header.
470 auto *Header = reinterpret_cast<SymbolTableHeader *>(Out.data());
471 Header->Count = Count;
472
473 // Write each entry and append the corresponding null-terminated name.
474 auto *Entries = reinterpret_cast<SymbolTableEntry *>(Header + 1);
475 uint32_t CurrentOffset = StringDataOffset;
476 for (uint32_t I = 0; I < Count; ++I) {
477 Entries[I].OffsetToSymbol = CurrentOffset;
478 Entries[I].SymbolSize = Names[I].size();
479 Out.append(Names[I]);
480 Out.push_back('\0');
481 CurrentOffset += Names[I].size() + 1;
482 }
483}
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< 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
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
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:1572
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
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:1760
LLVM_ABI void addOperand(MDNode *M)
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
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
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:133
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:730
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
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:808
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Definition Type.cpp:689
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition Triple.h:787
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:781
const std::string & getTriple() const
Definition Triple.h:502
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:899
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition Triple.h:441
bool isSPIRV() const
Tests whether the target is SPIR-V (32/64-bit/Logical).
Definition Triple.h:887
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:778
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:314
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:313
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
Definition Type.cpp:312
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:347
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:536
Expected< Elf_Shdr_Range > sections() const
Definition ELF.h:1038
static uint64_t getAlignment()
@ Entry
Definition COFF.h:862
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ NT_AMDGPU_METADATA
Definition ELF.h:1987
@ EI_ABIVERSION
Definition ELF.h:59
@ SHT_NOTE
Definition ELF.h:1154
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
Definition ELF.h:902
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
Definition ELF.h:913
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
Definition ELF.h:917
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
Definition ELF.h:900
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
Definition ELF.h:904
@ EF_AMDGPU_FEATURE_XNACK_V4
Definition ELF.h:898
@ EF_AMDGPU_FEATURE_SRAMECC_V4
Definition ELF.h:911
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
Definition ELF.h:906
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
Definition ELF.h:915
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
Definition ELF.h:919
OffloadKind
The producer of the associated offloading image.
ImageKind
The type of contents the offloading image contains.
ELFFile< ELF64LE > ELF64LEFile
Definition ELF.h:602
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:377
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:185
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:437
LLVM_ABI void writeSymbolTable(ArrayRef< StringRef > Names, SmallString< 0 > &Out)
Serialize Names into Out.
Definition Utility.cpp:457
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:411
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:328
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
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
LLVM_ABI void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.compiler.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:30
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
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:195
uint32_t Count
Number of symbol entries.
Definition Utility.h:196
Common declarations for yaml2obj.