17#ifndef LLVM_IR_FUNCTION_H
18#define LLVM_IR_FUNCTION_H
47class AssemblyAnnotationWriter;
56class BranchProbabilityInfo;
57class BlockFrequencyInfo;
76 std::unique_ptr<ValueSymbolTable>
95 IsMaterializableBit = 0,
106 return getSubclassDataFromValue() & (1<<0);
110 void CheckLazyArguments()
const {
111 if (hasLazyArguments())
112 BuildLazyArguments();
115 void BuildLazyArguments()
const;
117 void clearArguments();
123 Function(
FunctionType *Ty, LinkageTypes Linkage,
unsigned AddrSpace,
124 const Twine &
N =
"",
Module *M =
nullptr);
137 unsigned AddrSpace,
const Twine &
N =
"",
139 return new Function(Ty, Linkage, AddrSpace,
N, M);
145 return new Function(Ty, Linkage,
static_cast<unsigned>(-1),
N, M);
171 unsigned getInstructionCount()
const;
175 return cast<FunctionType>(getValueType());
187 bool isVarArg()
const {
return getFunctionType()->isVarArg(); }
190 return getGlobalObjectSubClassData() & (1 << IsMaterializableBit);
193 unsigned Mask = 1 << IsMaterializableBit;
194 setGlobalObjectSubClassData((~Mask & getGlobalObjectSubClassData()) |
218 bool isTargetIntrinsic()
const;
223 bool isConstrainedFPIntrinsic()
const;
232 void recalculateIntrinsicID();
238 return static_cast<CallingConv::ID>((getSubclassDataFromValue() >> 4) &
242 auto ID =
static_cast<unsigned>(
CC);
243 assert(!(
ID & ~CallingConv::MaxID) &&
"Unsupported calling convention");
244 setValueSubclassData((getSubclassDataFromValue() & 0xc00f) | (
ID << 4));
259 : Count(Count), PCT(PCT) {}
275 void setEntryCount(
uint64_t Count, ProfileCountType
Type = PCT_Real,
282 std::optional<ProfileCount> getEntryCount(
bool AllowSynthetic =
false)
const;
290 return getEntryCount(IncludeSynthetic).has_value();
301 std::optional<StringRef> getSectionPrefix()
const;
306 return getSubclassDataFromValue() & (1<<14);
308 const std::string &getGC()
const;
309 void setGC(std::string Str);
320 void addAttributeAtIndex(
unsigned i,
Attribute Attr);
347 void addParamAttr(
unsigned ArgNo,
Attribute Attr);
350 void addParamAttrs(
unsigned ArgNo,
const AttrBuilder &Attrs);
356 void removeAttributeAtIndex(
unsigned i,
StringRef Kind);
379 void removeParamAttr(
unsigned ArgNo,
StringRef Kind);
382 void removeParamAttrs(
unsigned ArgNo,
const AttributeMask &Attrs);
388 bool hasFnAttribute(
StringRef Kind)
const;
430 bool hasStackProtectorFnAttr()
const;
434 void addDereferenceableParamAttr(
unsigned ArgNo,
uint64_t Bytes);
438 void addDereferenceableOrNullParamAttr(
unsigned ArgNo,
uint64_t Bytes);
493 return hasFnAttribute(Attribute::PresplitCoroutine);
502 bool doesNotAccessMemory()
const;
506 bool onlyReadsMemory()
const;
510 bool onlyWritesMemory()
const;
515 bool onlyAccessesArgMemory()
const;
520 bool onlyAccessesInaccessibleMemory()
const;
525 bool onlyAccessesInaccessibleMemOrArgMem()
const;
530 return hasFnAttribute(Attribute::NoReturn);
533 addFnAttr(Attribute::NoReturn);
541 return hasFnAttribute(Attribute::NoUnwind);
544 addFnAttr(Attribute::NoUnwind);
549 return hasFnAttribute(Attribute::NoDuplicate);
552 addFnAttr(Attribute::NoDuplicate);
557 return hasFnAttribute(Attribute::Convergent);
560 addFnAttr(Attribute::Convergent);
563 removeFnAttr(Attribute::Convergent);
568 return hasFnAttribute(Attribute::Speculatable);
571 addFnAttr(Attribute::Speculatable);
576 return onlyReadsMemory() || hasFnAttribute(Attribute::NoFree);
579 addFnAttr(Attribute::NoFree);
584 return hasFnAttribute(Attribute::NoSync);
587 addFnAttr(Attribute::NoSync);
593 return hasFnAttribute(Attribute::NoRecurse);
596 addFnAttr(Attribute::NoRecurse);
601 return hasFnAttribute(Attribute::MustProgress) ||
602 hasFnAttribute(Attribute::WillReturn);
607 bool willReturn()
const {
return hasFnAttribute(Attribute::WillReturn); }
618 return getUWTableKind() != UWTableKind::None;
621 addFnAttr(Attribute::getWithUWTableKind(getContext(), K));
625 return hasUWTable() || !doesNotThrow() || hasPersonalityFn();
631 return AttributeSets.
hasParamAttr(0, Attribute::StructRet) ||
638 return AttributeSets.
hasRetAttr(Attribute::NoAlias);
643 bool hasOptNone()
const {
return hasFnAttribute(Attribute::OptimizeNone); }
646 bool hasMinSize()
const {
return hasFnAttribute(Attribute::MinSize); }
650 return hasFnAttribute(Attribute::OptimizeForSize) || hasMinSize();
668 void copyAttributesFrom(
const Function *Src);
675 setLinkage(ExternalLinkage);
681 void removeFromParent();
686 void eraseFromParent();
692 void stealArgumentListFrom(
Function &Src);
697 return BasicBlocks.
insert(Position, BB);
702 splice(ToIt, FromF, FromF->
begin(), FromF->
end());
709 auto FromItNext = std::next(FromIt);
711 if (ToIt == FromIt || ToIt == FromItNext)
713 splice(ToIt, FromF, FromIt, FromItNext);
728 friend void BasicBlock::removeFromParent();
730 template <
class BB_t,
class BB_i_t,
class BI_t,
class II_t>
745 return &Function::BasicBlocks;
770 size_t size()
const {
return BasicBlocks.size(); }
771 bool empty()
const {
return BasicBlocks.empty(); }
781 CheckLazyArguments();
785 CheckLazyArguments();
790 CheckLazyArguments();
794 CheckLazyArguments();
799 assert (i < NumArgs &&
"getArg() out of range!");
800 CheckLazyArguments();
818 return getSubclassDataFromValue() & (1<<3);
823 void setPersonalityFn(
Constant *Fn);
827 return getSubclassDataFromValue() & (1<<1);
832 void setPrefixData(
Constant *PrefixData);
836 return getSubclassDataFromValue() & (1<<2);
841 void setPrologueData(
Constant *PrologueData);
846 bool ShouldPreserveUseListOrder =
false,
847 bool IsForDebug =
false)
const;
866 void viewCFGOnly()
const;
874 return V->getValueID() == Value::FunctionVal;
889 void dropAllReferences();
897 bool hasAddressTaken(
const User ** =
nullptr,
898 bool IgnoreCallbackUses =
false,
899 bool IgnoreAssumeLikeCalls =
true,
900 bool IngoreLLVMUsed =
false,
901 bool IgnoreARCAttachedCall =
false)
const;
907 bool isDefTriviallyDead()
const;
911 bool callsFunctionThatReturnsTwice()
const;
925 bool shouldEmitDebugInfoForProfiling()
const;
931 bool nullPointerIsDefined()
const;
934 void allocHungoffUselist();
935 template<
int Idx>
void setHungoffOperand(
Constant *
C);
939 void setValueSubclassData(
unsigned short D) {
940 Value::setValueSubclassData(
D);
942 void setValueSubclassDataBit(
unsigned Bit,
bool On);
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 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)
#define LLVM_EXTERNAL_VISIBILITY
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
This file defines the DenseSet and SmallDenseSet classes.
Machine Check Debug Module
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This class represents an incoming formal argument to a Function.
Type * getParamStructRetType(unsigned ArgNo) const
Return the sret type for the specified function parameter.
uint64_t getParamDereferenceableBytes(unsigned Index) const
Get the number of dereferenceable bytes (or zero if unknown) of an arg.
MaybeAlign getParamAlignment(unsigned ArgNo) const
Return the alignment for the specified function parameter.
Type * getParamInAllocaType(unsigned ArgNo) const
Return the inalloca type for the specified function parameter.
UWTableKind getUWTableKind() const
Get the unwind table kind requested for the function.
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.
MaybeAlign getFnStackAlignment() const
Get the stack alignment of the function.
Type * getParamByValType(unsigned ArgNo) const
Return the byval type for the specified function parameter.
MaybeAlign getParamStackAlignment(unsigned ArgNo) const
Return the stack alignment for the specified function parameter.
uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const
Get the number of dereferenceable_or_null bytes (or zero if unknown) of an arg.
FPClassTest getParamNoFPClass(unsigned ArgNo) const
Get the disallowed floating-point classes of the argument value.
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 is an important base class in LLVM.
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.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlock & getEntryBlock()
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 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
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 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()
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 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.
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.
void removeParamUndefImplyingAttrs(unsigned ArgNo)
removes noundef and other attributes that imply undefined behavior if a undef or poison value is pass...
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.
Summary of how a function affects memory in the program.
A Module instance is used to store all the information related to an LLVM module.
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.
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.
Iterator for intrusive lists based on ilist_node.
An ilist node that can access its parent list.
iterator insert(iterator where, pointer New)
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.
@ 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.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
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.