17#ifndef LLVM_IR_FUNCTION_H
18#define LLVM_IR_FUNCTION_H
54enum LibFunc : unsigned;
82 friend void BasicBlock::setParent(Function *);
83 unsigned NextBlockNum = 0;
85 unsigned BlockNumEpoch = 0;
87 mutable Argument *Arguments =
nullptr;
89 std::unique_ptr<ValueSymbolTable>
91 AttributeList AttributeSets;
108 IsMaterializableBit = 0,
123 void convertToNewDbgValues();
126 void convertFromNewDbgValues();
131 static constexpr LibFunc UnknownLibFunc = LibFunc(-1);
136 mutable LibFunc LibFuncCache = UnknownLibFunc;
138 void CheckLazyArguments()
const {
140 BuildLazyArguments();
143 void BuildLazyArguments()
const;
145 void clearArguments();
147 void deleteBodyImpl(
bool ShouldDrop);
167 unsigned AddrSpace,
const Twine &
N =
"",
169 return new (AllocMarker) Function(Ty,
Linkage, AddrSpace,
N, M);
175 return new (AllocMarker)
176 Function(Ty,
Linkage,
static_cast<unsigned>(-1),
N, M);
233 unsigned Mask = 1 << IsMaterializableBit;
254 bool isTargetIntrinsic()
const;
259 bool isConstrainedFPIntrinsic()
const;
265 void updateAfterNameChange();
275 auto ID =
static_cast<unsigned>(CC);
304 : Count(Count), PCT(PCT) {}
327 std::optional<ProfileCount> getEntryCount(
bool AllowSynthetic =
false)
const;
347 const std::string &getGC()
const;
348 void setGC(std::string Str);
359 void addAttributeAtIndex(
unsigned i,
Attribute Attr);
371 void addFnAttrs(
const AttrBuilder &Attrs);
380 void addRetAttrs(
const AttrBuilder &Attrs);
386 void addParamAttr(
unsigned ArgNo,
Attribute Attr);
389 void addParamAttrs(
unsigned ArgNo,
const AttrBuilder &Attrs);
395 void removeAttributeAtIndex(
unsigned i,
StringRef Kind);
418 void removeParamAttr(
unsigned ArgNo,
StringRef Kind);
421 void removeParamAttrs(
unsigned ArgNo,
const AttributeMask &Attrs);
427 bool hasFnAttribute(
StringRef Kind)
const;
436 bool hasParamAttribute(
unsigned ArgNo,
StringRef Kind)
const;
470 return AttributeSets.getFnStackAlignment();
474 bool hasStackProtectorFnAttr()
const;
478 void addDereferenceableParamAttr(
unsigned ArgNo,
uint64_t Bytes);
482 void addDereferenceableOrNullParamAttr(
unsigned ArgNo,
uint64_t Bytes);
488 return AttributeSets.getParamAlignment(ArgNo);
492 return AttributeSets.getParamStackAlignment(ArgNo);
497 return AttributeSets.getParamByValType(ArgNo);
502 return AttributeSets.getParamStructRetType(ArgNo);
507 return AttributeSets.getParamInAllocaType(ArgNo);
512 return AttributeSets.getParamByRefType(ArgNo);
517 return AttributeSets.getParamPreallocatedType(ArgNo);
523 return AttributeSets.getParamDereferenceableBytes(ArgNo);
529 return AttributeSets.getDeadOnReturnInfo(ArgNo);
536 return AttributeSets.getParamDereferenceableOrNullBytes(ArgNo);
541 return AttributeSets.getParamNoFPClass(ArgNo);
555 addFnAttr(Attribute::CoroDestroyOnlyWhenComplete);
562 bool doesNotAccessMemory()
const;
566 bool onlyReadsMemory()
const;
570 bool onlyWritesMemory()
const;
575 bool onlyAccessesArgMemory()
const;
580 bool onlyAccessesInaccessibleMemory()
const;
585 bool onlyAccessesInaccessibleMemOrArgMem()
const;
672 return AttributeSets.getUWTableKind();
694 return AttributeSets.hasParamAttr(0, Attribute::StructRet) ||
695 AttributeSets.hasParamAttr(1, Attribute::StructRet);
701 return AttributeSets.hasRetAttr(Attribute::NoAlias);
731 void copyAttributesFrom(
const Function *Src);
737 deleteBodyImpl(
false);
744 void removeFromParent();
749 void eraseFromParent();
755 void stealArgumentListFrom(
Function &Src);
773 auto FromItNext = std::next(FromIt);
775 if (ToIt == FromIt || ToIt == FromItNext)
777 splice(ToIt, FromF, FromIt, FromItNext);
794 template <
class BB_t,
class BB_i_t,
class BI_t,
class II_t>
809 return &Function::BasicBlocks;
837 void renumberBlocks();
851 void validateBlockNumbers()
const;
862 size_t size()
const {
return BasicBlocks.size(); }
863 bool empty()
const {
return BasicBlocks.empty(); }
873 CheckLazyArguments();
877 CheckLazyArguments();
882 CheckLazyArguments();
883 return Arguments + NumArgs;
886 CheckLazyArguments();
887 return Arguments + NumArgs;
891 assert (i < NumArgs &&
"getArg() out of range!");
892 CheckLazyArguments();
893 return Arguments + i;
915 void setPersonalityFn(
Constant *Fn);
924 void setPrefixData(
Constant *PrefixData);
933 void setPrologueData(
Constant *PrologueData);
938 bool ShouldPreserveUseListOrder =
false,
939 bool IsForDebug =
false)
const;
951 void viewCFG(
const char *OutputFileName)
const;
956 const char *OutputFileName =
nullptr)
const;
963 void viewCFGOnly()
const;
967 void viewCFGOnly(
const char *OutputFileName)
const;
975 return V->getValueID() == Value::FunctionVal;
991 deleteBodyImpl(
true);
1001 bool hasAddressTaken(
const User ** =
nullptr,
bool IgnoreCallbackUses =
false,
1002 bool IgnoreAssumeLikeCalls =
true,
1003 bool IngoreLLVMUsed =
false,
1004 bool IgnoreARCAttachedCall =
false,
1005 bool IgnoreCastedDirectCall =
false)
const;
1011 bool isDefTriviallyDead()
const;
1015 bool callsFunctionThatReturnsTwice()
const;
1029 bool shouldEmitDebugInfoForProfiling()
const;
1035 bool nullPointerIsDefined()
const;
1054 unsigned getVScaleValue()
const;
1057 void allocHungoffUselist();
1058 template<
int Idx>
void setHungoffOperand(
Constant *
C);
1062 void setValueSubclassData(
unsigned short D) {
1065 void setValueSubclassDataBit(
unsigned Bit,
bool On);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
This file contains the simple types necessary to represent the attributes associated with functions a...
static bool setDoesNotAccessMemory(Function &F)
static bool setMemoryEffects(Function &F, MemoryEffects ME)
static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F)
static bool setOnlyAccessesInaccessibleMemory(Function &F)
static bool setOnlyAccessesArgMemory(Function &F)
static bool setOnlyWritesMemory(Function &F)
static bool setOnlyReadsMemory(Function &F)
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static void viewCFG(Function &F, const BlockFrequencyInfo *BFI, const BranchProbabilityInfo *BPI, uint64_t MaxFreq, bool CFGOnly=false)
SmallVector< BasicBlock *, 8 > BasicBlockListType
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
This file defines the DenseSet and SmallDenseSet classes.
II addRangeRetAttr(Range)
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This class represents an incoming formal argument to a Function.
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
Functions, function parameters, and return types can have attributes to indicate how they should be t...
static LLVM_ABI Attribute getWithUWTableKind(LLVMContext &Context, UWTableKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
const Instruction & back() const
friend void Instruction::removeFromParent()
friend BasicBlock::iterator Instruction::eraseFromParent()
const Instruction & front() const
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
This class represents a range of values.
This is an important base class in LLVM.
Subprogram description. Uses SubclassData1.
A parsed version of the target data layout string in and methods for querying it.
Implements a dense probed hash-table based set.
Class to represent function types.
uint64_t getCount() const
ProfileCount(uint64_t Count, ProfileCountType PCT)
ProfileCountType getType() const
void deleteBody()
deleteBody - This method deletes the body of the function, and converts the linkage to external.
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
const ValueSymbolTable * getValueSymbolTable() const
bool isConvergent() const
Determine if the call is convergent.
void setCoroDestroyOnlyWhenComplete()
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlock & getEntryBlock()
SymbolTableList< BasicBlock > BasicBlockListType
void setAlignment(MaybeAlign Align)
Sets the alignment attribute of the Function.
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
const BasicBlock & getEntryBlock() const
BasicBlockListType::iterator iterator
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
void splice(Function::iterator ToIt, Function *FromF, Function::iterator FromIt)
Transfer one BasicBlock from FromF at FromIt to this function at ToIt.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
bool isMaterializable() const
MaybeAlign getAlign() const
Returns the alignment of the given function.
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
iterator_range< const_arg_iterator > args() const
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
const BasicBlock & front() const
const_arg_iterator arg_end() const
const_arg_iterator arg_begin() const
bool mustProgress() const
Determine if the function is required to make forward progress.
bool returnDoesNotAlias() const
Determine if the parameter or return value is marked with NoAlias attribute.
bool cannotDuplicate() const
Determine if the call cannot be duplicated.
const BasicBlock & back() const
unsigned getMaxBlockNumber() const
Return a value larger than the largest block number.
bool willReturn() const
Determine if the function will return.
iterator_range< arg_iterator > args()
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
friend class TargetLibraryInfoImpl
bool doesNotRecurse() const
Determine if the function is known not to recurse, directly or indirectly.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
bool doesNoCfCheck() const
Determine if the function should not perform indirect branch tracking.
void setIsMaterializable(bool V)
uint64_t getParamDereferenceableBytes(unsigned ArgNo) const
Extract the number of dereferenceable bytes for a parameter.
bool isSpeculatable() const
Determine if the call has sideeffects.
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a parameter.
FPClassTest getParamNoFPClass(unsigned ArgNo) const
Extract the nofpclass attribute for a parameter.
bool hasPrefixData() const
Check whether this function has prefix data.
void setReturnDoesNotAlias()
bool hasPersonalityFn() const
Check whether this function has a personality function.
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, const Twine &N="", Module *M=nullptr)
AttributeList getAttributes() const
Return the attribute list for this Function.
void dropAllReferences()
dropAllReferences() - This method causes all the subinstructions to "letgo" of all references that th...
unsigned getBlockNumberEpoch() const
Return the "epoch" of current block numbers.
void setUWTableKind(UWTableKind K)
BasicBlockListType::const_iterator const_iterator
UWTableKind getUWTableKind() const
Get what kind of unwind table entry to generate for this function.
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a parameter.
bool hasNoSync() const
Determine if the call can synchroize with other threads.
bool doesNotThrow() const
Determine if the function cannot unwind.
const Function & getFunction() const
const_iterator end() const
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Extract the number of dereferenceable_or_null bytes for a parameter.
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
const_iterator begin() const
void setPresplitCoroutine()
void setAlignment(Align Align)
Sets the alignment attribute of the Function.
MaybeAlign getParamAlign(unsigned ArgNo) const
ValueSymbolTable * getValueSymbolTable()
getSymbolTable() - Return the symbol table if any, otherwise nullptr.
bool hasOptNone() const
Do not optimize this function (-O0).
void setCannotDuplicate()
Type * getParamPreallocatedType(unsigned ArgNo) const
Extract the preallocated type for a parameter.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
bool isPresplitCoroutine() const
Determine if the function is presplit coroutine.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
bool hasKernelCallingConv() const
Does it have a kernel calling convention?
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
bool doesNotFreeMemory() const
Determine if the call might deallocate memory.
Type * getParamInAllocaType(unsigned ArgNo) const
Extract the inalloca type for a parameter.
bool doesNotReturn() const
Determine if the function cannot return.
friend class InstIterator
bool isCoroOnlyDestroyWhenComplete() const
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
void setSplittedCoroutine()
MaybeAlign getParamStackAlign(unsigned ArgNo) const
bool hasUWTable() const
True if the ABI mandates (or the user requested) that this function be in a unwind table.
void operator=(const Function &)=delete
Type * getReturnType() const
Returns the type of the ret val.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
bool hasLazyArguments() const
hasLazyArguments/CheckLazyArguments - The argument list of a function is built on demand,...
void setCallingConv(CallingConv::ID CC)
Function(const Function &)=delete
bool hasPrologueData() const
Check whether this function has prologue data.
const Argument * const_arg_iterator
DeadOnReturnInfo getDeadOnReturnInfo(unsigned ArgNo) const
Extract the number of dead_on_return bytes for a parameter.
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Argument * getArg(unsigned i) const
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
void setDoesNotFreeMemory()
MaybeAlign getAlign() const
Returns the alignment of the given variable or function.
LLVM_ABI void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
GlobalObject(Type *Ty, ValueTy VTy, AllocInfo AllocInfo, LinkageTypes Linkage, const Twine &Name, unsigned AddressSpace=0)
void setGlobalObjectSubClassData(unsigned Val)
unsigned getGlobalObjectSubClassData() const
Intrinsic::ID IntID
The intrinsic ID for this subclass (which must be a Function).
unsigned HasLLVMReservedName
True if the function's name starts with "llvm.".
void setLinkage(LinkageTypes LT)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ ExternalLinkage
Externally visible function.
This is an important class for using LLVM in a threaded context.
A Module instance is used to store all the information related to an LLVM module.
StringRef - Represent a constant reference to a string, i.e.
List that automatically updates parent links and symbol tables.
Implementation of the target library information.
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.
This class provides a symbol table of name/value pairs.
LLVM Value Representation.
unsigned short getSubclassDataFromValue() const
void setValueSubclassData(unsigned short D)
An ilist node that can access its parent list.
typename base_list_type::iterator iterator
typename base_list_type::const_iterator const_iterator
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
CallingConv Namespace - This namespace contains an enum with a value for the well-known calling conve...
LLVM_ABI LLVM_READNONE bool supportsNonVoidReturnType(CallingConv::ID CC)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ MaxID
The highest possible ID. Must be some 2^k - 1.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ 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.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
@ None
No unwind table requested.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
FunctionAddr VTableAddr Count
Function::ProfileCount ProfileCount
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
@ Default
The result values are uniform if and only if all operands are uniform.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Represent subnormal handling kind for floating point instruction inputs and outputs.
HungoffOperandTraits - determine the allocation regime of the Use array when it is not a prefix to th...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Compile-time customization of User operands.
Indicates this User has operands "hung off" in another allocation.