llvm-6502/lib/Target/SystemZ/SystemZFrameLowering.h
Ulrich Weigand 1d09d56fe1 [SystemZ] Add back end
This adds the actual lib/Target/SystemZ target files necessary to
implement the SystemZ target.  Note that at this point, the target
cannot yet be built since the configure bits are missing.  Those
will be provided shortly by a follow-on patch.

This version of the patch incorporates feedback from reviews by
Chris Lattner and Anton Korobeynikov.  Thanks to all reviewers!

Patch by Richard Sandiford.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181203 91177308-0d34-0410-b5e6-96231b3b80d8
2013-05-06 16:15:19 +00:00

94 lines
3.8 KiB
C++

//===-- SystemZFrameLowering.h - Frame lowering for SystemZ -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef SYSTEMZFRAMELOWERING_H
#define SYSTEMZFRAMELOWERING_H
#include "SystemZSubtarget.h"
#include "llvm/ADT/IndexedMap.h"
#include "llvm/Target/TargetFrameLowering.h"
namespace llvm {
class SystemZTargetMachine;
class SystemZSubtarget;
class SystemZFrameLowering : public TargetFrameLowering {
IndexedMap<unsigned> RegSpillOffsets;
protected:
const SystemZTargetMachine &TM;
const SystemZSubtarget &STI;
public:
SystemZFrameLowering(const SystemZTargetMachine &tm,
const SystemZSubtarget &sti);
// Override FrameLowering.
virtual void
processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
RegScavenger *RS) const LLVM_OVERRIDE;
virtual bool
spillCalleeSavedRegisters(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const
LLVM_OVERRIDE;
virtual bool
restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBII,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const
LLVM_OVERRIDE;
virtual void emitPrologue(MachineFunction &MF) const LLVM_OVERRIDE;
virtual void emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const LLVM_OVERRIDE;
virtual bool hasFP(const MachineFunction &MF) const LLVM_OVERRIDE;
virtual int getFrameIndexOffset(const MachineFunction &MF,
int FI) const LLVM_OVERRIDE;
virtual bool hasReservedCallFrame(const MachineFunction &MF) const
LLVM_OVERRIDE;
virtual void
eliminateCallFramePseudoInstr(MachineFunction &MF,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const
LLVM_OVERRIDE;
// The target-independent code automatically allocates save slots for
// call-saved GPRs. However, we don't need those slots for SystemZ,
// because the ABI sets aside GPR save slots in the caller-allocated part
// of the frame. Since the target-independent code puts this unneeded
// area at the top of the callee-allocated part of frame, we choose not
// to allocate it and adjust the offsets accordingly. Return the
// size of this unallocated area.
// FIXME: seems a bit hackish.
uint64_t getUnallocatedTopBytes(const MachineFunction &MF) const;
// Return the number of bytes in the callee-allocated part of the frame.
uint64_t getAllocatedStackSize(const MachineFunction &MF) const;
// Return the number of frame bytes that should be reserved for
// an emergency spill slot, for use by the register scaveneger.
// Return 0 if register scaveging won't be needed.
unsigned getEmergencySpillSlotSize(const MachineFunction &MF) const;
// Return the offset from the frame pointer of the emergency spill slot,
// which always fits within a 12-bit unsigned displacement field.
// Only valid if getEmergencySpillSlotSize(MF) returns nonzero.
unsigned getEmergencySpillSlotOffset(const MachineFunction &MF) const;
// Return the byte offset from the incoming stack pointer of Reg's
// ABI-defined save slot. Return 0 if no slot is defined for Reg.
unsigned getRegSpillOffset(unsigned Reg) const {
return RegSpillOffsets[Reg];
}
};
} // end namespace llvm
#endif