Replace PROLOG_LABEL with a new CFI_INSTRUCTION.
[oota-llvm.git] / lib / Target / ARM / Thumb1FrameLowering.cpp
1 //===-- Thumb1FrameLowering.cpp - Thumb1 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 Thumb1 implementation of TargetFrameLowering class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "Thumb1FrameLowering.h"
15 #include "ARMMachineFunctionInfo.h"
16 #include "llvm/CodeGen/MachineFrameInfo.h"
17 #include "llvm/CodeGen/MachineFunction.h"
18 #include "llvm/CodeGen/MachineInstrBuilder.h"
19 #include "llvm/CodeGen/MachineModuleInfo.h"
20 #include "llvm/CodeGen/MachineRegisterInfo.h"
21
22 using namespace llvm;
23
24 bool Thumb1FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const{
25   const MachineFrameInfo *FFI = MF.getFrameInfo();
26   unsigned CFSize = FFI->getMaxCallFrameSize();
27   // It's not always a good idea to include the call frame as part of the
28   // stack frame. ARM (especially Thumb) has small immediate offset to
29   // address the stack frame. So a large call frame can cause poor codegen
30   // and may even makes it impossible to scavenge a register.
31   if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4
32     return false;
33
34   return !MF.getFrameInfo()->hasVarSizedObjects();
35 }
36
37 static void
38 emitSPUpdate(MachineBasicBlock &MBB,
39              MachineBasicBlock::iterator &MBBI,
40              const TargetInstrInfo &TII, DebugLoc dl,
41              const Thumb1RegisterInfo &MRI,
42              int NumBytes, unsigned MIFlags = MachineInstr::NoFlags)  {
43   emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes, TII,
44                             MRI, MIFlags);
45 }
46
47
48 void Thumb1FrameLowering::
49 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
50                               MachineBasicBlock::iterator I) const {
51   const Thumb1InstrInfo &TII =
52     *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
53   const Thumb1RegisterInfo *RegInfo =
54     static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
55   if (!hasReservedCallFrame(MF)) {
56     // If we have alloca, convert as follows:
57     // ADJCALLSTACKDOWN -> sub, sp, sp, amount
58     // ADJCALLSTACKUP   -> add, sp, sp, amount
59     MachineInstr *Old = I;
60     DebugLoc dl = Old->getDebugLoc();
61     unsigned Amount = Old->getOperand(0).getImm();
62     if (Amount != 0) {
63       // We need to keep the stack aligned properly.  To do this, we round the
64       // amount of space needed for the outgoing arguments up to the next
65       // alignment boundary.
66       unsigned Align = getStackAlignment();
67       Amount = (Amount+Align-1)/Align*Align;
68
69       // Replace the pseudo instruction with a new instruction...
70       unsigned Opc = Old->getOpcode();
71       if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
72         emitSPUpdate(MBB, I, TII, dl, *RegInfo, -Amount);
73       } else {
74         assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
75         emitSPUpdate(MBB, I, TII, dl, *RegInfo, Amount);
76       }
77     }
78   }
79   MBB.erase(I);
80 }
81
82 void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
83   MachineBasicBlock &MBB = MF.front();
84   MachineBasicBlock::iterator MBBI = MBB.begin();
85   MachineFrameInfo  *MFI = MF.getFrameInfo();
86   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
87   MachineModuleInfo &MMI = MF.getMMI();
88   const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
89   const Thumb1RegisterInfo *RegInfo =
90     static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
91   const Thumb1InstrInfo &TII =
92     *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
93
94   unsigned Align = MF.getTarget().getFrameLowering()->getStackAlignment();
95   unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(Align);
96   unsigned NumBytes = MFI->getStackSize();
97   assert(NumBytes >= ArgRegsSaveSize &&
98          "ArgRegsSaveSize is included in NumBytes");
99   const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
100   DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
101   unsigned FramePtr = RegInfo->getFrameRegister(MF);
102   unsigned BasePtr = RegInfo->getBaseRegister();
103   int CFAOffset = 0;
104
105   // Thumb add/sub sp, imm8 instructions implicitly multiply the offset by 4.
106   NumBytes = (NumBytes + 3) & ~3;
107   MFI->setStackSize(NumBytes);
108
109   // Determine the sizes of each callee-save spill areas and record which frame
110   // belongs to which callee-save spill areas.
111   unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
112   int FramePtrSpillFI = 0;
113
114   if (ArgRegsSaveSize) {
115     emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize,
116                  MachineInstr::FrameSetup);
117     CFAOffset -= ArgRegsSaveSize;
118     unsigned CFIIndex = MMI.addFrameInst(
119         MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
120     BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
121         .addCFIIndex(CFIIndex);
122   }
123
124   if (!AFI->hasStackFrame()) {
125     if (NumBytes - ArgRegsSaveSize != 0) {
126       emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -(NumBytes - ArgRegsSaveSize),
127                    MachineInstr::FrameSetup);
128       CFAOffset -= NumBytes - ArgRegsSaveSize;
129       unsigned CFIIndex = MMI.addFrameInst(
130           MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
131       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
132           .addCFIIndex(CFIIndex);
133     }
134     return;
135   }
136
137   for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
138     unsigned Reg = CSI[i].getReg();
139     int FI = CSI[i].getFrameIdx();
140     switch (Reg) {
141     case ARM::R8:
142     case ARM::R9:
143     case ARM::R10:
144     case ARM::R11:
145       if (STI.isTargetMachO()) {
146         GPRCS2Size += 4;
147         break;
148       }
149       // fallthrough
150     case ARM::R4:
151     case ARM::R5:
152     case ARM::R6:
153     case ARM::R7:
154     case ARM::LR:
155       if (Reg == FramePtr)
156         FramePtrSpillFI = FI;
157       GPRCS1Size += 4;
158       break;
159     default:
160       DPRCSSize += 8;
161     }
162   }
163
164   if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH) {
165     ++MBBI;
166     if (MBBI != MBB.end())
167       dl = MBBI->getDebugLoc();
168   }
169
170   // Determine starting offsets of spill areas.
171   unsigned DPRCSOffset  = NumBytes - ArgRegsSaveSize - (GPRCS1Size + GPRCS2Size + DPRCSSize);
172   unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
173   unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
174   bool HasFP = hasFP(MF);
175   if (HasFP)
176     AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) +
177                                 NumBytes);
178   AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset);
179   AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset);
180   AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
181   NumBytes = DPRCSOffset;
182
183   int FramePtrOffsetInBlock = 0;
184   unsigned adjustedGPRCS1Size = GPRCS1Size;
185   if (tryFoldSPUpdateIntoPushPop(STI, MF, std::prev(MBBI), NumBytes)) {
186     FramePtrOffsetInBlock = NumBytes;
187     adjustedGPRCS1Size += NumBytes;
188     NumBytes = 0;
189   }
190
191   if (adjustedGPRCS1Size) {
192     CFAOffset -= adjustedGPRCS1Size;
193     unsigned CFIIndex = MMI.addFrameInst(
194         MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
195     BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
196         .addCFIIndex(CFIIndex);
197   }
198   for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
199          E = CSI.end(); I != E; ++I) {
200     unsigned Reg = I->getReg();
201     int FI = I->getFrameIdx();
202     switch (Reg) {
203     case ARM::R8:
204     case ARM::R9:
205     case ARM::R10:
206     case ARM::R11:
207     case ARM::R12:
208       if (STI.isTargetMachO())
209         break;
210       // fallthough
211     case ARM::R0:
212     case ARM::R1:
213     case ARM::R2:
214     case ARM::R3:
215     case ARM::R4:
216     case ARM::R5:
217     case ARM::R6:
218     case ARM::R7:
219     case ARM::LR:
220       unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
221           nullptr, MRI->getDwarfRegNum(Reg, true), MFI->getObjectOffset(FI)));
222       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
223           .addCFIIndex(CFIIndex);
224       break;
225     }
226   }
227
228
229   // Adjust FP so it point to the stack slot that contains the previous FP.
230   if (HasFP) {
231     FramePtrOffsetInBlock += MFI->getObjectOffset(FramePtrSpillFI)
232                                      + GPRCS1Size + ArgRegsSaveSize;
233     AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr)
234       .addReg(ARM::SP).addImm(FramePtrOffsetInBlock / 4)
235       .setMIFlags(MachineInstr::FrameSetup));
236     if(FramePtrOffsetInBlock) {
237       CFAOffset += FramePtrOffsetInBlock;
238       unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfa(
239           nullptr, MRI->getDwarfRegNum(FramePtr, true), CFAOffset));
240       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
241           .addCFIIndex(CFIIndex);
242     } else {
243       unsigned CFIIndex =
244           MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(
245               nullptr, MRI->getDwarfRegNum(FramePtr, true)));
246       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
247           .addCFIIndex(CFIIndex);
248     }
249     if (NumBytes > 508)
250       // If offset is > 508 then sp cannot be adjusted in a single instruction,
251       // try restoring from fp instead.
252       AFI->setShouldRestoreSPFromFP(true);
253   }
254
255   if (NumBytes) {
256     // Insert it after all the callee-save spills.
257     emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes,
258                  MachineInstr::FrameSetup);
259     if (!HasFP) {
260       CFAOffset -= NumBytes;
261       unsigned CFIIndex = MMI.addFrameInst(
262           MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset));
263       BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
264           .addCFIIndex(CFIIndex);
265     }
266   }
267
268   if (STI.isTargetELF() && HasFP)
269     MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() -
270                              AFI->getFramePtrSpillOffset());
271
272   AFI->setGPRCalleeSavedArea1Size(GPRCS1Size);
273   AFI->setGPRCalleeSavedArea2Size(GPRCS2Size);
274   AFI->setDPRCalleeSavedAreaSize(DPRCSSize);
275
276   // Thumb1 does not currently support dynamic stack realignment.  Report a
277   // fatal error rather then silently generate bad code.
278   if (RegInfo->needsStackRealignment(MF))
279       report_fatal_error("Dynamic stack realignment not supported for thumb1.");
280
281   // If we need a base pointer, set it up here. It's whatever the value
282   // of the stack pointer is at this point. Any variable size objects
283   // will be allocated after this, so we can still use the base pointer
284   // to reference locals.
285   if (RegInfo->hasBasePointer(MF))
286     AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), BasePtr)
287                    .addReg(ARM::SP));
288
289   // If the frame has variable sized objects then the epilogue must restore
290   // the sp from fp. We can assume there's an FP here since hasFP already
291   // checks for hasVarSizedObjects.
292   if (MFI->hasVarSizedObjects())
293     AFI->setShouldRestoreSPFromFP(true);
294 }
295
296 static bool isCSRestore(MachineInstr *MI, const uint16_t *CSRegs) {
297   if (MI->getOpcode() == ARM::tLDRspi &&
298       MI->getOperand(1).isFI() &&
299       isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs))
300     return true;
301   else if (MI->getOpcode() == ARM::tPOP) {
302     // The first two operands are predicates. The last two are
303     // imp-def and imp-use of SP. Check everything in between.
304     for (int i = 2, e = MI->getNumOperands() - 2; i != e; ++i)
305       if (!isCalleeSavedRegister(MI->getOperand(i).getReg(), CSRegs))
306         return false;
307     return true;
308   }
309   return false;
310 }
311
312 void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,
313                                    MachineBasicBlock &MBB) const {
314   MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
315   assert((MBBI->getOpcode() == ARM::tBX_RET ||
316           MBBI->getOpcode() == ARM::tPOP_RET) &&
317          "Can only insert epilog into returning blocks");
318   DebugLoc dl = MBBI->getDebugLoc();
319   MachineFrameInfo *MFI = MF.getFrameInfo();
320   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
321   const Thumb1RegisterInfo *RegInfo =
322     static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
323   const Thumb1InstrInfo &TII =
324     *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
325
326   unsigned Align = MF.getTarget().getFrameLowering()->getStackAlignment();
327   unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(Align);
328   int NumBytes = (int)MFI->getStackSize();
329   assert((unsigned)NumBytes >= ArgRegsSaveSize &&
330          "ArgRegsSaveSize is included in NumBytes");
331   const uint16_t *CSRegs = RegInfo->getCalleeSavedRegs();
332   unsigned FramePtr = RegInfo->getFrameRegister(MF);
333
334   if (!AFI->hasStackFrame()) {
335     if (NumBytes - ArgRegsSaveSize != 0)
336       emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, NumBytes - ArgRegsSaveSize);
337   } else {
338     // Unwind MBBI to point to first LDR / VLDRD.
339     if (MBBI != MBB.begin()) {
340       do
341         --MBBI;
342       while (MBBI != MBB.begin() && isCSRestore(MBBI, CSRegs));
343       if (!isCSRestore(MBBI, CSRegs))
344         ++MBBI;
345     }
346
347     // Move SP to start of FP callee save spill area.
348     NumBytes -= (AFI->getGPRCalleeSavedArea1Size() +
349                  AFI->getGPRCalleeSavedArea2Size() +
350                  AFI->getDPRCalleeSavedAreaSize() +
351                  ArgRegsSaveSize);
352
353     if (AFI->shouldRestoreSPFromFP()) {
354       NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
355       // Reset SP based on frame pointer only if the stack frame extends beyond
356       // frame pointer stack slot, the target is ELF and the function has FP, or
357       // the target uses var sized objects.
358       if (NumBytes) {
359         assert(MF.getRegInfo().isPhysRegUsed(ARM::R4) &&
360                "No scratch register to restore SP from FP!");
361         emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::R4, FramePtr, -NumBytes,
362                                   TII, *RegInfo);
363         AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
364                                ARM::SP)
365           .addReg(ARM::R4));
366       } else
367         AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
368                                ARM::SP)
369           .addReg(FramePtr));
370     } else {
371       if (MBBI->getOpcode() == ARM::tBX_RET &&
372           &MBB.front() != MBBI &&
373           std::prev(MBBI)->getOpcode() == ARM::tPOP) {
374         MachineBasicBlock::iterator PMBBI = std::prev(MBBI);
375         if (!tryFoldSPUpdateIntoPushPop(STI, MF, PMBBI, NumBytes))
376           emitSPUpdate(MBB, PMBBI, TII, dl, *RegInfo, NumBytes);
377       } else if (!tryFoldSPUpdateIntoPushPop(STI, MF, MBBI, NumBytes))
378         emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, NumBytes);
379     }
380   }
381
382   if (ArgRegsSaveSize) {
383     // Unlike T2 and ARM mode, the T1 pop instruction cannot restore
384     // to LR, and we can't pop the value directly to the PC since
385     // we need to update the SP after popping the value. Therefore, we
386     // pop the old LR into R3 as a temporary.
387
388     // Get the last instruction, tBX_RET
389     MBBI = MBB.getLastNonDebugInstr();
390     assert (MBBI->getOpcode() == ARM::tBX_RET);
391     // Epilogue for vararg functions: pop LR to R3 and branch off it.
392     AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tPOP)))
393       .addReg(ARM::R3, RegState::Define);
394
395     emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, ArgRegsSaveSize);
396
397     MachineInstrBuilder MIB =
398       BuildMI(MBB, MBBI, dl, TII.get(ARM::tBX_RET_vararg))
399       .addReg(ARM::R3, RegState::Kill);
400     AddDefaultPred(MIB);
401     MIB.copyImplicitOps(&*MBBI);
402     // erase the old tBX_RET instruction
403     MBB.erase(MBBI);
404   }
405 }
406
407 bool Thumb1FrameLowering::
408 spillCalleeSavedRegisters(MachineBasicBlock &MBB,
409                           MachineBasicBlock::iterator MI,
410                           const std::vector<CalleeSavedInfo> &CSI,
411                           const TargetRegisterInfo *TRI) const {
412   if (CSI.empty())
413     return false;
414
415   DebugLoc DL;
416   MachineFunction &MF = *MBB.getParent();
417   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
418
419   if (MI != MBB.end()) DL = MI->getDebugLoc();
420
421   MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(ARM::tPUSH));
422   AddDefaultPred(MIB);
423   for (unsigned i = CSI.size(); i != 0; --i) {
424     unsigned Reg = CSI[i-1].getReg();
425     bool isKill = true;
426
427     // Add the callee-saved register as live-in unless it's LR and
428     // @llvm.returnaddress is called. If LR is returned for @llvm.returnaddress
429     // then it's already added to the function and entry block live-in sets.
430     if (Reg == ARM::LR) {
431       MachineFunction &MF = *MBB.getParent();
432       if (MF.getFrameInfo()->isReturnAddressTaken() &&
433           MF.getRegInfo().isLiveIn(Reg))
434         isKill = false;
435     }
436
437     if (isKill)
438       MBB.addLiveIn(Reg);
439
440     MIB.addReg(Reg, getKillRegState(isKill));
441   }
442   MIB.setMIFlags(MachineInstr::FrameSetup);
443   return true;
444 }
445
446 bool Thumb1FrameLowering::
447 restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
448                             MachineBasicBlock::iterator MI,
449                             const std::vector<CalleeSavedInfo> &CSI,
450                             const TargetRegisterInfo *TRI) const {
451   if (CSI.empty())
452     return false;
453
454   MachineFunction &MF = *MBB.getParent();
455   ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
456   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
457
458   bool isVarArg = AFI->getArgRegsSaveSize() > 0;
459   DebugLoc DL = MI->getDebugLoc();
460   MachineInstrBuilder MIB = BuildMI(MF, DL, TII.get(ARM::tPOP));
461   AddDefaultPred(MIB);
462
463   bool NumRegs = false;
464   for (unsigned i = CSI.size(); i != 0; --i) {
465     unsigned Reg = CSI[i-1].getReg();
466     if (Reg == ARM::LR) {
467       // Special epilogue for vararg functions. See emitEpilogue
468       if (isVarArg)
469         continue;
470       Reg = ARM::PC;
471       (*MIB).setDesc(TII.get(ARM::tPOP_RET));
472       MIB.copyImplicitOps(&*MI);
473       MI = MBB.erase(MI);
474     }
475     MIB.addReg(Reg, getDefRegState(true));
476     NumRegs = true;
477   }
478
479   // It's illegal to emit pop instruction without operands.
480   if (NumRegs)
481     MBB.insert(MI, &*MIB);
482   else
483     MF.DeleteMachineInstr(MIB);
484
485   return true;
486 }