brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.0 KiB · 57fc73b Raw
177 lines · c
1//===-- SystemZFrameLowering.h - Frame lowering for SystemZ -----*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H10#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H11 12#include "MCTargetDesc/SystemZMCTargetDesc.h"13#include "SystemZInstrBuilder.h"14#include "SystemZMachineFunctionInfo.h"15#include "llvm/ADT/IndexedMap.h"16#include "llvm/CodeGen/TargetFrameLowering.h"17#include "llvm/Support/TypeSize.h"18 19namespace llvm {20class SystemZSubtarget;21 22class SystemZFrameLowering : public TargetFrameLowering {23public:24  SystemZFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl,25                       bool StackReal, unsigned PointerSize);26 27  static std::unique_ptr<SystemZFrameLowering>28  create(const SystemZSubtarget &STI);29 30  // Override TargetFrameLowering.31  bool allocateScavengingFrameIndexesNearIncomingSP(32    const MachineFunction &MF) const override {33    // SystemZ wants normal register scavenging slots, as close to the stack or34    // frame pointer as possible.35    // The default implementation assumes an x86-like layout, where the frame36    // pointer is at the opposite end of the frame from the stack pointer.37    // This meant that when frame pointer elimination was disabled,38    // the slots ended up being as close as possible to the incoming39    // stack pointer, which is the opposite of what we want on SystemZ.40    return false;41  }42 43  bool hasReservedCallFrame(const MachineFunction &MF) const override;44 45  // Return the offset of the backchain.46  virtual unsigned getBackchainOffset(MachineFunction &MF) const = 0;47 48  // Return the offset of the return address.49  virtual int getReturnAddressOffset(MachineFunction &MF) const = 0;50 51  // Get or create the frame index of where the old frame pointer is stored.52  virtual int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const = 0;53 54  // Return the size of a pointer (in bytes).55  unsigned getPointerSize() const { return PointerSize; }56 57private:58  unsigned PointerSize;59};60 61class SystemZELFFrameLowering : public SystemZFrameLowering {62  IndexedMap<unsigned> RegSpillOffsets;63 64public:65  SystemZELFFrameLowering(unsigned PointerSize);66 67  // Override TargetFrameLowering.68  bool69  assignCalleeSavedSpillSlots(MachineFunction &MF,70                              const TargetRegisterInfo *TRI,71                              std::vector<CalleeSavedInfo> &CSI) const override;72  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,73                            RegScavenger *RS) const override;74  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,75                                 MachineBasicBlock::iterator MBBI,76                                 ArrayRef<CalleeSavedInfo> CSI,77                                 const TargetRegisterInfo *TRI) const override;78  bool79  restoreCalleeSavedRegisters(MachineBasicBlock &MBB,80                              MachineBasicBlock::iterator MBBII,81                              MutableArrayRef<CalleeSavedInfo> CSI,82                              const TargetRegisterInfo *TRI) const override;83  void processFunctionBeforeFrameFinalized(MachineFunction &MF,84                                           RegScavenger *RS) const override;85  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;86  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;87  void inlineStackProbe(MachineFunction &MF,88                        MachineBasicBlock &PrologMBB) const override;89  StackOffset getFrameIndexReference(const MachineFunction &MF, int FI,90                                     Register &FrameReg) const override;91  void92  orderFrameObjects(const MachineFunction &MF,93                    SmallVectorImpl<int> &ObjectsToAllocate) const override;94 95  // Return the byte offset from the incoming stack pointer of Reg's96  // ABI-defined save slot.  Return 0 if no slot is defined for Reg.  Adjust97  // the offset in case MF has packed-stack.98  unsigned getRegSpillOffset(MachineFunction &MF, Register Reg) const;99 100  bool usePackedStack(MachineFunction &MF) const;101 102  // Return the offset of the backchain.103  unsigned getBackchainOffset(MachineFunction &MF) const override {104    // The back chain is stored topmost with packed-stack.105    return usePackedStack(MF) ? SystemZMC::ELFCallFrameSize - 8 : 0;106  }107 108  // Return the offset of the return address.109  int getReturnAddressOffset(MachineFunction &MF) const override {110    return (usePackedStack(MF) ? -2 : 14) * getPointerSize();111  }112 113  // Get or create the frame index of where the old frame pointer is stored.114  int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const override;115 116protected:117  bool hasFPImpl(const MachineFunction &MF) const override;118};119 120class SystemZXPLINKFrameLowering : public SystemZFrameLowering {121  IndexedMap<unsigned> RegSpillOffsets;122 123public:124  SystemZXPLINKFrameLowering(unsigned PointerSize);125 126  bool127  assignCalleeSavedSpillSlots(MachineFunction &MF,128                              const TargetRegisterInfo *TRI,129                              std::vector<CalleeSavedInfo> &CSI) const override;130 131  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,132                            RegScavenger *RS) const override;133 134  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,135                                 MachineBasicBlock::iterator MBBI,136                                 ArrayRef<CalleeSavedInfo> CSI,137                                 const TargetRegisterInfo *TRI) const override;138 139  bool140  restoreCalleeSavedRegisters(MachineBasicBlock &MBB,141                              MachineBasicBlock::iterator MBBII,142                              MutableArrayRef<CalleeSavedInfo> CSI,143                              const TargetRegisterInfo *TRI) const override;144 145  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;146 147  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;148 149  void inlineStackProbe(MachineFunction &MF,150                        MachineBasicBlock &PrologMBB) const override;151 152  void processFunctionBeforeFrameFinalized(MachineFunction &MF,153                                           RegScavenger *RS) const override;154 155  void determineFrameLayout(MachineFunction &MF) const;156 157  // Return the offset of the backchain.158  unsigned getBackchainOffset(MachineFunction &MF) const override {159    // The back chain is always the first element of the frame.160    return 0;161  }162 163  // Return the offset of the return address.164  int getReturnAddressOffset(MachineFunction &MF) const override {165    return 3 * getPointerSize();166  }167 168  // Get or create the frame index of where the old frame pointer is stored.169  int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const override;170 171protected:172  bool hasFPImpl(const MachineFunction &MF) const override;173};174} // end namespace llvm175 176#endif177