13#ifndef LLVM_CODEGEN_MACHINEFRAMEINFO_H
14#define LLVM_CODEGEN_MACHINEFRAMEINFO_H
56 bool SpilledToReg =
false;
154 bool isStatepointSpillSlot =
false;
158 bool isCalleeSaved =
false;
177 bool PreAllocated =
false;
194 bool IsImmutable,
bool IsSpillSlot,
const AllocaInst *Alloca,
195 bool IsAliased,
uint8_t StackID = 0)
196 : SPOffset(SPOffset),
Size(
Size), Alignment(Alignment),
197 isImmutable(IsImmutable), isSpillSlot(IsSpillSlot), StackID(StackID),
198 Alloca(Alloca), isAliased(IsAliased) {}
202 Align StackAlignment;
215 bool StackRealignable;
221 std::vector<StackObject> Objects;
226 unsigned NumFixedObjects = 0;
230 bool HasVarSizedObjects =
false;
234 bool FrameAddressTaken =
false;
238 bool ReturnAddressTaken =
false;
242 bool HasStackMap =
false;
246 bool HasPatchPoint =
false;
252 uint64_t StackSize = 0;
263 int64_t OffsetAdjustment = 0;
277 bool AdjustsStack =
false;
280 bool HasCalls =
false;
283 int StackProtectorIdx = -1;
286 int FunctionContextIdx = -1;
292 uint64_t MaxCallFrameSize = ~UINT64_C(0);
296 unsigned CVBytesOfCalleeSavedRegisters = 0;
302 std::vector<CalleeSavedInfo> CSInfo;
305 bool CSIValid =
false;
312 int64_t LocalFrameSize = 0;
316 Align LocalFrameMaxAlign;
321 bool UseLocalStackAllocationBlock =
false;
325 bool HasOpaqueSPAdjustment =
false;
329 bool HasCopyImplyingStackAdjustment =
false;
332 bool HasVAStart =
false;
335 bool HasMustTailInVarArgFunc =
false;
340 bool HasTailCall =
false;
348 uint64_t UnsafeStackSize = 0;
353 : StackAlignment(StackAlignment),
354 StackRealignable(StackRealignable), ForcedRealign(ForcedRealign) {}
431 LocalFrameObjects.push_back(std::pair<int, int64_t>(ObjectIndex,
Offset));
432 Objects[ObjectIndex + NumFixedObjects].PreAllocated =
true;
437 assert (i >= 0 && (
unsigned)i < LocalFrameObjects.size() &&
438 "Invalid local object reference!");
439 return LocalFrameObjects[i];
454 LocalFrameMaxAlign = Alignment;
463 return UseLocalStackAllocationBlock;
470 UseLocalStackAllocationBlock = v;
475 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
476 "Invalid Object Idx!");
477 return Objects[ObjectIdx+NumFixedObjects].PreAllocated;
482 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
483 "Invalid Object Idx!");
484 return Objects[ObjectIdx+NumFixedObjects].Size;
489 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
490 "Invalid Object Idx!");
491 Objects[ObjectIdx+NumFixedObjects].Size =
Size;
496 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
497 "Invalid Object Idx!");
498 return Objects[ObjectIdx + NumFixedObjects].Alignment;
520 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
521 "Invalid Object Idx!");
522 Objects[ObjectIdx + NumFixedObjects].Alignment = Alignment;
533 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
534 "Invalid Object Idx!");
535 return Objects[ObjectIdx+NumFixedObjects].Alloca;
541 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
542 "Invalid Object Idx!");
543 Objects[ObjectIdx + NumFixedObjects].Alloca =
nullptr;
549 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
550 "Invalid Object Idx!");
552 "Getting frame offset for a dead object?");
553 return Objects[ObjectIdx+NumFixedObjects].SPOffset;
557 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
558 "Invalid Object Idx!");
559 return Objects[ObjectIdx+NumFixedObjects].isZExt;
563 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
564 "Invalid Object Idx!");
565 Objects[ObjectIdx+NumFixedObjects].isZExt = IsZExt;
569 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
570 "Invalid Object Idx!");
571 return Objects[ObjectIdx+NumFixedObjects].isSExt;
575 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
576 "Invalid Object Idx!");
577 Objects[ObjectIdx+NumFixedObjects].isSExt = IsSExt;
583 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
584 "Invalid Object Idx!");
586 "Setting frame offset for a dead object?");
587 Objects[ObjectIdx+NumFixedObjects].SPOffset = SPOffset;
591 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
592 "Invalid Object Idx!");
593 return (
SSPLayoutKind)Objects[ObjectIdx+NumFixedObjects].SSPLayout;
597 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
598 "Invalid Object Idx!");
600 "Setting SSP layout for a dead object?");
601 Objects[ObjectIdx+NumFixedObjects].SSPLayout = Kind;
631 return ForcedRealign || MaxAlignment > StackAlignment;
651 return HasCopyImplyingStackAdjustment;
654 HasCopyImplyingStackAdjustment =
B;
679 std::vector<MachineBasicBlock::iterator> *FrameSDOps =
nullptr);
691 return MaxCallFrameSize;
694 return MaxCallFrameSize != ~UINT64_C(0);
701 return CVBytesOfCalleeSavedRegisters;
704 CVBytesOfCalleeSavedRegisters = S;
712 bool IsImmutable,
bool isAliased =
false);
717 bool IsImmutable =
false);
721 return ObjectIdx < 0 && (ObjectIdx >= -(int)NumFixedObjects);
727 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
728 "Invalid Object Idx!");
729 return Objects[ObjectIdx+NumFixedObjects].isAliased;
734 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
735 "Invalid Object Idx!");
736 Objects[ObjectIdx+NumFixedObjects].isAliased = IsAliased;
744 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
745 "Invalid Object Idx!");
746 return Objects[ObjectIdx+NumFixedObjects].isImmutable;
751 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
752 "Invalid Object Idx!");
753 Objects[ObjectIdx+NumFixedObjects].isImmutable = IsImmutable;
758 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
759 "Invalid Object Idx!");
760 return Objects[ObjectIdx+NumFixedObjects].isSpillSlot;
764 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
765 "Invalid Object Idx!");
766 return Objects[ObjectIdx+NumFixedObjects].isStatepointSpillSlot;
770 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
771 "Invalid Object Idx!");
772 return Objects[ObjectIdx + NumFixedObjects].isCalleeSaved;
776 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
777 "Invalid Object Idx!");
778 Objects[ObjectIdx + NumFixedObjects].isCalleeSaved = IsCalleeSaved;
783 return Objects[ObjectIdx+NumFixedObjects].StackID;
788 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
789 "Invalid Object Idx!");
790 Objects[ObjectIdx+NumFixedObjects].StackID =
ID;
797 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
798 "Invalid Object Idx!");
799 return Objects[ObjectIdx+NumFixedObjects].Size == ~0ULL;
805 assert(
unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
806 "Invalid Object Idx!");
807 return Objects[ObjectIdx + NumFixedObjects].Size == 0;
811 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
812 "Invalid Object Idx!");
813 Objects[ObjectIdx+NumFixedObjects].isStatepointSpillSlot =
true;
831 Objects[ObjectIdx+NumFixedObjects].Size = ~0ULL;
850 CSInfo = std::move(CSI);
863 SavePoints = std::move(NewSavePoints);
867 RestorePoints = std::move(NewRestorePoints);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the SmallVector class.
an instruction to allocate memory on the stack
CalleeSavedInfo(MCRegister R, int FI=0)
bool isSpilledToReg() const
void setReg(MCRegister R)
MCRegister getReg() const
MCRegister getDstReg() const
void setDstReg(MCRegister SpillReg)
Wrapper class representing physical registers. Should be passed by value.
constexpr unsigned id() const
bool needsSplitStackProlog() const
Return true if this function requires a split stack prolog, even if it uses no stack space.
void setMaxCallFrameSize(uint64_t S)
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
void clearObjectAllocation(int ObjectIdx)
Remove the underlying Alloca of the specified stack object if it exists.
void setObjectZExt(int ObjectIdx, bool IsZExt)
void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable)
Marks the immutability of an object.
SSPLayoutKind getObjectSSPLayout(int ObjectIdx) const
bool isObjectPreAllocated(int ObjectIdx) const
Return true if the object was pre-allocated into the local block.
LLVM_ABI void computeMaxCallFrameSize(MachineFunction &MF, std::vector< MachineBasicBlock::iterator > *FrameSDOps=nullptr)
Computes the maximum size of a callframe.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
void setAdjustsStack(bool V)
const AllocaInst * getObjectAllocation(int ObjectIdx) const
Return the underlying Alloca of the specified stack object if it exists.
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
LLVM_ABI void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
bool isReturnAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
MachineFrameInfo(Align StackAlignment, bool StackRealignable, bool ForcedRealign)
int64_t getLocalFrameObjectCount() const
Return the number of objects allocated into the local object block.
void setHasPatchPoint(bool s=true)
bool hasCalls() const
Return true if the current function has any function calls.
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
std::vector< CalleeSavedInfo > & getCalleeSavedInfo()
bool isScalableStackID(uint8_t StackID) const
void setUseLocalStackAllocationBlock(bool v)
setUseLocalStackAllocationBlock - Set whether the local allocation blob should be allocated together ...
Align getMaxAlign() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
Align getLocalFrameMaxAlign() const
Return the required alignment of the local object blob.
void setLocalFrameSize(int64_t sz)
Set the size of the local object blob.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
Set the stack frame offset of the specified object.
SSPLayoutKind
Stack Smashing Protection (SSP) rules require that vulnerable stack allocations are located close the...
@ SSPLK_SmallArray
Array or nested array < SSP-buffer-size.
@ SSPLK_LargeArray
Array or nested array >= SSP-buffer-size.
@ SSPLK_AddrOf
The address of this allocation is exposed and triggered protection.
@ SSPLK_None
Did not trigger a stack protector.
bool isCalleeSavedObjectIndex(int ObjectIdx) const
void clearRestorePoints()
void markAsStatepointSpillSlotObjectIndex(int ObjectIdx)
std::pair< int, int64_t > getLocalFrameObjectMap(int i) const
Get the local offset mapping for a for an object.
bool contributesToMaxAlignment(uint8_t StackID)
Should this stack ID be considered in MaxAlignment.
void setFrameAddressIsTaken(bool T)
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
bool shouldRealignStack() const
Return true if stack realignment is forced by function attributes or if the stack alignment.
bool hasPatchPoint() const
This method may be called any time after instruction selection is complete to determine if there is a...
void setHasStackMap(bool s=true)
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
void setSavePoints(SaveRestorePoints NewSavePoints)
bool hasScalableStackID(int ObjectIdx) const
void setObjectSExt(int ObjectIdx, bool IsSExt)
void setObjectSSPLayout(int ObjectIdx, SSPLayoutKind Kind)
bool getUseLocalStackAllocationBlock() const
Get whether the local allocation blob should be allocated together or let PEI allocate the locals in ...
void setLocalFrameMaxAlign(Align Alignment)
Required alignment of the local object blob, which is the strictest alignment of any object in it.
bool isImmutableObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an immutable object.
void setCVBytesOfCalleeSavedRegisters(unsigned S)
int getStackProtectorIndex() const
Return the index for the stack protector object.
int64_t getOffsetAdjustment() const
Return the correction for frame offsets.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
void setObjectSize(int ObjectIdx, int64_t Size)
Change the size of the specified stack object.
LLVM_ABI uint64_t estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
void setStackID(int ObjectIdx, uint8_t ID)
void setHasTailCall(bool V=true)
bool hasTailCall() const
Returns true if the function contains a tail call.
bool hasMustTailInVarArgFunc() const
Returns true if the function is variadic and contains a musttail call.
void setStackProtectorIndex(int I)
void setIsAliasedObjectIndex(int ObjectIdx, bool IsAliased)
Set "maybe pointed to by an LLVM IR value" for an object.
void setCalleeSavedInfoValid(bool v)
bool isStatepointSpillSlotObjectIndex(int ObjectIdx) const
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
void setReturnAddressIsTaken(bool s)
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isObjectZExt(int ObjectIdx) const
void mapLocalFrameObject(int ObjectIndex, int64_t Offset)
Map a frame index into the local object block.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
bool isMaxCallFrameSizeComputed() const
void setHasOpaqueSPAdjustment(bool B)
int64_t getLocalFrameSize() const
Get the size of the local object blob.
bool isObjectSExt(int ObjectIdx) const
LLVM_ABI BitVector getPristineRegs(const MachineFunction &MF) const
Return a set of physical registers that are pristine.
bool hasStackMap() const
This method may be called any time after instruction selection is complete to determine if there is a...
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
void RemoveStackObject(int ObjectIdx)
Remove or mark dead a statically sized stack object.
void setCalleeSavedInfo(std::vector< CalleeSavedInfo > CSI)
Used by prolog/epilog inserter to set the function's callee saved information.
void setHasCopyImplyingStackAdjustment(bool B)
LLVM_ABI void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
unsigned getNumObjects() const
Return the number of objects.
bool hasVAStart() const
Returns true if the function calls the llvm.va_start intrinsic.
unsigned getCVBytesOfCalleeSavedRegisters() const
Returns how many bytes of callee-saved registers the target pushed in the prologue.
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
LLVM_ABI int CreateVariableSizedObject(Align Alignment, const AllocaInst *Alloca)
Notify the MachineFrameInfo object that a variable sized object has been created.
uint64_t getUnsafeStackSize() const
LLVM_ABI void dump(const MachineFunction &MF) const
dump - Print the function to stderr.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
bool hasStackProtectorIndex() const
void setRestorePoints(SaveRestorePoints NewRestorePoints)
bool hasCopyImplyingStackAdjustment() const
Returns true if the function contains operations which will lower down to instructions which manipula...
bool hasStackObjects() const
Return true if there are any stack objects in this function.
LLVM_ABI int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool IsImmutable=false)
Create a spill slot at a fixed location on the stack.
MachineFrameInfo(const MachineFrameInfo &)=delete
bool isStackRealignable() const
uint8_t getStackID(int ObjectIdx) const
const SaveRestorePoints & getRestorePoints() const
unsigned getNumFixedObjects() const
Return the number of fixed objects.
void setIsCalleeSavedObjectIndex(int ObjectIdx, bool IsCalleeSaved)
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool hasFunctionContextIndex() const
void setStackSize(uint64_t Size)
Set the size of the stack.
void setHasVAStart(bool B)
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
int getObjectIndexBegin() const
Return the minimum frame object index.
const SaveRestorePoints & getSavePoints() const
void setUnsafeStackSize(uint64_t Size)
void setHasMustTailInVarArgFunc(bool B)
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
void setOffsetAdjustment(int64_t Adj)
Set the correction for frame offsets.
int getFunctionContextIndex() const
Return the index for the function context object.
bool isAliasedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an object that might be pointed to by an LLVM IR v...
void setFunctionContextIndex(int I)
This class implements an extremely fast bulk output stream that can only output to a stream.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ ScalablePredicateVector
This is an optimization pass for GlobalISel generic memory operations.
DenseMap< MachineBasicBlock *, std::vector< CalleeSavedInfo > > SaveRestorePoints
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
This struct is a compact representation of a valid (non-zero power of two) alignment.