69#define DEBUG_TYPE "expand-variadics"
79 "Use the implementation defaults"),
81 "Disable the pass entirely"),
83 "Optimise without changing ABI"),
85 "Change variadic calling convention")));
87bool commandLineOverride() {
96class VariadicABIInfo {
98 VariadicABIInfo() =
default;
101 static std::unique_ptr<VariadicABIInfo> create(
const Triple &
T);
104 virtual bool enableForTarget() = 0;
109 virtual bool vaListPassedInSSARegister() = 0;
115 virtual Type *vaListParameterType(
Module &M) = 0;
124 struct VAArgSlotInfo {
131 bool vaEndIsNop() {
return true; }
132 bool vaCopyIsMemcpy() {
return true; }
135 virtual bool ignoreFunction(
const Function *
F) {
return false; }
143 virtual ~VariadicABIInfo() =
default;
158 std::unique_ptr<VariadicABIInfo> ABI;
162 Mode(commandLineOverride() ? ExpandVariadicsModeOption :
Mode) {}
164 StringRef getPassName()
const override {
return "Expand variadic functions"; }
168 template <
typename T>
bool isValidCallingConv(
T *
F) {
173 bool runOnModule(
Module &M)
override;
195 template <Intrinsic::ID ID,
typename InstructionType>
204 Changed |= expandVAIntrinsicCall(Builder,
DL,
I);
213 unsigned Addrspace) {
214 auto &Ctx = M.getContext();
219 Changed |= expandIntrinsicUsers<Intrinsic::vastart, VAStartInst>(
220 M, Builder, IntrinsicArgType);
221 Changed |= expandIntrinsicUsers<Intrinsic::vaend, VAEndInst>(
222 M, Builder, IntrinsicArgType);
223 Changed |= expandIntrinsicUsers<Intrinsic::vacopy, VACopyInst>(
224 M, Builder, IntrinsicArgType);
244 ArgTypes.
push_back(ABI->vaListParameterType(M));
249 return inlinableVariadicFunctionType(M, FTy, FTy->getReturnType());
253 if (
F->isIntrinsic() || !
F->isVarArg() ||
254 F->hasFnAttribute(Attribute::Naked))
257 if (ABI->ignoreFunction(
F))
260 if (!isValidCallingConv(
F))
266 if (!
F->hasExactDefinition())
272 bool expansionApplicableToFunctionCall(
CallBase *CB) {
274 if (CI->isMustTailCall()) {
279 if (!isValidCallingConv(CI))
294 class ExpandedCallFrame {
300 enum Tag { Store, Memcpy, Padding };
305 Source.push_back({V, Bytes, tag});
312 append<Memcpy>(
T, V, Bytes);
319 size_t size()
const {
return FieldTypes.
size(); }
320 bool empty()
const {
return FieldTypes.
empty(); }
323 const bool IsPacked =
true;
325 (
Twine(Name) +
".vararg").str(), IsPacked);
331 for (
size_t I = 0;
I <
size();
I++) {
333 auto [V, bytes, tag] = Source[
I];
335 if (tag == Padding) {
340 auto Dst = Builder.CreateStructGEP(VarargsTy, Alloced,
I);
345 Builder.CreateStore(V, Dst);
348 Builder.CreateMemCpy(Dst, {}, V, {}, bytes);
354bool ExpandVariadics::runOnModule(
Module &M) {
359 Triple TT(M.getTargetTriple());
360 ABI = VariadicABIInfo::create(TT);
364 if (!ABI->enableForTarget())
367 auto &Ctx = M.getContext();
383 unsigned Addrspace = 0;
384 Changed |= expandVAIntrinsicUsersWithAddrspace(M, Builder, Addrspace);
386 Addrspace =
DL.getAllocaAddrSpace();
388 Changed |= expandVAIntrinsicUsersWithAddrspace(M, Builder, Addrspace);
392 ABI->getTargetSpecificVaIntrinAddrSpaces();
393 for (
unsigned TargetAS : TargetASVec) {
394 if (TargetAS == 0 || TargetAS ==
DL.getAllocaAddrSpace())
396 Changed |= expandVAIntrinsicUsersWithAddrspace(M, Builder, TargetAS);
404 if (
F.isDeclaration())
414 Changed |= expandVAArgInst(Builder,
DL, VA);
416 if (CB->isIndirectCall()) {
419 Changed |= expandCall(M, Builder, CB, FTy,
nullptr);
433 if (!expansionApplicableToFunction(M, OriginalFunction))
436 [[maybe_unused]]
const bool OriginalFunctionIsDeclaration =
438 assert(rewriteABI() || !OriginalFunctionIsDeclaration);
442 replaceAllUsesWithNewDeclaration(M, OriginalFunction);
449 deriveFixedArityReplacement(M, Builder, OriginalFunction);
452 OriginalFunctionIsDeclaration);
456 [[maybe_unused]]
Function *VariadicWrapperDefine =
457 defineVariadicWrapper(M, Builder, VariadicWrapper, FixedArityReplacement);
458 assert(VariadicWrapperDefine == VariadicWrapper);
465 LLVMContext::MD_prof,
466 FixedArityReplacement->
getMetadata(LLVMContext::MD_prof));
476 Value *CalledOperand = CB->getCalledOperand();
477 if (VariadicWrapper == CalledOperand)
480 FixedArityReplacement);
488 Function *
const ExternallyAccessible =
489 rewriteABI() ? FixedArityReplacement : VariadicWrapper;
491 rewriteABI() ? VariadicWrapper : FixedArityReplacement;
497 ExternallyAccessible->
takeName(OriginalFunction);
519ExpandVariadics::replaceAllUsesWithNewDeclaration(
Module &M,
526 NF->
setName(
F.getName() +
".varargs");
528 F.getParent()->getFunctionList().insert(
F.getIterator(), NF);
530 AttrBuilder ParamAttrs(Ctx);
532 Attrs = Attrs.addParamAttributes(Ctx, FTy->getNumParams(), ParamAttrs);
548 assert(expansionApplicableToFunction(M, &
F));
550 auto &Ctx = M.getContext();
554 const bool FunctionIsDefinition = !
F.isDeclaration();
558 ArgTypes.
push_back(ABI->vaListParameterType(M));
560 FunctionType *NFTy = inlinableVariadicFunctionType(M, FTy);
566 F.getParent()->getFunctionList().insert(
F.getIterator(), NF);
567 NF->
setName(
F.getName() +
".valist");
569 AttrBuilder ParamAttrs(Ctx);
572 Attrs = Attrs.addParamAttributes(Ctx, NFTy->getNumParams() - 1, ParamAttrs);
576 if (FunctionIsDefinition) {
581 Arg.replaceAllUsesWith(NewArg);
582 NewArg->setName(Arg.getName());
589 F.getAllMetadata(MDs);
590 for (
auto [KindID,
Node] : MDs)
607 Type *VaListTy = ABI->vaListType(Ctx);
610 Builder.SetInsertPoint(BB);
613 Builder.CreateAlloca(VaListTy,
nullptr,
"va_start");
615 Builder.CreateLifetimeStart(VaListInstance);
617 Builder.CreateIntrinsic(Intrinsic::vastart, {
DL.getAllocaPtrType(Ctx)},
622 Value *VaListValue = VaListInstance;
623 if (ABI->vaListPassedInSSARegister())
624 VaListValue = Builder.CreateLoad(VaListTy, VaListInstance);
626 Type *ParameterType = ABI->vaListParameterType(M);
627 Args.push_back(Builder.CreateAddrSpaceCast(VaListValue, ParameterType));
629 CallInst *Result = Builder.CreateCall(FixedArityReplacement, Args);
631 Builder.CreateIntrinsic(Intrinsic::vaend, {
DL.getAllocaPtrType(Ctx)},
633 Builder.CreateLifetimeEnd(VaListInstance);
635 if (Result->getType()->isVoidTy())
636 Builder.CreateRetVoid();
638 Builder.CreateRet(Result);
640 return VariadicWrapper;
652 if (!expansionApplicableToFunctionCall(CB)) {
667 Align MaxFieldAlign(1);
677 ExpandedCallFrame Frame;
681 for (
unsigned I :
seq(VarargFunctionType->getNumParams(), CB->
arg_size())) {
692 DL.getTypeAllocSize(UnderlyingType).getFixedValue();
695 Type *FrameFieldType = UnderlyingType;
698 Value *SourceValue = ArgVal;
700 VariadicABIInfo::VAArgSlotInfo SlotInfo = ABI->slotInfo(
DL, UnderlyingType);
702 if (SlotInfo.Indirect) {
705 Builder.SetInsertPointPastAllocas(CBF);
708 Builder.CreateAlloca(UnderlyingType,
nullptr,
"IndirectAlloca");
710 Builder.SetInsertPoint(CB);
712 Builder.CreateMemCpy(CallerCopy, {}, ArgVal, {}, UnderlyingSize);
714 Builder.CreateStore(ArgVal, CallerCopy);
717 FrameFieldType =
DL.getAllocaPtrType(Ctx);
718 SourceValue = CallerCopy;
723 Align DataAlign = SlotInfo.DataAlign;
725 MaxFieldAlign = std::max(MaxFieldAlign, DataAlign);
728 if (
uint64_t Rem = CurrentOffset % DataAlignV) {
730 uint64_t Padding = DataAlignV - Rem;
731 Frame.padding(Ctx, Padding);
732 CurrentOffset += Padding;
735 if (SlotInfo.Indirect) {
736 Frame.store(Ctx, FrameFieldType, SourceValue);
739 Frame.memcpy(Ctx, FrameFieldType, SourceValue, UnderlyingSize);
741 Frame.store(Ctx, FrameFieldType, SourceValue);
744 CurrentOffset +=
DL.getTypeAllocSize(FrameFieldType).getFixedValue();
752 Frame.padding(Ctx, 1);
763 Align AllocaAlign = MaxFieldAlign;
765 StackAlign && *StackAlign > AllocaAlign)
766 AllocaAlign = *StackAlign;
769 Builder.SetInsertPointPastAllocas(CBF);
776 new AllocaInst(VarargsTy,
DL.getAllocaAddrSpace(),
nullptr, AllocaAlign),
782 Builder.SetInsertPoint(CB);
783 Builder.CreateLifetimeStart(Alloced);
784 Frame.initializeStructAlloca(
DL, Builder, Alloced, VarargsTy);
786 const unsigned NumArgs = VarargFunctionType->getNumParams();
793 if (!ABI->vaListPassedInSSARegister()) {
794 Type *VaListTy = ABI->vaListType(Ctx);
795 Builder.SetInsertPointPastAllocas(CBF);
797 VaList = Builder.CreateAlloca(VaListTy,
nullptr,
"va_argument");
798 Builder.SetInsertPoint(CB);
799 Builder.CreateLifetimeStart(VaList);
801 Builder.SetInsertPoint(CB);
802 Args.push_back(ABI->initializeVaList(M, Ctx, Builder, VaList, Alloced));
807 if (!PAL.isEmpty()) {
809 for (
unsigned ArgNo = 0; ArgNo < NumArgs; ArgNo++)
810 ArgAttrs.
push_back(PAL.getParamAttrs(ArgNo));
812 AttributeList::get(Ctx, PAL.getFnAttrs(), PAL.getRetAttrs(), ArgAttrs);
821 Value *Dst = NF ? NF : CI->getCalledOperand();
825 inlinableVariadicFunctionType(M, VarargFunctionType, CB->
getType());
827 NewCB =
CallInst::Create(NFTy, Dst, Args, OpBundles,
"", CI->getIterator());
835 CI->setTailCallKind(TCK);
842 Builder.CreateLifetimeEnd(VaList);
844 Builder.CreateLifetimeEnd(Alloced);
852 NewCB->
copyMetadata(*CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg});
859bool ExpandVariadics::expandVAIntrinsicCall(
IRBuilder<> &Builder,
872 if (ContainingFunction->
isVarArg()) {
878 bool PassedByValue = ABI->vaListPassedInSSARegister();
885 Builder.SetInsertPoint(Inst);
891 assert(ABI->vaCopyIsMemcpy());
895 Value *Cursor = PassedVaList;
896 if (Cursor->getType() != VaStartArg->
getType())
897 Cursor = Builder.CreateAddrSpaceCast(Cursor, VaStartArg->
getType());
898 Builder.CreateStore(Cursor, VaStartArg);
902 auto &Ctx = Builder.getContext();
904 Builder.CreateIntrinsic(Intrinsic::vacopy, {
DL.getAllocaPtrType(Ctx)},
905 {VaStartArg, PassedVaList});
914 assert(ABI->vaEndIsNop());
919bool ExpandVariadics::expandVAIntrinsicCall(
IRBuilder<> &Builder,
922 assert(ABI->vaCopyIsMemcpy());
923 Builder.SetInsertPoint(Inst);
925 auto &Ctx = Builder.getContext();
926 Type *VaListTy = ABI->vaListType(Ctx);
929 Builder.CreateMemCpy(Inst->
getDest(), {}, Inst->
getSrc(), {},
930 Builder.getInt32(
Size));
936bool ExpandVariadics::expandVAArgInst(
IRBuilder<> &Builder,
938 Builder.SetInsertPoint(Inst);
940 auto &Ctx = Builder.getContext();
944 const VariadicABIInfo::VAArgSlotInfo SlotInfo = ABI->slotInfo(
DL, ValTy);
945 Type *FrameFieldType = SlotInfo.Indirect ?
DL.getAllocaPtrType(Ctx) : ValTy;
946 const uint64_t SlotSize =
DL.getTypeAllocSize(FrameFieldType).getFixedValue();
947 const Align SlotAlign = SlotInfo.DataAlign;
950 Type *IdxTy =
DL.getIndexType(PtrTy);
952 Value *Cur = Builder.CreateLoad(PtrTy, VaListPtr);
956 if (SlotAlign >
Align(1)) {
957 Value *RoundUp = Builder.CreateInBoundsPtrAdd(
958 Cur, ConstantInt::get(IdxTy, SlotAlign.
value() - 1));
959 Aligned = Builder.CreateIntrinsic(
960 Intrinsic::ptrmask, {PtrTy, IdxTy},
966 Builder.CreateInBoundsPtrAdd(
Aligned, ConstantInt::get(IdxTy, SlotSize));
967 Builder.CreateStore(
Next, VaListPtr);
971 Value *Result = Builder.CreateAlignedLoad(FrameFieldType,
Aligned, SlotAlign);
973 if (SlotInfo.Indirect)
974 Result = Builder.CreateLoad(ValTy, Result);
976 Result->takeName(Inst);
982struct Amdgpu final :
public VariadicABIInfo {
984 bool enableForTarget()
override {
return true; }
986 bool vaListPassedInSSARegister()
override {
return true; }
992 Type *vaListParameterType(
Module &M)
override {
1000 return Builder.CreateAddrSpaceCast(Buffer, vaListParameterType(M));
1004 return {
Align(4),
false};
1008struct NVPTX final :
public VariadicABIInfo {
1010 bool enableForTarget()
override {
return true; }
1012 bool vaListPassedInSSARegister()
override {
return true; }
1018 Type *vaListParameterType(
Module &M)
override {
1024 return Builder.CreateAddrSpaceCast(Buffer, vaListParameterType(M));
1030 Align A =
DL.getABITypeAlign(Parameter);
1035struct SPIRV final :
public VariadicABIInfo {
1037 bool enableForTarget()
override {
return true; }
1039 bool vaListPassedInSSARegister()
override {
return true; }
1045 Type *vaListParameterType(
Module &M)
override {
1051 return Builder.CreateAddrSpaceCast(Buffer, vaListParameterType(M));
1057 Align A =
DL.getABITypeAlign(Parameter);
1062 bool ignoreFunction(
const Function *
F)
override {
1063 if (!
F->isDeclaration())
1083struct Wasm final :
public VariadicABIInfo {
1085 bool enableForTarget()
override {
1087 return commandLineOverride();
1090 bool vaListPassedInSSARegister()
override {
return true; }
1096 Type *vaListParameterType(
Module &M)
override {
1108 Align A =
DL.getABITypeAlign(Parameter);
1113 if (S->getNumElements() > 1) {
1122std::unique_ptr<VariadicABIInfo> VariadicABIInfo::create(
const Triple &
T) {
1123 switch (
T.getArch()) {
1126 return std::make_unique<Amdgpu>();
1130 return std::make_unique<Wasm>();
1135 return std::make_unique<NVPTX>();
1141 return std::make_unique<SPIRV>();
1151char ExpandVariadics::ID = 0;
1157 return new ExpandVariadics(M);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
static bool runOnFunction(Function &F, bool PostInlining)
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
NVPTX address space definition.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallVector class.
an instruction to allocate memory on the stack
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
This class represents an incoming formal argument to a Function.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a call or parameter.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
void setAttributes(AttributeList A)
Set the attributes for this call.
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
A parsed version of the target data layout string in and methods for querying it.
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI ExpandVariadicsPass(ExpandVariadicsMode Mode)
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)
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
AttributeList getAttributes() const
Return the attribute list for this Function.
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Argument * getArg(unsigned i) const
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void setComdat(Comdat *C)
const Comdat * getComdat() const
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
VisibilityTypes getVisibility() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
void setLinkage(LinkageTypes LT)
@ DefaultVisibility
The GV is visible.
void setVisibility(VisibilityTypes V)
@ InternalLinkage
Rename collisions when linking (static functions).
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI const DebugLoc & getStableDebugLoc() const
Fetch the debug location for this node, unless this is a debug intrinsic, in which case fetch the deb...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
This is an important class for using LLVM in a threaded context.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
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.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Class to represent struct types.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
Value * getPointerOperand()
This represents the llvm.va_copy intrinsic.
This represents the llvm.va_end intrinsic.
This represents the llvm.va_start intrinsic.
Value * getArgList() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ C
The default llvm calling convention, compatible with C.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
constexpr T MinAlign(U A, V B)
A and B are either alignments or offsets.
LLVM_ABI ModulePass * createExpandVariadicsPass(ExpandVariadicsMode)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
FunctionAddr VTableAddr Next
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
DEMANGLE_ABI std::string demangle(std::string_view MangledName)
Attempt to demangle a string using different demangling schemes.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.