17#ifndef LLVM_IR_FUNCTION_H
18#define LLVM_IR_FUNCTION_H
48class AssemblyAnnotationWriter;
58class TargetLibraryInfoImpl;
61class BranchProbabilityInfo;
62class BlockFrequencyInfo;
83 unsigned NextBlockNum = 0;
85 unsigned BlockNumEpoch = 0;
89 std::unique_ptr<ValueSymbolTable>
108 IsMaterializableBit = 0,
119 return getSubclassDataFromValue() & (1<<0);
123 void convertToNewDbgValues();
126 void convertFromNewDbgValues();
136 mutable LibFunc LibFuncCache = UnknownLibFunc;
138 void CheckLazyArguments()
const {
139 if (hasLazyArguments())
140 BuildLazyArguments();
143 void BuildLazyArguments()
const;
145 void clearArguments();
147 void deleteBodyImpl(
bool ShouldDrop);
167 unsigned AddrSpace,
const Twine &
N =
"",
175 return new (AllocMarker)
206 unsigned getInstructionCount()
const;
227 bool isVarArg()
const {
return getFunctionType()->isVarArg(); }
230 return getGlobalObjectSubClassData() & (1 << IsMaterializableBit);
233 unsigned Mask = 1 << IsMaterializableBit;
234 setGlobalObjectSubClassData((~Mask & getGlobalObjectSubClassData()) |
254 bool isTargetIntrinsic()
const;
259 bool isConstrainedFPIntrinsic()
const;
265 void updateAfterNameChange();
271 return static_cast<CallingConv::ID>((getSubclassDataFromValue() >> 4) &
275 auto ID =
static_cast<unsigned>(CC);
276 assert(!(
ID & ~CallingConv::MaxID) &&
"Unsupported calling convention");
277 setValueSubclassData((getSubclassDataFromValue() & 0xc00f) | (
ID << 4));
282 switch (getCallingConv()) {
285 case CallingConv::PTX_Kernel:
286 case CallingConv::AMDGPU_KERNEL:
287 case CallingConv::SPIR_KERNEL:
304 : Count(Count), PCT(PCT) {}
320 void setEntryCount(
uint64_t Count, ProfileCountType
Type = PCT_Real,
327 std::optional<ProfileCount> getEntryCount(
bool AllowSynthetic =
false)
const;
335 return getEntryCount(IncludeSynthetic).has_value();
345 return getSubclassDataFromValue() & (1<<14);
347 const std::string &getGC()
const;
348 void setGC(std::string Str);
359 void addAttributeAtIndex(
unsigned i,
Attribute Attr);
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;
474 bool hasStackProtectorFnAttr()
const;
478 void addDereferenceableParamAttr(
unsigned ArgNo,
uint64_t Bytes);
482 void addDereferenceableOrNullParamAttr(
unsigned ArgNo,
uint64_t Bytes);
540 return hasFnAttribute(Attribute::PresplitCoroutine);
546 return hasFnAttribute(Attribute::CoroDestroyOnlyWhenComplete);
549 addFnAttr(Attribute::CoroDestroyOnlyWhenComplete);
556 bool doesNotAccessMemory()
const;
560 bool onlyReadsMemory()
const;
564 bool onlyWritesMemory()
const;
569 bool onlyAccessesArgMemory()
const;
574 bool onlyAccessesInaccessibleMemory()
const;
579 bool onlyAccessesInaccessibleMemOrArgMem()
const;
584 return hasFnAttribute(Attribute::NoReturn);
587 addFnAttr(Attribute::NoReturn);
595 return hasFnAttribute(Attribute::NoUnwind);
598 addFnAttr(Attribute::NoUnwind);
603 return hasFnAttribute(Attribute::NoDuplicate);
606 addFnAttr(Attribute::NoDuplicate);
611 return hasFnAttribute(Attribute::Convergent);
614 addFnAttr(Attribute::Convergent);
617 removeFnAttr(Attribute::Convergent);
622 return hasFnAttribute(Attribute::Speculatable);
625 addFnAttr(Attribute::Speculatable);
630 return onlyReadsMemory() || hasFnAttribute(Attribute::NoFree);
633 addFnAttr(Attribute::NoFree);
638 return hasFnAttribute(Attribute::NoSync);
641 addFnAttr(Attribute::NoSync);
647 return hasFnAttribute(Attribute::NoRecurse);
650 addFnAttr(Attribute::NoRecurse);
655 return hasFnAttribute(Attribute::MustProgress) ||
656 hasFnAttribute(Attribute::WillReturn);
661 bool willReturn()
const {
return hasFnAttribute(Attribute::WillReturn); }
672 return getUWTableKind() != UWTableKind::None;
675 if (K == UWTableKind::None)
676 removeFnAttr(Attribute::UWTable);
678 addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
682 return hasUWTable() || !doesNotThrow() || hasPersonalityFn();
688 return AttributeSets.
hasParamAttr(0, Attribute::StructRet) ||
695 return AttributeSets.
hasRetAttr(Attribute::NoAlias);
700 bool hasOptNone()
const {
return hasFnAttribute(Attribute::OptimizeNone); }
703 bool hasMinSize()
const {
return hasFnAttribute(Attribute::MinSize); }
707 return hasFnAttribute(Attribute::OptimizeForSize) || hasMinSize();
725 void copyAttributesFrom(
const Function *Src);
731 deleteBodyImpl(
false);
732 setLinkage(ExternalLinkage);
738 void removeFromParent();
743 void eraseFromParent();
749 void stealArgumentListFrom(
Function &Src);
760 splice(ToIt, FromF, FromF->
begin(), FromF->
end());
767 auto FromItNext = std::next(FromIt);
769 if (ToIt == FromIt || ToIt == FromItNext)
771 splice(ToIt, FromF, FromIt, FromItNext);
786 LLVM_ABI friend void BasicBlock::removeFromParent();
788 template <
class BB_t,
class BB_i_t,
class BI_t,
class II_t>
803 return &Function::BasicBlocks;
831 void renumberBlocks();
845 void validateBlockNumbers()
const;
867 CheckLazyArguments();
871 CheckLazyArguments();
876 CheckLazyArguments();
880 CheckLazyArguments();
885 assert (i < NumArgs &&
"getArg() out of range!");
886 CheckLazyArguments();
904 return getSubclassDataFromValue() & (1<<3);
909 void setPersonalityFn(
Constant *Fn);
913 return getSubclassDataFromValue() & (1<<1);
918 void setPrefixData(
Constant *PrefixData);
922 return getSubclassDataFromValue() & (1<<2);
927 void setPrologueData(
Constant *PrologueData);
932 bool ShouldPreserveUseListOrder =
false,
933 bool IsForDebug =
false)
const;
945 void viewCFG(
const char *OutputFileName)
const;
950 const char *OutputFileName =
nullptr)
const;
957 void viewCFGOnly()
const;
961 void viewCFGOnly(
const char *OutputFileName)
const;
969 return V->getValueID() == Value::FunctionVal;
985 deleteBodyImpl(
true);
995 bool hasAddressTaken(
const User ** =
nullptr,
bool IgnoreCallbackUses =
false,
996 bool IgnoreAssumeLikeCalls =
true,
997 bool IngoreLLVMUsed =
false,
998 bool IgnoreARCAttachedCall =
false,
999 bool IgnoreCastedDirectCall =
false)
const;
1005 bool isDefTriviallyDead()
const;
1009 bool callsFunctionThatReturnsTwice()
const;
1023 bool shouldEmitDebugInfoForProfiling()
const;
1029 bool nullPointerIsDefined()
const;
1048 unsigned getVScaleValue()
const;
1051 void allocHungoffUselist();
1052 template<
int Idx>
void setHungoffOperand(
Constant *
C);
1056 void setValueSubclassData(
unsigned short D) {
1057 Value::setValueSubclassData(
D);
1059 void setValueSubclassDataBit(
unsigned Bit,
bool On);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Lower Kernel Arguments
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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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)
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseSet and SmallDenseSet classes.
Machine Check Debug Module
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.
LLVM_ABI Type * getParamStructRetType(unsigned ArgNo) const
Return the sret type for the specified function parameter.
LLVM_ABI uint64_t getParamDereferenceableBytes(unsigned Index) const
Get the number of dereferenceable bytes (or zero if unknown) of an arg.
LLVM_ABI MaybeAlign getParamAlignment(unsigned ArgNo) const
Return the alignment for the specified function parameter.
LLVM_ABI Type * getParamInAllocaType(unsigned ArgNo) const
Return the inalloca type for the specified function parameter.
LLVM_ABI UWTableKind getUWTableKind() const
Get the unwind table kind requested for the function.
LLVM_ABI Type * getParamPreallocatedType(unsigned ArgNo) const
Return the preallocated type for the specified function parameter.
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
LLVM_ABI MaybeAlign getFnStackAlignment() const
Get the stack alignment of the function.
LLVM_ABI Type * getParamByValType(unsigned ArgNo) const
Return the byval type for the specified function parameter.
LLVM_ABI MaybeAlign getParamStackAlignment(unsigned ArgNo) const
Return the stack alignment for the specified function parameter.
LLVM_ABI uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Get the number of dereferenceable_or_null bytes (or zero if unknown) of an arg.
LLVM_ABI FPClassTest getParamNoFPClass(unsigned ArgNo) const
Get the disallowed floating-point classes of the argument value.
LLVM_ABI Type * getParamByRefType(unsigned ArgNo) const
Return the byref type for the specified function parameter.
bool hasRetAttr(Attribute::AttrKind Kind) const
Return true if the attribute exists for the return value.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
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.
Class to represent profile counts.
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.
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()
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...
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.
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 "let go" of all references that t...
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.
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.
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.
bool isCoroOnlyDestroyWhenComplete() const
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.
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.
void setDoesNotFreeMemory()
LinkageTypes
An enumeration for the kinds of linkage for global values.
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.
iterator insert(iterator I, 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.
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.
An ilist node that can access its parent list.
base_list_type::iterator 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
LLVM_ABI LLVM_READNONE bool supportsNonVoidReturnType(CallingConv::ID CC)
@ User
could "use" a pointer
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.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
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 ...
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.