brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 9dc88d4 Raw
120 lines · c
1//===- ARMTargetFrameLowering.h - Define frame lowering for ARM -*- 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_ARM_ARMFRAMELOWERING_H10#define LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H11 12#include "llvm/CodeGen/TargetFrameLowering.h"13#include "llvm/Support/TypeSize.h"14 15namespace llvm {16 17class ARMSubtarget;18class CalleeSavedInfo;19class MachineFunction;20 21class ARMFrameLowering : public TargetFrameLowering {22protected:23  const ARMSubtarget &STI;24 25public:26  explicit ARMFrameLowering(const ARMSubtarget &sti);27 28  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into29  /// the function.30  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;31  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;32 33  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,34                                 MachineBasicBlock::iterator MI,35                                 ArrayRef<CalleeSavedInfo> CSI,36                                 const TargetRegisterInfo *TRI) const override;37 38  bool39  restoreCalleeSavedRegisters(MachineBasicBlock &MBB,40                              MachineBasicBlock::iterator MI,41                              MutableArrayRef<CalleeSavedInfo> CSI,42                              const TargetRegisterInfo *TRI) const override;43 44  bool keepFramePointer(const MachineFunction &MF) const;45 46  bool enableCalleeSaveSkip(const MachineFunction &MF) const override;47 48  bool isFPReserved(const MachineFunction &MF) const;49  bool requiresAAPCSFrameRecord(const MachineFunction &MF) const;50  bool hasReservedCallFrame(const MachineFunction &MF) const override;51  bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;52  StackOffset getFrameIndexReference(const MachineFunction &MF, int FI,53                                     Register &FrameReg) const override;54  int ResolveFrameIndexReference(const MachineFunction &MF, int FI,55                                 Register &FrameReg, int SPAdj) const;56 57  void getCalleeSaves(const MachineFunction &MF,58                      BitVector &SavedRegs) const override;59  void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,60                            RegScavenger *RS) const override;61 62  /// Update the IsRestored flag on LR if it is spilled, based on the return63  /// instructions.64  static void updateLRRestored(MachineFunction &MF);65 66  void processFunctionBeforeFrameFinalized(67      MachineFunction &MF, RegScavenger *RS = nullptr) const override;68 69  void adjustForSegmentedStacks(MachineFunction &MF,70                                MachineBasicBlock &MBB) const override;71 72  /// Returns true if the target will correctly handle shrink wrapping.73  bool enableShrinkWrapping(const MachineFunction &MF) const override;74 75  bool isProfitableForNoCSROpt(const Function &F) const override {76    // The no-CSR optimisation is bad for code size on ARM, because we can save77    // many registers with a single PUSH/POP pair.78    return false;79  }80 81  bool82  assignCalleeSavedSpillSlots(MachineFunction &MF,83                              const TargetRegisterInfo *TRI,84                              std::vector<CalleeSavedInfo> &CSI) const override;85 86  const SpillSlot *87  getCalleeSavedSpillSlots(unsigned &NumEntries) const override;88 89protected:90  bool hasFPImpl(const MachineFunction &MF) const override;91 92private:93  void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,94                    ArrayRef<CalleeSavedInfo> CSI, unsigned StmOpc,95                    unsigned StrOpc, bool NoGap,96                    function_ref<bool(unsigned)> Func) const;97  void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,98                   MutableArrayRef<CalleeSavedInfo> CSI, unsigned LdmOpc,99                   unsigned LdrOpc, bool isVarArg, bool NoGap,100                   function_ref<bool(unsigned)> Func) const;101 102  void emitFPStatusSaves(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,103                         ArrayRef<CalleeSavedInfo> CSI,104                         unsigned PushOneOpc) const;105 106  void emitFPStatusRestores(MachineBasicBlock &MBB,107                            MachineBasicBlock::iterator MI,108                            MutableArrayRef<CalleeSavedInfo> CSI,109                            unsigned LdrOpc) const;110 111  MachineBasicBlock::iterator112  eliminateCallFramePseudoInstr(MachineFunction &MF,113                                MachineBasicBlock &MBB,114                                MachineBasicBlock::iterator MI) const override;115};116 117} // end namespace llvm118 119#endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H120