40constexpr unsigned CudaFatMagic = 0x466243b1;
41constexpr unsigned HIPFatMagic = 0x48495046;
44 return M.getDataLayout().getIntPtrType(M.getContext());
130 auto [EntriesB, EntriesE] = EntryArray;
137 ImagesInits.
reserve(Bufs.size());
143 ".omp_offloading.device_image" + Suffix);
145 Image->setSection(Relocatable ?
".llvm.offloading.relocatable"
146 :
".llvm.offloading");
164 Binary.bytes_begin() + Header->EntryOffset);
165 BeginOffset = Entry->ImageOffset;
166 EndOffset = Entry->ImageOffset + Entry->ImageSize;
169 auto *Begin = ConstantInt::get(
getSizeTTy(M), BeginOffset);
180 ImageE, EntriesB, EntriesE));
190 ".omp_offloading.device_images" + Suffix);
204 ".omp_offloading.descriptor" + Suffix);
213 ".omp_offloading.descriptor_unreg" + Suffix, &M);
214 Func->setSection(
".text.startup");
220 M.getOrInsertFunction(
"__tgt_unregister_lib", UnRegFuncTy);
224 Builder.CreateCall(UnRegFuncC, BinDesc);
225 Builder.CreateRetVoid();
235 ".omp_offloading.descriptor_reg" + Suffix, &M);
236 Func->setSection(
".text.startup");
242 M.getOrInsertFunction(
"__tgt_register_lib", RegFuncTy);
246 FunctionCallee AtExit = M.getOrInsertFunction(
"atexit", AtExitTy);
248 Function *UnregFunc = createUnregisterFunction(M, BinDesc, Suffix);
253 Builder.CreateCall(RegFuncC, BinDesc);
259 Builder.CreateCall(AtExit, UnregFunc);
260 Builder.CreateRetVoid();
292 IsHIP ?
".hip_fatbin"
297 ".fatbin_image" + Suffix);
298 Fatbin->setSection(FatbinConstantSection);
301 StringRef FatbinWrapperSection = IsHIP ?
".hipFatBinSegment"
303 :
".nvFatBinSegment";
316 FatbinInitializer,
".fatbin_wrapper" + Suffix);
317 FatbinDesc->setSection(FatbinWrapperSection);
318 FatbinDesc->setAlignment(
Align(8));
352 bool EmitSurfacesAndTextures) {
354 auto [EntriesB, EntriesE] = EntryArray;
363 Int8PtrTy, Int8PtrTy, Int8PtrTy, Int8PtrTy, Int32PtrTy},
366 IsHIP ?
"__hipRegisterFunction" :
"__cudaRegisterFunction", RegFuncTy);
375 IsHIP ?
"__hipRegisterVar" :
"__cudaRegisterVar", RegVarTy);
380 {Int8PtrPtrTy, Int8PtrTy, Int8PtrTy, Int8PtrTy,
384 IsHIP ?
"__hipRegisterManagedVar" :
"__cudaRegisterManagedVar",
390 {Int8PtrPtrTy, Int8PtrTy, Int8PtrTy, Int8PtrTy,
394 IsHIP ?
"__hipRegisterSurface" :
"__cudaRegisterSurface", RegSurfaceTy);
403 IsHIP ?
"__hipRegisterTexture" :
"__cudaRegisterTexture", RegTextureTy);
409 IsHIP ?
".hip.globals_reg" :
".cuda.globals_reg", &M);
410 RegGlobalsFn->setSection(
".text.startup");
425 auto *EntryCmp = Builder.CreateICmpNE(EntriesB, EntriesE);
426 Builder.CreateCondBr(EntryCmp, EntryBB, ExitBB);
427 Builder.SetInsertPoint(EntryBB);
433 auto *Addr = Builder.CreateLoad(Int8PtrTy, AddrPtr,
"addr");
438 auto *AuxAddr = Builder.CreateLoad(Int8PtrTy, AuxAddrPtr,
"aux_addr");
448 auto *
Name = Builder.CreateLoad(Int8PtrTy, NamePtr,
"name");
463 auto *
Data = Builder.CreateTrunc(
466 auto *
Type = Builder.CreateAnd(
470 auto *ExternBit = Builder.CreateAnd(
473 auto *
Extern = Builder.CreateLShr(
478 auto *
Const = Builder.CreateLShr(
480 auto *NormalizedBit = Builder.CreateAnd(
483 auto *Normalized = Builder.CreateLShr(
485 auto *KindCond = Builder.CreateICmpEQ(
489 Builder.CreateCondBr(KindCond, IfKindBB, IfEndBB);
490 Builder.SetInsertPoint(IfKindBB);
491 auto *FnCond = Builder.CreateICmpEQ(
493 Builder.CreateCondBr(FnCond, IfThenBB, IfElseBB);
496 Builder.SetInsertPoint(IfThenBB);
497 Builder.CreateCall(RegFunc, {RegGlobalsFn->arg_begin(), Addr,
Name,
Name,
504 Builder.CreateBr(IfEndBB);
505 Builder.SetInsertPoint(IfElseBB);
507 auto *
Switch = Builder.CreateSwitch(
Type, IfEndBB);
509 Builder.SetInsertPoint(SwGlobalBB);
510 Builder.CreateCall(RegVar,
513 Builder.CreateBr(IfEndBB);
518 Builder.SetInsertPoint(SwManagedBB);
519 Builder.CreateCall(RegManagedVar, {RegGlobalsFn->arg_begin(), AuxAddr, Addr,
521 Builder.CreateBr(IfEndBB);
525 Builder.SetInsertPoint(SwSurfaceBB);
526 if (EmitSurfacesAndTextures)
527 Builder.CreateCall(RegSurface, {RegGlobalsFn->arg_begin(), Addr,
Name,
Name,
529 Builder.CreateBr(IfEndBB);
534 Builder.SetInsertPoint(SwTextureBB);
535 if (EmitSurfacesAndTextures)
536 Builder.CreateCall(RegTexture, {RegGlobalsFn->arg_begin(), Addr,
Name,
Name,
538 Builder.CreateBr(IfEndBB);
542 Builder.SetInsertPoint(IfEndBB);
543 auto *NewEntry = Builder.CreateInBoundsGEP(
545 auto *
Cmp = Builder.CreateICmpEQ(
556 &RegGlobalsFn->getEntryBlock());
557 Entry->addIncoming(NewEntry, IfEndBB);
558 Builder.CreateCondBr(Cmp, ExitBB, EntryBB);
559 Builder.SetInsertPoint(ExitBB);
560 Builder.CreateRetVoid();
570 bool EmitSurfacesAndTextures) {
575 (IsHIP ?
".hip.fatbin_reg" :
".cuda.fatbin_reg") + Suffix, &M);
576 CtorFunc->setSection(
".text.startup");
581 (IsHIP ?
".hip.fatbin_unreg" :
".cuda.fatbin_unreg") + Suffix, &M);
582 DtorFunc->setSection(
".text.startup");
589 IsHIP ?
"__hipRegisterFatBinary" :
"__cudaRegisterFatBinary", RegFatTy);
594 M.getOrInsertFunction(
"__cudaRegisterFatBinaryEnd", RegFatEndTy);
599 IsHIP ?
"__hipUnregisterFatBinary" :
"__cudaUnregisterFatBinary",
604 FunctionCallee AtExit = M.getOrInsertFunction(
"atexit", AtExitTy);
609 (IsHIP ?
".hip.binary_handle" :
".cuda.binary_handle") + Suffix);
613 CallInst *Handle = CtorBuilder.CreateCall(
616 CtorBuilder.CreateAlignedStore(
617 Handle, BinaryHandleGlobal,
618 Align(M.getDataLayout().getPointerTypeSize(PtrTy)));
619 CtorBuilder.CreateCall(createRegisterGlobalsFunction(M, IsHIP, EntryArray,
621 EmitSurfacesAndTextures),
624 CtorBuilder.CreateCall(RegFatbinEnd, Handle);
625 CtorBuilder.CreateCall(AtExit, DtorFunc);
626 CtorBuilder.CreateRetVoid();
632 LoadInst *BinaryHandle = DtorBuilder.CreateAlignedLoad(
633 PtrTy, BinaryHandleGlobal,
634 Align(M.getDataLayout().getPointerTypeSize(PtrTy)));
635 DtorBuilder.CreateCall(UnregFatbin, BinaryHandle);
636 DtorBuilder.CreateRetVoid();
646 SYCLJITOptions Options;
648 StructType *EntryTy =
nullptr;
649 StructType *SyclDeviceImageTy =
nullptr;
650 StructType *SyclBinDescTy =
nullptr;
652 SYCLWrapper(
Module &M,
const SYCLJITOptions &Options)
655 SyclDeviceImageTy = getSyclDeviceImageTy();
656 SyclBinDescTy = getSyclBinDescTy();
660 switch (M.getDataLayout().getPointerSize()) {
662 return Type::getInt32Ty(C);
664 return Type::getInt64Ty(C);
672 ConstantInt::get(SizeTTy, Second)};
709 StructType *getSyclDeviceImageTy() {
715 PointerType::getUnqual(C),
716 PointerType::getUnqual(C),
717 PointerType::getUnqual(C),
718 PointerType::getUnqual(C),
719 PointerType::getUnqual(C),
720 PointerType::getUnqual(C),
721 PointerType::getUnqual(C),
722 PointerType::getUnqual(C),
723 PointerType::getUnqual(C)
725 "__sycl.tgt_device_image");
744 StructType *getSyclBinDescTy() {
746 {Type::getInt16Ty(C), Type::getInt16Ty(C), PointerType::getUnqual(C),
747 PointerType::getUnqual(C), PointerType::getUnqual(C)},
748 "__sycl.tgt_bin_desc");
753 GlobalVariable *addGlobalArrayVariable(
const Twine &Name,
754 ArrayRef<char> Initializer,
755 const Twine &Section =
"") {
757 auto *Var =
new GlobalVariable(M, Arr->getType(),
true,
758 GlobalVariable::InternalLinkage, Arr, Name);
759 Var->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
761 SmallVector<char, 32> NameBuf;
764 Var->setSection(SectionName);
771 std::pair<Constant *, Constant *>
772 addArrayToModule(ArrayRef<char> Buf,
const Twine &Name,
773 const Twine &Section =
"") {
774 auto *Var = addGlobalArrayVariable(Name, Buf, Section);
776 getSizetConstPair(0, 0));
778 Var->getValueType(), Var, getSizetConstPair(0, Buf.
size()));
779 return std::make_pair(ImageB, ImageE);
785 Constant *addRawDataToModule(ArrayRef<char>
Data,
const Twine &Name) {
786 auto *Var = addGlobalArrayVariable(Name,
Data);
788 getSizetConstPair(0, 0));
797 Constant *addStringToModule(StringRef Str,
const Twine &Name) {
799 auto *Var =
new GlobalVariable(M, Arr->getType(),
true,
800 GlobalVariable::InternalLinkage, Arr, Name);
801 Var->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
812 std::pair<Constant *, Constant *>
813 initOffloadEntriesPerImage(StringRef Entries,
const Twine &OffloadKindTag) {
817 for (line_iterator LI(*MB); !LI.is_at_eof(); ++LI) {
828 auto *EntriesGV =
new GlobalVariable(M, Arr->getType(),
true,
829 GlobalVariable::InternalLinkage, Arr,
830 OffloadKindTag +
"entries_arr");
833 EntriesGV->getValueType(), EntriesGV, getSizetConstPair(0, 0));
835 EntriesGV->getValueType(), EntriesGV,
836 getSizetConstPair(0, EntriesInits.
size()));
837 return std::make_pair(EntriesB, EntriesE);
840 Constant *wrapImage(
const OffloadBinary &OB,
const Twine &ImageID,
841 StringRef OffloadKindTag) {
845 constexpr uint16_t DeviceImageStructVersion = 3;
847 ConstantInt::get(Type::getInt16Ty(C), DeviceImageStructVersion);
848 Constant *OffloadKindConstant = ConstantInt::get(
849 Type::getInt8Ty(C),
static_cast<uint8_t
>(
OB.getOffloadKind()));
850 Constant *ImageKindConstant = ConstantInt::get(
851 Type::getInt8Ty(C),
static_cast<uint8_t
>(
OB.getImageKind()));
852 StringRef Triple =
OB.getString(
"triple");
854 addStringToModule(Triple, Twine(OffloadKindTag) +
"target." + ImageID);
856 addStringToModule(Options.CompileOptions,
857 Twine(OffloadKindTag) +
"opts.compile." + ImageID);
858 Constant *LinkOptions = addStringToModule(
859 Options.LinkOptions, Twine(OffloadKindTag) +
"opts.link." + ImageID);
862 std::pair<Constant *, Constant *> PropertiesConstants = {
866 StringRef RawImage =
OB.getImage();
867 std::pair<Constant *, Constant *>
Binary = addArrayToModule(
868 ArrayRef<char>(RawImage.
begin(), RawImage.
end()),
869 Twine(OffloadKindTag) + ImageID +
".data",
".llvm.offloading");
872 std::pair<Constant *, Constant *> ImageEntriesPtrs =
873 initOffloadEntriesPerImage(
OB.getString(
"symbols"), OffloadKindTag);
875 SyclDeviceImageTy,
Version, OffloadKindConstant, ImageKindConstant,
876 TripleConstant, CompileOptions, LinkOptions,
Binary.first,
877 Binary.second, ImageEntriesPtrs.first, ImageEntriesPtrs.second,
878 PropertiesConstants.first, PropertiesConstants.second);
880 return WrappedBinary;
884 StringRef OffloadKindTag) {
886 ArrayType::get(SyclDeviceImageTy, WrappedImages.
size()), WrappedImages);
888 new GlobalVariable(M, ImagesData->getType(),
true,
890 Twine(OffloadKindTag) +
"device_images");
891 ImagesGV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
900 static constexpr uint16_t BinDescStructVersion = 1;
903 ConstantInt::get(Type::getInt16Ty(C), BinDescStructVersion),
904 ConstantInt::get(Type::getInt16Ty(C), WrappedImages.
size()), ImagesB,
907 return new GlobalVariable(M, DescInit->getType(),
true,
909 Twine(OffloadKindTag) +
"descriptor");
964 StringRef OffloadKindTag =
".sycl_offloading.";
967 for (
size_t I = 0,
E = OffloadFiles.
size();
I !=
E; ++
I)
969 wrapImage(*OffloadFiles[
I].getBinary(), Twine(
I), OffloadKindTag));
971 return combineWrappedImages(WrappedImages, OffloadKindTag);
974 void createRegisterFatbinFunction(GlobalVariable *FatbinDesc) {
975 auto *FuncTy = FunctionType::get(Type::getVoidTy(C),
false);
977 Twine(
"sycl") +
".descriptor_reg", &M);
978 Func->setSection(
".text.startup");
982 FunctionType::get(Type::getVoidTy(C), PointerType::getUnqual(C),
984 FunctionCallee RegFuncC =
985 M.getOrInsertFunction(
"__sycl_register_lib", RegFuncTy);
989 Builder.CreateCall(RegFuncC, FatbinDesc);
990 Builder.CreateRetVoid();
996 void createUnregisterFunction(GlobalVariable *FatbinDesc) {
997 auto *FuncTy = FunctionType::get(Type::getVoidTy(C),
false);
999 "sycl.descriptor_unreg", &M);
1000 Func->setSection(
".text.startup");
1004 FunctionType::get(Type::getVoidTy(C), PointerType::getUnqual(C),
1006 FunctionCallee UnRegFuncC =
1007 M.getOrInsertFunction(
"__sycl_unregister_lib", UnRegFuncTy);
1011 Builder.CreateCall(UnRegFuncC, FatbinDesc);
1012 Builder.CreateRetVoid();
1025 createBinDesc(M, Images, EntryArray, Suffix, Relocatable);
1028 "No binary descriptors created.");
1029 createRegisterFunction(M,
Desc, Suffix);
1036 bool EmitSurfacesAndTextures) {
1040 "No fatbin section created.");
1042 createRegisterFatbinFunction(M,
Desc,
false, EntryArray, Suffix,
1043 EmitSurfacesAndTextures);
1049 bool EmitSurfacesAndTextures) {
1053 "No fatbin section created.");
1055 createRegisterFatbinFunction(M,
Desc,
true, EntryArray, Suffix,
1056 EmitSurfacesAndTextures);
1072 "No binary descriptors created.");
1074 W.createRegisterFatbinFunction(
Desc);
1075 W.createUnregisterFunction(
Desc);
static IntegerType * getSizeTTy(IRBuilderBase &B, const TargetLibraryInfo *TLI)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
Machine Check Debug Module
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
This class represents a function call, abstracting a target machine's calling convention.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
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.
static ErrorSuccess success()
Create a success value.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
@ InternalLinkage
Rename collisions when linking (static functions).
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
A Module instance is used to store all the information related to an LLVM module.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
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.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Triple - Helper class for working with autoconf configuration names.
bool isMacOSX() const
Is this a Mac OS X triple.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
static uint64_t getAlignment()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ OB
OB - OneByte - Set if this instruction has a one byte opcode.
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
LLVM_ABI Error extractOffloadBinaries(MemoryBufferRef Buffer, SmallVectorImpl< OffloadFile > &Binaries)
Extracts embedded device offloading code from a memory Buffer to a list of Binaries.
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, StringRef SectionName="llvm_offload_entries")
Create an offloading section struct used to register this global at runtime.
LLVM_ABI StructType * getEntryTy(Module &M)
Returns the type of the offloading entry we use to store kernels and globals that will be registered ...
LLVM_ABI llvm::Error wrapSYCLBinaries(llvm::Module &M, llvm::ArrayRef< char > Buffer, SYCLJITOptions Options=SYCLJITOptions())
Wraps OffloadBinaries in the given Buffers into the module M as global symbols and registers the imag...
@ OffloadGlobalSurfaceEntry
Mark the entry as a surface variable.
@ OffloadGlobalTextureEntry
Mark the entry as a texture variable.
@ OffloadGlobalNormalized
Mark the entry as being a normalized surface.
@ OffloadGlobalEntry
Mark the entry as a global entry.
@ OffloadGlobalManagedEntry
Mark the entry as a managed global variable.
@ OffloadGlobalExtern
Mark the entry as being extern.
@ OffloadGlobalConstant
Mark the entry as being constant.
LLVM_ABI llvm::Error wrapOpenMPBinaries(llvm::Module &M, llvm::ArrayRef< llvm::ArrayRef< char > > Images, EntryArrayTy EntryArray, llvm::StringRef Suffix="", bool Relocatable=false)
Wraps the input device images into the module M as global symbols and registers the images with the O...
std::pair< GlobalVariable *, GlobalVariable * > EntryArrayTy
LLVM_ABI llvm::Error wrapHIPBinary(llvm::Module &M, llvm::ArrayRef< char > Images, EntryArrayTy EntryArray, llvm::StringRef Suffix="", bool EmitSurfacesAndTextures=true)
Wraps the input bundled image into the module M as global symbols and registers the images with the H...
LLVM_ABI llvm::Error wrapCudaBinary(llvm::Module &M, llvm::ArrayRef< char > Images, EntryArrayTy EntryArray, llvm::StringRef Suffix="", bool EmitSurfacesAndTextures=true)
Wraps the input fatbinary image into the module M as global symbols and registers the images with the...
NodeAddr< FuncNode * > Func
Context & getContext() const
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI file_magic identify_magic(StringRef magic)
Identify the type of a binary file based on how magical it is.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI void appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Append F to the list of global ctors of module M with the given Priority.
LLVM_ABI void appendToGlobalDtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Same as appendToGlobalCtors(), but for global dtors.
@ Extern
Replace returns with jump to thunk, don't emit thunk.
This struct is a compact representation of a valid (non-zero power of two) alignment.
@ offload_binary
LLVM offload object file.