diff options
| -rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 49 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.h | 78 | 
2 files changed, 48 insertions, 79 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index e75cb038abb..e073e6a8437 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -16,7 +16,6 @@  //  //===----------------------------------------------------------------------===// -#include "PrologEpilogInserter.h"  #include "llvm/ADT/IndexedMap.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SetVector.h" @@ -28,6 +27,7 @@  #include "llvm/CodeGen/MachineLoopInfo.h"  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/Passes.h"  #include "llvm/CodeGen/RegisterScavenging.h"  #include "llvm/CodeGen/StackProtector.h"  #include "llvm/IR/DiagnosticInfo.h" @@ -48,6 +48,53 @@ using namespace llvm;  #define DEBUG_TYPE "pei" +namespace { +class PEI : public MachineFunctionPass { +public: +  static char ID; +  PEI() : MachineFunctionPass(ID) { +    initializePEIPass(*PassRegistry::getPassRegistry()); +  } + +  void getAnalysisUsage(AnalysisUsage &AU) const override; + +  /// runOnMachineFunction - Insert prolog/epilog code and replace abstract +  /// frame indexes with appropriate references. +  /// +  bool runOnMachineFunction(MachineFunction &Fn) override; + +private: +  RegScavenger *RS; + +  // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved +  // stack frame indexes. +  unsigned MinCSFrameIndex, MaxCSFrameIndex; + +  // Entry and return blocks of the current function. +  MachineBasicBlock *EntryBlock; +  SmallVector<MachineBasicBlock *, 4> ReturnBlocks; + +  // Flag to control whether to use the register scavenger to resolve +  // frame index materialization registers. Set according to +  // TRI->requiresFrameIndexScavenging() for the current function. +  bool FrameIndexVirtualScavenging; + +  void calculateSets(MachineFunction &Fn); +  void calculateCallsInformation(MachineFunction &Fn); +  void calculateCalleeSavedRegisters(MachineFunction &Fn); +  void insertCSRSpillsAndRestores(MachineFunction &Fn); +  void calculateFrameObjectOffsets(MachineFunction &Fn); +  void replaceFrameIndices(MachineFunction &Fn); +  void replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn, +                           int &SPAdj); +  void scavengeFrameVirtualRegs(MachineFunction &Fn); +  void insertPrologEpilogCode(MachineFunction &Fn); + +  // Convenience for recognizing return blocks. +  bool isReturnBlock(MachineBasicBlock *MBB); +}; +} // namespace +  char PEI::ID = 0;  char &llvm::PrologEpilogCodeInserterID = PEI::ID; diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.h b/llvm/lib/CodeGen/PrologEpilogInserter.h deleted file mode 100644 index f88b8ef2b66..00000000000 --- a/llvm/lib/CodeGen/PrologEpilogInserter.h +++ /dev/null @@ -1,78 +0,0 @@ -//===-- PrologEpilogInserter.h - Prolog/Epilog code insertion -*- C++ -*---===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This pass is responsible for finalizing the functions frame layout, saving -// callee saved registers, and for emitting prolog & epilog code for the -// function. -// -// This pass must be run after register allocation.  After this pass is -// executed, it is illegal to construct MO_FrameIndex operands. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIB_CODEGEN_PROLOGEPILOGINSERTER_H -#define LLVM_LIB_CODEGEN_PROLOGEPILOGINSERTER_H - -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SparseBitVector.h" -#include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/CodeGen/MachineLoopInfo.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/Target/TargetRegisterInfo.h" - -namespace llvm { -  class RegScavenger; -  class MachineBasicBlock; - -  class PEI : public MachineFunctionPass { -  public: -    static char ID; -    PEI() : MachineFunctionPass(ID) { -      initializePEIPass(*PassRegistry::getPassRegistry()); -    } - -    void getAnalysisUsage(AnalysisUsage &AU) const override; - -    /// runOnMachineFunction - Insert prolog/epilog code and replace abstract -    /// frame indexes with appropriate references. -    /// -    bool runOnMachineFunction(MachineFunction &Fn) override; - -  private: -    RegScavenger *RS; - -    // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved -    // stack frame indexes. -    unsigned MinCSFrameIndex, MaxCSFrameIndex; - -    // Entry and return blocks of the current function. -    MachineBasicBlock* EntryBlock; -    SmallVector<MachineBasicBlock*, 4> ReturnBlocks; - -    // Flag to control whether to use the register scavenger to resolve -    // frame index materialization registers. Set according to -    // TRI->requiresFrameIndexScavenging() for the curren function. -    bool FrameIndexVirtualScavenging; - -    void calculateSets(MachineFunction &Fn); -    void calculateCallsInformation(MachineFunction &Fn); -    void calculateCalleeSavedRegisters(MachineFunction &Fn); -    void insertCSRSpillsAndRestores(MachineFunction &Fn); -    void calculateFrameObjectOffsets(MachineFunction &Fn); -    void replaceFrameIndices(MachineFunction &Fn); -    void replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn, -                             int &SPAdj); -    void scavengeFrameVirtualRegs(MachineFunction &Fn); -    void insertPrologEpilogCode(MachineFunction &Fn); - -    // Convenience for recognizing return blocks. -    bool isReturnBlock(MachineBasicBlock* MBB); -  }; -} // End llvm namespace -#endif  | 

