• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- MipsFrameLowering.cpp - Mips Frame Information --------------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This file contains the Mips implementation of TargetFrameLowering class.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "MipsFrameLowering.h"
15  #include "MCTargetDesc/MipsBaseInfo.h"
16  #include "MipsAnalyzeImmediate.h"
17  #include "MipsInstrInfo.h"
18  #include "MipsMachineFunction.h"
19  #include "MipsTargetMachine.h"
20  #include "llvm/CodeGen/MachineFrameInfo.h"
21  #include "llvm/CodeGen/MachineFunction.h"
22  #include "llvm/CodeGen/MachineInstrBuilder.h"
23  #include "llvm/CodeGen/MachineModuleInfo.h"
24  #include "llvm/CodeGen/MachineRegisterInfo.h"
25  #include "llvm/IR/DataLayout.h"
26  #include "llvm/IR/Function.h"
27  #include "llvm/Support/CommandLine.h"
28  #include "llvm/Target/TargetOptions.h"
29  
30  using namespace llvm;
31  
32  
33  //===----------------------------------------------------------------------===//
34  //
35  // Stack Frame Processing methods
36  // +----------------------------+
37  //
38  // The stack is allocated decrementing the stack pointer on
39  // the first instruction of a function prologue. Once decremented,
40  // all stack references are done thought a positive offset
41  // from the stack/frame pointer, so the stack is considering
42  // to grow up! Otherwise terrible hacks would have to be made
43  // to get this stack ABI compliant :)
44  //
45  //  The stack frame required by the ABI (after call):
46  //  Offset
47  //
48  //  0                 ----------
49  //  4                 Args to pass
50  //  .                 saved $GP  (used in PIC)
51  //  .                 Alloca allocations
52  //  .                 Local Area
53  //  .                 CPU "Callee Saved" Registers
54  //  .                 saved FP
55  //  .                 saved RA
56  //  .                 FPU "Callee Saved" Registers
57  //  StackSize         -----------
58  //
59  // Offset - offset from sp after stack allocation on function prologue
60  //
61  // The sp is the stack pointer subtracted/added from the stack size
62  // at the Prologue/Epilogue
63  //
64  // References to the previous stack (to obtain arguments) are done
65  // with offsets that exceeds the stack size: (stacksize+(4*(num_arg-1))
66  //
67  // Examples:
68  // - reference to the actual stack frame
69  //   for any local area var there is smt like : FI >= 0, StackOffset: 4
70  //     sw REGX, 4(SP)
71  //
72  // - reference to previous stack frame
73  //   suppose there's a load to the 5th arguments : FI < 0, StackOffset: 16.
74  //   The emitted instruction will be something like:
75  //     lw REGX, 16+StackSize(SP)
76  //
77  // Since the total stack size is unknown on LowerFormalArguments, all
78  // stack references (ObjectOffset) created to reference the function
79  // arguments, are negative numbers. This way, on eliminateFrameIndex it's
80  // possible to detect those references and the offsets are adjusted to
81  // their real location.
82  //
83  //===----------------------------------------------------------------------===//
84  
create(MipsTargetMachine & TM,const MipsSubtarget & ST)85  const MipsFrameLowering *MipsFrameLowering::create(MipsTargetMachine &TM,
86                                                     const MipsSubtarget &ST) {
87    if (TM.getSubtargetImpl()->inMips16Mode())
88      return llvm::createMips16FrameLowering(ST);
89  
90    return llvm::createMipsSEFrameLowering(ST);
91  }
92  
93  // hasFP - Return true if the specified function should have a dedicated frame
94  // pointer register.  This is true if the function has variable sized allocas or
95  // if frame pointer elimination is disabled.
hasFP(const MachineFunction & MF) const96  bool MipsFrameLowering::hasFP(const MachineFunction &MF) const {
97    const MachineFrameInfo *MFI = MF.getFrameInfo();
98    return MF.getTarget().Options.DisableFramePointerElim(MF) ||
99        MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken();
100  }
101  
estimateStackSize(const MachineFunction & MF) const102  uint64_t MipsFrameLowering::estimateStackSize(const MachineFunction &MF) const {
103    const MachineFrameInfo *MFI = MF.getFrameInfo();
104    const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo();
105  
106    int64_t Offset = 0;
107  
108    // Iterate over fixed sized objects.
109    for (int I = MFI->getObjectIndexBegin(); I != 0; ++I)
110      Offset = std::max(Offset, -MFI->getObjectOffset(I));
111  
112    // Conservatively assume all callee-saved registers will be saved.
113    for (const uint16_t *R = TRI.getCalleeSavedRegs(&MF); *R; ++R) {
114      unsigned Size = TRI.getMinimalPhysRegClass(*R)->getSize();
115      Offset = RoundUpToAlignment(Offset + Size, Size);
116    }
117  
118    unsigned MaxAlign = MFI->getMaxAlignment();
119  
120    // Check that MaxAlign is not zero if there is a stack object that is not a
121    // callee-saved spill.
122    assert(!MFI->getObjectIndexEnd() || MaxAlign);
123  
124    // Iterate over other objects.
125    for (unsigned I = 0, E = MFI->getObjectIndexEnd(); I != E; ++I)
126      Offset = RoundUpToAlignment(Offset + MFI->getObjectSize(I), MaxAlign);
127  
128    // Call frame.
129    if (MFI->adjustsStack() && hasReservedCallFrame(MF))
130      Offset = RoundUpToAlignment(Offset + MFI->getMaxCallFrameSize(),
131                                  std::max(MaxAlign, getStackAlignment()));
132  
133    return RoundUpToAlignment(Offset, getStackAlignment());
134  }
135