Index: src/IceTargetLoweringX86Base.h |
diff --git a/src/IceTargetLoweringX86Base.h b/src/IceTargetLoweringX86Base.h |
index d23e35b7f3d41bdedd50c4bbbfe7c418569b6a9d..90bbed27ac8ecb6f6ced71101be76d35e0cf7754 100644 |
--- a/src/IceTargetLoweringX86Base.h |
+++ b/src/IceTargetLoweringX86Base.h |
@@ -89,9 +89,9 @@ public: |
bool hasFramePointer() const override { return IsEbpBasedFrame; } |
void setHasFramePointer() override { IsEbpBasedFrame = true; } |
SizeT getStackReg() const override { return Traits::RegisterSet::Reg_esp; } |
+ SizeT getFrameReg() const override { return Traits::RegisterSet::Reg_ebp; } |
SizeT getFrameOrStackReg() const override { |
- return IsEbpBasedFrame ? Traits::RegisterSet::Reg_ebp |
- : Traits::RegisterSet::Reg_esp; |
+ return IsEbpBasedFrame ? getFrameReg() : getStackReg(); |
} |
size_t typeWidthInBytesOnStack(Type Ty) const override { |
// Round up to the next multiple of WordType bytes. |
@@ -101,6 +101,16 @@ public: |
uint32_t getStackAlignment() const override { |
return Traits::X86_STACK_ALIGNMENT_BYTES; |
} |
+ void reserveFixedAllocaArea(size_t Size, size_t Align) override { |
+ FixedAllocaSizeBytes = Size; |
+ assert(llvm::isPowerOf2_32(Align)); |
+ FixedAllocaAlignBytes = Align; |
+ PrologEmitsFixedAllocas = true; |
+ } |
+ /// Returns the (negative) offset from ebp/rbp where the fixed Allocas start. |
+ int32_t getFrameFixedAllocaOffset() const override { |
+ return FixedAllocaSizeBytes - SpillAreaSizeBytes; |
+ } |
bool shouldSplitToVariable64On32(Type Ty) const override { |
return Traits::Is64Bit ? false : Ty == IceType_i64; |
@@ -691,6 +701,8 @@ protected: |
bool NeedsStackAlignment = false; |
size_t SpillAreaSizeBytes = 0; |
size_t FixedAllocaSizeBytes = 0; |
+ size_t FixedAllocaAlignBytes = 0; |
+ bool PrologEmitsFixedAllocas = false; |
static std::array<llvm::SmallBitVector, RCX86_NUM> TypeToRegisterSet; |
static std::array<llvm::SmallBitVector, Traits::RegisterSet::Reg_NUM> |
RegisterAliases; |