aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/MachineFrameInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/CodeGen/MachineFrameInfo.h')
-rw-r--r--include/llvm/CodeGen/MachineFrameInfo.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/MachineFrameInfo.h b/include/llvm/CodeGen/MachineFrameInfo.h
index 8b958e437e..78898a4a69 100644
--- a/include/llvm/CodeGen/MachineFrameInfo.h
+++ b/include/llvm/CodeGen/MachineFrameInfo.h
@@ -215,6 +215,10 @@ class MachineFrameInfo {
/// just allocate them normally.
bool UseLocalStackAllocationBlock;
+ /// After the stack pointer has been restore from the base pointer we
+ /// use a cached adjusment. Currently only used for x86.
+ int64_t BPAdj;
+
public:
explicit MachineFrameInfo(const TargetFrameLowering &tfi) : TFI(tfi) {
StackSize = NumFixedObjects = OffsetAdjustment = MaxAlignment = 0;
@@ -230,6 +234,7 @@ public:
LocalFrameSize = 0;
LocalFrameMaxAlign = 0;
UseLocalStackAllocationBlock = false;
+ BPAdj = 0;
}
/// hasStackObjects - Return true if there are any stack objects in this
@@ -538,6 +543,16 @@ public:
void setCalleeSavedInfoValid(bool v) { CSIValid = v; }
+ /// setBasePtrStackAdjustment - If we're restoring the stack pointer from the
+ /// base pointer, due to dynamic stack realignment + VLAs, we cache the
+ /// number of bytes initially allocated for the stack frame. In obscure
+ /// cases (e.g., tail calls with byval argument and no stack protector), the
+ /// stack gets adjusted outside of the prolog, but these shouldn't be
+ /// considered when restoring from the base pointer. Currently, this is only
+ /// needed for x86.
+ void setBasePtrStackAdjustment(int64_t adj) { BPAdj = adj; }
+ int64_t getBasePtrStackAdjustment() const { return BPAdj; }
+
/// getPristineRegs - Return a set of physical registers that are pristine on
/// entry to the MBB.
///