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 } else if (IsKey(V.first, ".args")) {
319 auto ArgsArray = V.second.getArray();
320 for (auto ArgIt = ArgsArray.begin(), ArgEnd = ArgsArray.end();
321 ArgIt != ArgEnd; ++ArgIt) {
322 auto ArgMap = ArgIt->getMap();
323
324 auto OffsetIt = ArgMap.find(".offset");
325 if (OffsetIt == ArgMap.end())
326 return createStringError(
328 "Missing required .offset key in kernel argument metadata map");
329
330 auto SizeIt = ArgMap.find(".size");
331 if (SizeIt == ArgMap.end())
332 return createStringError(
334 "Missing required .size key in kernel argument metadata map");
335
336 KernelData.ArgMDs.emplace_back(OffsetIt->second.getUInt(),
337 SizeIt->second.getUInt());
338 }
339 }
340
341 return Error::success();
342 }
343
344 /// Get the "amdhsa.kernels" element from the msgpack Document
345 Expected<msgpack::ArrayDocNode> getAMDKernelsArray(msgpack::MapDocNode &MDN) {
346 auto Res = MDN.find("amdhsa.kernels");
347 if (Res == MDN.end())
349 "Could not find amdhsa.kernels key");
350
351 auto Pair = *Res;
352 assert(Pair.second.isArray() &&
353 "AMDGPU kernel entries are arrays of entries");
354
355 return Pair.second.getArray();
356 }
357
358 /// Iterate all entries for one "amdhsa.kernels" entry. Each entry is a
359 /// MapDocNode that either maps a string to a single value (most of them) or
360 /// to another array of things. Currently, we only handle the case that maps
361 /// to scalar value.
362 Error generateKernelInfo(msgpack::ArrayDocNode::ArrayTy::iterator It) {
363 offloading::amdgpu::AMDGPUKernelMetaData KernelData;
364 std::string KernelName;
365 auto Entry = (*It).getMap();
366 for (auto MI = Entry.begin(), E = Entry.end(); MI != E; ++MI)
367 if (auto Err = extractKernelData(*MI, KernelName, KernelData))
368 return Err;
369
370 KernelInfoMap.insert({KernelName, KernelData});
371 return Error::success();
372 }
373
374 /// Go over the list of AMD kernels in the "amdhsa.kernels" entry
375 Error iterateAMDKernels(msgpack::MapDocNode &MDN) {
376 auto KernelsOrErr = getAMDKernelsArray(MDN);
377 if (auto Err = KernelsOrErr.takeError())
378 return Err;
379
380 auto KernelsArr = *KernelsOrErr;
381 for (auto It = KernelsArr.begin(), E = KernelsArr.end(); It != E; ++It) {
382 if (!It->isMap())
383 continue; // we expect <key,value> pairs
384
385 // Obtain the value for the different entries. Each array entry is a
386 // MapDocNode
387 if (auto Err = generateKernelInfo(It))
388 return Err;
389 }
390 return Error::success();
391 }
392
393 // Kernel names are the keys
394 StringMap<offloading::amdgpu::AMDGPUKernelMetaData> &KernelInfoMap;
395};
396} // namespace
397
399 MemoryBufferRef MemBuffer,
401 uint16_t &ELFABIVersion) {
402 Error Err = Error::success(); // Used later as out-parameter
403
404 auto ELFOrError = object::ELF64LEFile::create(MemBuffer.getBuffer());
405 if (auto Err = ELFOrError.takeError())
406 return Err;
407
408 const object::ELF64LEFile ELFObj = ELFOrError.get();
410 if (!Sections)
411 return Sections.takeError();
412 KernelInfoReader Reader(KernelInfoMap);
413
414 // Read the code object version from ELF image header
415 auto Header = ELFObj.getHeader();
416 ELFABIVersion = (uint8_t)(Header.e_ident[ELF::EI_ABIVERSION]);
417 for (const auto &S : *Sections) {
418 if (S.sh_type != ELF::SHT_NOTE)
419 continue;
420
421 for (const auto N : ELFObj.notes(S, Err)) {
422 if (Err)
423 return Err;
424 // Fills the KernelInfoTabel entries in the reader
425 if ((Err = Reader.processNote(N, S.sh_addralign)))
426 return Err;
427 }
428 }
429 return Error::success();
430}
431
432Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
434 object::ImageKind ImageKind,
435 object::OffloadKind OffloadKind,
436 int32_t ImageFlags,
438 using namespace object;
439
440 // Create inner OffloadBinary containing the raw image.
441 OffloadBinary::OffloadingImage InnerImage;
442 InnerImage.TheImageKind = ImageKind;
443 InnerImage.TheOffloadKind = OffloadKind;
444 InnerImage.Flags = ImageFlags;
445
446 InnerImage.StringData["triple"] = Triple.getTriple();
447 for (const auto &[Key, Value] : MetaData)
448 InnerImage.StringData[Key] = Value;
449
450 InnerImage.Image = std::move(Img);
451
452 SmallString<0> InnerBinaryData = OffloadBinary::write(InnerImage);
453
454 Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
455 return Error::success();
456}
457
459 std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
460 StringRef CompileOpts, StringRef LinkOpts) {
461 constexpr char INTEL_ONEOMP_OFFLOAD_VERSION[] = "1.0";
462
464 "Expected SPIR-V triple with Intel vendor");
465
467 MetaData["version"] = INTEL_ONEOMP_OFFLOAD_VERSION;
468 if (!CompileOpts.empty())
469 MetaData["compile-opts"] = CompileOpts;
470 if (!LinkOpts.empty())
471 MetaData["link-opts"] = LinkOpts;
472
474 object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
475 MetaData);
476}
477
479 uint32_t Count = Names.size();
480
481 // Compute the byte offset where string data begins: right after the header
482 // and the entry array.
483 uint32_t StringDataOffset =
484 sizeof(SymbolTableHeader) + Count * sizeof(SymbolTableEntry);
485
486 // Compute total size and reserve to prevent reallocation while writing
487 // entries via pointer (append() could otherwise invalidate the pointer).
488 uint32_t TotalSize = StringDataOffset;
489 for (StringRef N : Names)
490 TotalSize += N.size() + 1;
491 Out.reserve(TotalSize);
492 Out.resize(StringDataOffset);
493
494 // Write the header.
495 auto *Header = reinterpret_cast<SymbolTableHeader *>(Out.data());
496 Header->Count = Count;
497
498 // Write each entry and append the corresponding null-terminated name.
499 auto *Entries = reinterpret_cast<SymbolTableEntry *>(Header + 1);
500 uint32_t CurrentOffset = StringDataOffset;
501 for (uint32_t I = 0; I < Count; ++I) {
502 Entries[I].OffsetToSymbol = CurrentOffset;
503 Entries[I].SymbolSize = Names[I].size();
504 Out.append(Names[I]);
505 Out.push_back('\0');
506 CurrentOffset += Names[I].size() + 1;
507 }
508}
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
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:1572
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:68
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
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:133
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:730
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:804
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Definition Type.cpp:685
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:791
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:785
const std::string & getTriple() const
Definition Triple.h:503
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:903
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition Triple.h:442
bool isSPIRV() const
Tests whether the target is SPIR-V (32/64-bit/Logical).
Definition Triple.h:891
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:782
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: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:1989
@ EI_ABIVERSION
Definition ELF.h:59
@ SHT_NOTE
Definition ELF.h:1156
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
Definition ELF.h:904
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
Definition ELF.h:915
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
Definition ELF.h:919
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
Definition ELF.h:902
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
Definition ELF.h:906
@ EF_AMDGPU_FEATURE_XNACK_V4
Definition ELF.h:900
@ EF_AMDGPU_FEATURE_SRAMECC_V4
Definition ELF.h:913
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
Definition ELF.h:908
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
Definition ELF.h:917
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
Definition ELF.h:921
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:398
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:458
LLVM_ABI void writeSymbolTable(ArrayRef< StringRef > Names, SmallString< 0 > &Out)
Serialize Names into Out.
Definition Utility.cpp:478
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:432
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: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.