mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-11 04:30:52 +00:00

If you're going to realign %sp to get object alignment properly (which the code does), and stack offsets and alignments are calculated going down from %fp (which they are), then the total stack size had better be a multiple of the alignment. LLVM did indeed ensure that. And then, after aligning, the sparc frame code added 96 (for sparcv8) to the frame size, making any requested alignment of 64-bytes or higher *guaranteed* to be misaligned. The test case added with r245668 even tests this exact scenario, and asserted the incorrect behavior, which I somehow failed to notice. D'oh. This change fixes the frame lowering code to align the stack size *after* adding the spill area, instead. Differential Revision: http://reviews.llvm.org/D12349 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246042 91177308-0d34-0410-b5e6-96231b3b80d8
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
//===-- SparcFrameLowering.h - Define frame lowering for Sparc --*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
//
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_SPARC_SPARCFRAMELOWERING_H
|
|
#define LLVM_LIB_TARGET_SPARC_SPARCFRAMELOWERING_H
|
|
|
|
#include "Sparc.h"
|
|
#include "llvm/Target/TargetFrameLowering.h"
|
|
|
|
namespace llvm {
|
|
|
|
class SparcSubtarget;
|
|
class SparcFrameLowering : public TargetFrameLowering {
|
|
public:
|
|
explicit SparcFrameLowering(const SparcSubtarget &ST);
|
|
|
|
/// emitProlog/emitEpilog - These methods insert prolog and epilog code into
|
|
/// the function.
|
|
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
|
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
|
|
|
void
|
|
eliminateCallFramePseudoInstr(MachineFunction &MF,
|
|
MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator I) const override;
|
|
|
|
bool hasReservedCallFrame(const MachineFunction &MF) const override;
|
|
bool hasFP(const MachineFunction &MF) const override;
|
|
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
|
|
RegScavenger *RS = nullptr) const override;
|
|
|
|
int getFrameIndexReference(const MachineFunction &MF, int FI,
|
|
unsigned &FrameReg) const override;
|
|
|
|
/// targetHandlesStackFrameRounding - Returns true if the target is
|
|
/// responsible for rounding up the stack frame (probably at emitPrologue
|
|
/// time).
|
|
bool targetHandlesStackFrameRounding() const override { return true; }
|
|
|
|
private:
|
|
// Remap input registers to output registers for leaf procedure.
|
|
void remapRegsForLeafProc(MachineFunction &MF) const;
|
|
|
|
// Returns true if MF is a leaf procedure.
|
|
bool isLeafProc(MachineFunction &MF) const;
|
|
|
|
|
|
// Emits code for adjusting SP in function prologue/epilogue.
|
|
void emitSPAdjustment(MachineFunction &MF,
|
|
MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator MBBI,
|
|
int NumBytes, unsigned ADDrr, unsigned ADDri) const;
|
|
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|