xref: /freebsd/contrib/llvm-project/llvm/lib/Target/M68k/M68kFrameLowering.cpp (revision ebacd8013fe5f7fdf9f6a5b286f6680dd2891036)
1 //===-- M68kFrameLowering.cpp - M68k Frame Information ----------*- 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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// This file contains the M68k implementation of TargetFrameLowering class.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include "M68kFrameLowering.h"
15 
16 #include "M68kInstrBuilder.h"
17 #include "M68kInstrInfo.h"
18 #include "M68kMachineFunction.h"
19 #include "M68kSubtarget.h"
20 
21 #include "llvm/ADT/SmallSet.h"
22 #include "llvm/CodeGen/MachineFrameInfo.h"
23 #include "llvm/CodeGen/MachineFunction.h"
24 #include "llvm/CodeGen/MachineInstrBuilder.h"
25 #include "llvm/CodeGen/MachineModuleInfo.h"
26 #include "llvm/CodeGen/MachineRegisterInfo.h"
27 #include "llvm/IR/DataLayout.h"
28 #include "llvm/IR/Function.h"
29 #include "llvm/Support/Alignment.h"
30 #include "llvm/Support/CommandLine.h"
31 #include "llvm/Target/TargetMachine.h"
32 #include "llvm/Target/TargetOptions.h"
33 
34 using namespace llvm;
35 
36 M68kFrameLowering::M68kFrameLowering(const M68kSubtarget &STI, Align Alignment)
37     : TargetFrameLowering(StackGrowsDown, Alignment, -4), STI(STI),
38       TII(*STI.getInstrInfo()), TRI(STI.getRegisterInfo()) {
39   SlotSize = STI.getSlotSize();
40   StackPtr = TRI->getStackRegister();
41 }
42 
43 bool M68kFrameLowering::hasFP(const MachineFunction &MF) const {
44   const MachineFrameInfo &MFI = MF.getFrameInfo();
45   const TargetRegisterInfo *TRI = STI.getRegisterInfo();
46 
47   return MF.getTarget().Options.DisableFramePointerElim(MF) ||
48          MFI.hasVarSizedObjects() || MFI.isFrameAddressTaken() ||
49          TRI->hasStackRealignment(MF);
50 }
51 
52 // FIXME Make sure no other factors prevent us from reserving call frame
53 bool M68kFrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
54   return !MF.getFrameInfo().hasVarSizedObjects() &&
55          !MF.getInfo<M68kMachineFunctionInfo>()->getHasPushSequences();
56 }
57 
58 bool M68kFrameLowering::canSimplifyCallFramePseudos(
59     const MachineFunction &MF) const {
60   return hasReservedCallFrame(MF) ||
61          (hasFP(MF) && !TRI->hasStackRealignment(MF)) ||
62          TRI->hasBasePointer(MF);
63 }
64 
65 bool M68kFrameLowering::needsFrameIndexResolution(
66     const MachineFunction &MF) const {
67   return MF.getFrameInfo().hasStackObjects() ||
68          MF.getInfo<M68kMachineFunctionInfo>()->getHasPushSequences();
69 }
70 
71 // NOTE: this only has a subset of the full frame index logic. In
72 // particular, the FI < 0 and AfterFPPop logic is handled in
73 // M68kRegisterInfo::eliminateFrameIndex, but not here. Possibly
74 // (probably?) it should be moved into here.
75 StackOffset
76 M68kFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
77                                           Register &FrameReg) const {
78   const MachineFrameInfo &MFI = MF.getFrameInfo();
79 
80   // We can't calculate offset from frame pointer if the stack is realigned,
81   // so enforce usage of stack/base pointer.  The base pointer is used when we
82   // have dynamic allocas in addition to dynamic realignment.
83   if (TRI->hasBasePointer(MF))
84     FrameReg = TRI->getBaseRegister();
85   else if (TRI->hasStackRealignment(MF))
86     FrameReg = TRI->getStackRegister();
87   else
88     FrameReg = TRI->getFrameRegister(MF);
89 
90   // Offset will hold the offset from the stack pointer at function entry to the
91   // object.
92   // We need to factor in additional offsets applied during the prologue to the
93   // frame, base, and stack pointer depending on which is used.
94   int Offset = MFI.getObjectOffset(FI) - getOffsetOfLocalArea();
95   const M68kMachineFunctionInfo *MMFI = MF.getInfo<M68kMachineFunctionInfo>();
96   uint64_t StackSize = MFI.getStackSize();
97   bool HasFP = hasFP(MF);
98 
99   // TODO: Support tail calls
100   if (TRI->hasBasePointer(MF)) {
101     assert(HasFP && "VLAs and dynamic stack realign, but no FP?!");
102     if (FI < 0) {
103       // Skip the saved FP.
104       return StackOffset::getFixed(Offset + SlotSize);
105     }
106 
107     assert((-(Offset + StackSize)) % MFI.getObjectAlign(FI).value() == 0);
108     return StackOffset::getFixed(Offset + StackSize);
109   }
110   if (TRI->hasStackRealignment(MF)) {
111     if (FI < 0) {
112       // Skip the saved FP.
113       return StackOffset::getFixed(Offset + SlotSize);
114     }
115 
116     assert((-(Offset + StackSize)) % MFI.getObjectAlign(FI).value() == 0);
117     return StackOffset::getFixed(Offset + StackSize);
118   }
119 
120   if (!HasFP)
121     return StackOffset::getFixed(Offset + StackSize);
122 
123   // Skip the saved FP.
124   Offset += SlotSize;
125 
126   // Skip the RETADDR move area
127   int TailCallReturnAddrDelta = MMFI->getTCReturnAddrDelta();
128   if (TailCallReturnAddrDelta < 0)
129     Offset -= TailCallReturnAddrDelta;
130 
131   return StackOffset::getFixed(Offset);
132 }
133 
134 /// Return a caller-saved register that isn't live
135 /// when it reaches the "return" instruction. We can then pop a stack object
136 /// to this register without worry about clobbering it.
137 static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
138                                        MachineBasicBlock::iterator &MBBI,
139                                        const M68kRegisterInfo *TRI) {
140   const MachineFunction *MF = MBB.getParent();
141   if (MF->callsEHReturn())
142     return 0;
143 
144   const TargetRegisterClass &AvailableRegs = *TRI->getRegsForTailCall(*MF);
145 
146   if (MBBI == MBB.end())
147     return 0;
148 
149   switch (MBBI->getOpcode()) {
150   default:
151     return 0;
152   case TargetOpcode::PATCHABLE_RET:
153   case M68k::RET: {
154     SmallSet<uint16_t, 8> Uses;
155 
156     for (unsigned i = 0, e = MBBI->getNumOperands(); i != e; ++i) {
157       MachineOperand &MO = MBBI->getOperand(i);
158       if (!MO.isReg() || MO.isDef())
159         continue;
160       Register Reg = MO.getReg();
161       if (!Reg)
162         continue;
163       for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
164         Uses.insert(*AI);
165     }
166 
167     for (auto CS : AvailableRegs)
168       if (!Uses.count(CS))
169         return CS;
170   }
171   }
172 
173   return 0;
174 }
175 
176 static bool isRegLiveIn(MachineBasicBlock &MBB, unsigned Reg) {
177   return llvm::any_of(MBB.liveins(),
178                       [Reg](MachineBasicBlock::RegisterMaskPair RegMask) {
179                         return RegMask.PhysReg == Reg;
180                       });
181 }
182 
183 uint64_t
184 M68kFrameLowering::calculateMaxStackAlign(const MachineFunction &MF) const {
185   const MachineFrameInfo &MFI = MF.getFrameInfo();
186   uint64_t MaxAlign = MFI.getMaxAlign().value(); // Desired stack alignment.
187   unsigned StackAlign = getStackAlignment();     // ABI alignment
188   if (MF.getFunction().hasFnAttribute("stackrealign")) {
189     if (MFI.hasCalls())
190       MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
191     else if (MaxAlign < SlotSize)
192       MaxAlign = SlotSize;
193   }
194   return MaxAlign;
195 }
196 
197 void M68kFrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
198                                            MachineBasicBlock::iterator MBBI,
199                                            const DebugLoc &DL, unsigned Reg,
200                                            uint64_t MaxAlign) const {
201   uint64_t Val = -MaxAlign;
202   unsigned AndOp = M68k::AND32di;
203   unsigned MovOp = M68k::MOV32rr;
204 
205   // This function is normally used with SP which is Address Register, but AND,
206   // or any other logical instructions in M68k do not support ARs so we need
207   // to use a temp Data Register to perform the op.
208   unsigned Tmp = M68k::D0;
209 
210   BuildMI(MBB, MBBI, DL, TII.get(MovOp), Tmp)
211       .addReg(Reg)
212       .setMIFlag(MachineInstr::FrameSetup);
213 
214   MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(AndOp), Tmp)
215                          .addReg(Tmp)
216                          .addImm(Val)
217                          .setMIFlag(MachineInstr::FrameSetup);
218 
219   // The CCR implicit def is dead.
220   MI->getOperand(3).setIsDead();
221 
222   BuildMI(MBB, MBBI, DL, TII.get(MovOp), Reg)
223       .addReg(Tmp)
224       .setMIFlag(MachineInstr::FrameSetup);
225 }
226 
227 MachineBasicBlock::iterator M68kFrameLowering::eliminateCallFramePseudoInstr(
228     MachineFunction &MF, MachineBasicBlock &MBB,
229     MachineBasicBlock::iterator I) const {
230   bool ReserveCallFrame = hasReservedCallFrame(MF);
231   unsigned Opcode = I->getOpcode();
232   bool IsDestroy = Opcode == TII.getCallFrameDestroyOpcode();
233   DebugLoc DL = I->getDebugLoc();
234   uint64_t Amount = !ReserveCallFrame ? I->getOperand(0).getImm() : 0;
235   uint64_t InternalAmt = (IsDestroy && Amount) ? I->getOperand(1).getImm() : 0;
236   I = MBB.erase(I);
237 
238   if (!ReserveCallFrame) {
239     // If the stack pointer can be changed after prologue, turn the
240     // adjcallstackup instruction into a 'sub %SP, <amt>' and the
241     // adjcallstackdown instruction into 'add %SP, <amt>'
242 
243     // We need to keep the stack aligned properly.  To do this, we round the
244     // amount of space needed for the outgoing arguments up to the next
245     // alignment boundary.
246     unsigned StackAlign = getStackAlignment();
247     Amount = alignTo(Amount, StackAlign);
248 
249     MachineModuleInfo &MMI = MF.getMMI();
250     const auto &Fn = MF.getFunction();
251     bool DwarfCFI = MMI.hasDebugInfo() || Fn.needsUnwindTableEntry();
252 
253     // If we have any exception handlers in this function, and we adjust
254     // the SP before calls, we may need to indicate this to the unwinder
255     // using GNU_ARGS_SIZE. Note that this may be necessary even when
256     // Amount == 0, because the preceding function may have set a non-0
257     // GNU_ARGS_SIZE.
258     // TODO: We don't need to reset this between subsequent functions,
259     // if it didn't change.
260     bool HasDwarfEHHandlers = !MF.getLandingPads().empty();
261 
262     if (HasDwarfEHHandlers && !IsDestroy &&
263         MF.getInfo<M68kMachineFunctionInfo>()->getHasPushSequences()) {
264       BuildCFI(MBB, I, DL,
265                MCCFIInstruction::createGnuArgsSize(nullptr, Amount));
266     }
267 
268     if (Amount == 0)
269       return I;
270 
271     // Factor out the amount that gets handled inside the sequence
272     // (Pushes of argument for frame setup, callee pops for frame destroy)
273     Amount -= InternalAmt;
274 
275     // TODO: This is needed only if we require precise CFA.
276     // If this is a callee-pop calling convention, emit a CFA adjust for
277     // the amount the callee popped.
278     if (IsDestroy && InternalAmt && DwarfCFI && !hasFP(MF))
279       BuildCFI(MBB, I, DL,
280                MCCFIInstruction::createAdjustCfaOffset(nullptr, -InternalAmt));
281 
282     // Add Amount to SP to destroy a frame, or subtract to setup.
283     int64_t StackAdjustment = IsDestroy ? Amount : -Amount;
284     int64_t CfaAdjustment = -StackAdjustment;
285 
286     if (StackAdjustment) {
287       // Merge with any previous or following adjustment instruction. Note: the
288       // instructions merged with here do not have CFI, so their stack
289       // adjustments do not feed into CfaAdjustment.
290       StackAdjustment += mergeSPUpdates(MBB, I, true);
291       StackAdjustment += mergeSPUpdates(MBB, I, false);
292 
293       if (StackAdjustment) {
294         BuildStackAdjustment(MBB, I, DL, StackAdjustment, false);
295       }
296     }
297 
298     if (DwarfCFI && !hasFP(MF)) {
299       // If we don't have FP, but need to generate unwind information,
300       // we need to set the correct CFA offset after the stack adjustment.
301       // How much we adjust the CFA offset depends on whether we're emitting
302       // CFI only for EH purposes or for debugging. EH only requires the CFA
303       // offset to be correct at each call site, while for debugging we want
304       // it to be more precise.
305 
306       // TODO: When not using precise CFA, we also need to adjust for the
307       // InternalAmt here.
308       if (CfaAdjustment) {
309         BuildCFI(
310             MBB, I, DL,
311             MCCFIInstruction::createAdjustCfaOffset(nullptr, CfaAdjustment));
312       }
313     }
314 
315     return I;
316   }
317 
318   if (IsDestroy && InternalAmt) {
319     // If we are performing frame pointer elimination and if the callee pops
320     // something off the stack pointer, add it back.  We do this until we have
321     // more advanced stack pointer tracking ability.
322     // We are not tracking the stack pointer adjustment by the callee, so make
323     // sure we restore the stack pointer immediately after the call, there may
324     // be spill code inserted between the CALL and ADJCALLSTACKUP instructions.
325     MachineBasicBlock::iterator CI = I;
326     MachineBasicBlock::iterator B = MBB.begin();
327     while (CI != B && !std::prev(CI)->isCall())
328       --CI;
329     BuildStackAdjustment(MBB, CI, DL, -InternalAmt, /*InEpilogue=*/false);
330   }
331 
332   return I;
333 }
334 
335 /// Emit a series of instructions to increment / decrement the stack pointer by
336 /// a constant value.
337 void M68kFrameLowering::emitSPUpdate(MachineBasicBlock &MBB,
338                                      MachineBasicBlock::iterator &MBBI,
339                                      int64_t NumBytes, bool InEpilogue) const {
340   bool IsSub = NumBytes < 0;
341   uint64_t Offset = IsSub ? -NumBytes : NumBytes;
342 
343   uint64_t Chunk = (1LL << 31) - 1;
344   DebugLoc DL = MBB.findDebugLoc(MBBI);
345 
346   while (Offset) {
347     if (Offset > Chunk) {
348       // Rather than emit a long series of instructions for large offsets,
349       // load the offset into a register and do one sub/add
350       Register Reg;
351 
352       if (IsSub && !isRegLiveIn(MBB, M68k::D0))
353         Reg = M68k::D0;
354       else
355         Reg = findDeadCallerSavedReg(MBB, MBBI, TRI);
356 
357       if (Reg) {
358         unsigned Opc = M68k::MOV32ri;
359         BuildMI(MBB, MBBI, DL, TII.get(Opc), Reg).addImm(Offset);
360         Opc = IsSub ? M68k::SUB32ar : M68k::ADD32ar;
361         MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
362                                .addReg(StackPtr)
363                                .addReg(Reg);
364         // ??? still no CCR
365         MI->getOperand(3).setIsDead(); // The CCR implicit def is dead.
366         Offset = 0;
367         continue;
368       }
369     }
370 
371     uint64_t ThisVal = std::min(Offset, Chunk);
372 
373     MachineInstrBuilder MI = BuildStackAdjustment(
374         MBB, MBBI, DL, IsSub ? -ThisVal : ThisVal, InEpilogue);
375     if (IsSub)
376       MI.setMIFlag(MachineInstr::FrameSetup);
377     else
378       MI.setMIFlag(MachineInstr::FrameDestroy);
379 
380     Offset -= ThisVal;
381   }
382 }
383 
384 int M68kFrameLowering::mergeSPUpdates(MachineBasicBlock &MBB,
385                                       MachineBasicBlock::iterator &MBBI,
386                                       bool MergeWithPrevious) const {
387   if ((MergeWithPrevious && MBBI == MBB.begin()) ||
388       (!MergeWithPrevious && MBBI == MBB.end()))
389     return 0;
390 
391   MachineBasicBlock::iterator PI = MergeWithPrevious ? std::prev(MBBI) : MBBI;
392   MachineBasicBlock::iterator NI =
393       MergeWithPrevious ? nullptr : std::next(MBBI);
394   unsigned Opc = PI->getOpcode();
395   int Offset = 0;
396 
397   if (!MergeWithPrevious && NI != MBB.end() &&
398       NI->getOpcode() == TargetOpcode::CFI_INSTRUCTION) {
399     // Don't merge with the next instruction if it has CFI.
400     return Offset;
401   }
402 
403   if (Opc == M68k::ADD32ai && PI->getOperand(0).getReg() == StackPtr) {
404     assert(PI->getOperand(1).getReg() == StackPtr);
405     Offset += PI->getOperand(2).getImm();
406     MBB.erase(PI);
407     if (!MergeWithPrevious)
408       MBBI = NI;
409   } else if (Opc == M68k::SUB32ai && PI->getOperand(0).getReg() == StackPtr) {
410     assert(PI->getOperand(1).getReg() == StackPtr);
411     Offset -= PI->getOperand(2).getImm();
412     MBB.erase(PI);
413     if (!MergeWithPrevious)
414       MBBI = NI;
415   }
416 
417   return Offset;
418 }
419 
420 MachineInstrBuilder M68kFrameLowering::BuildStackAdjustment(
421     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
422     const DebugLoc &DL, int64_t Offset, bool InEpilogue) const {
423   assert(Offset != 0 && "zero offset stack adjustment requested");
424 
425   // TODO can `lea` be used to adjust stack?
426 
427   bool IsSub = Offset < 0;
428   uint64_t AbsOffset = IsSub ? -Offset : Offset;
429   unsigned Opc = IsSub ? M68k::SUB32ai : M68k::ADD32ai;
430 
431   MachineInstrBuilder MI = BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
432                                .addReg(StackPtr)
433                                .addImm(AbsOffset);
434   // FIXME Update CCR as well. For now we just
435   // conservatively say CCR implicit def is dead
436   MI->getOperand(3).setIsDead();
437   return MI;
438 }
439 
440 void M68kFrameLowering::BuildCFI(MachineBasicBlock &MBB,
441                                  MachineBasicBlock::iterator MBBI,
442                                  const DebugLoc &DL,
443                                  const MCCFIInstruction &CFIInst) const {
444   MachineFunction &MF = *MBB.getParent();
445   unsigned CFIIndex = MF.addFrameInst(CFIInst);
446   BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
447       .addCFIIndex(CFIIndex);
448 }
449 
450 void M68kFrameLowering::emitPrologueCalleeSavedFrameMoves(
451     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
452     const DebugLoc &DL) const {
453   MachineFunction &MF = *MBB.getParent();
454   MachineFrameInfo &MFI = MF.getFrameInfo();
455   MachineModuleInfo &MMI = MF.getMMI();
456   const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
457 
458   // Add callee saved registers to move list.
459   const auto &CSI = MFI.getCalleeSavedInfo();
460   if (CSI.empty())
461     return;
462 
463   // Calculate offsets.
464   for (const auto &I : CSI) {
465     int64_t Offset = MFI.getObjectOffset(I.getFrameIdx());
466     Register Reg = I.getReg();
467 
468     unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
469     BuildCFI(MBB, MBBI, DL,
470              MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset));
471   }
472 }
473 
474 void M68kFrameLowering::emitPrologue(MachineFunction &MF,
475                                      MachineBasicBlock &MBB) const {
476   assert(&STI == &MF.getSubtarget<M68kSubtarget>() &&
477          "MF used frame lowering for wrong subtarget");
478 
479   MachineBasicBlock::iterator MBBI = MBB.begin();
480   MachineFrameInfo &MFI = MF.getFrameInfo();
481   const auto &Fn = MF.getFunction();
482   MachineModuleInfo &MMI = MF.getMMI();
483   M68kMachineFunctionInfo *MMFI = MF.getInfo<M68kMachineFunctionInfo>();
484   uint64_t MaxAlign = calculateMaxStackAlign(MF); // Desired stack alignment.
485   uint64_t StackSize = MFI.getStackSize(); // Number of bytes to allocate.
486   bool HasFP = hasFP(MF);
487   bool NeedsDwarfCFI = MMI.hasDebugInfo() || Fn.needsUnwindTableEntry();
488   Register FramePtr = TRI->getFrameRegister(MF);
489   const unsigned MachineFramePtr = FramePtr;
490   unsigned BasePtr = TRI->getBaseRegister();
491 
492   // Debug location must be unknown since the first debug location is used
493   // to determine the end of the prologue.
494   DebugLoc DL;
495 
496   // Add RETADDR move area to callee saved frame size.
497   int TailCallReturnAddrDelta = MMFI->getTCReturnAddrDelta();
498 
499   if (TailCallReturnAddrDelta < 0) {
500     MMFI->setCalleeSavedFrameSize(MMFI->getCalleeSavedFrameSize() -
501                                   TailCallReturnAddrDelta);
502   }
503 
504   // Insert stack pointer adjustment for later moving of return addr.  Only
505   // applies to tail call optimized functions where the callee argument stack
506   // size is bigger than the callers.
507   if (TailCallReturnAddrDelta < 0) {
508     BuildStackAdjustment(MBB, MBBI, DL, TailCallReturnAddrDelta,
509                          /*InEpilogue=*/false)
510         .setMIFlag(MachineInstr::FrameSetup);
511   }
512 
513   // Mapping for machine moves:
514   //
515   //   DST: VirtualFP AND
516   //        SRC: VirtualFP              => DW_CFA_def_cfa_offset
517   //        ELSE                        => DW_CFA_def_cfa
518   //
519   //   SRC: VirtualFP AND
520   //        DST: Register               => DW_CFA_def_cfa_register
521   //
522   //   ELSE
523   //        OFFSET < 0                  => DW_CFA_offset_extended_sf
524   //        REG < 64                    => DW_CFA_offset + Reg
525   //        ELSE                        => DW_CFA_offset_extended
526 
527   uint64_t NumBytes = 0;
528   int stackGrowth = -SlotSize;
529 
530   if (HasFP) {
531     // Calculate required stack adjustment.
532     uint64_t FrameSize = StackSize - SlotSize;
533     // If required, include space for extra hidden slot for stashing base
534     // pointer.
535     if (MMFI->getRestoreBasePointer())
536       FrameSize += SlotSize;
537 
538     NumBytes = FrameSize - MMFI->getCalleeSavedFrameSize();
539 
540     // Callee-saved registers are pushed on stack before the stack is realigned.
541     if (TRI->hasStackRealignment(MF))
542       NumBytes = alignTo(NumBytes, MaxAlign);
543 
544     // Get the offset of the stack slot for the FP register, which is
545     // guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
546     // Update the frame offset adjustment.
547     MFI.setOffsetAdjustment(-NumBytes);
548 
549     // Save FP into the appropriate stack slot.
550     BuildMI(MBB, MBBI, DL, TII.get(M68k::PUSH32r))
551         .addReg(MachineFramePtr, RegState::Kill)
552         .setMIFlag(MachineInstr::FrameSetup);
553 
554     if (NeedsDwarfCFI) {
555       // Mark the place where FP was saved.
556       // Define the current CFA rule to use the provided offset.
557       assert(StackSize);
558       BuildCFI(MBB, MBBI, DL,
559                MCCFIInstruction::cfiDefCfaOffset(nullptr, 2 * stackGrowth));
560 
561       // Change the rule for the FramePtr to be an "offset" rule.
562       int DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true);
563       assert(DwarfFramePtr > 0);
564       BuildCFI(MBB, MBBI, DL,
565                MCCFIInstruction::createOffset(nullptr, DwarfFramePtr,
566                                               2 * stackGrowth));
567     }
568 
569     // Update FP with the new base value.
570     BuildMI(MBB, MBBI, DL, TII.get(M68k::MOV32aa), FramePtr)
571         .addReg(StackPtr)
572         .setMIFlag(MachineInstr::FrameSetup);
573 
574     if (NeedsDwarfCFI) {
575       // Mark effective beginning of when frame pointer becomes valid.
576       // Define the current CFA to use the FP register.
577       unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true);
578       BuildCFI(MBB, MBBI, DL,
579                MCCFIInstruction::createDefCfaRegister(nullptr, DwarfFramePtr));
580     }
581 
582     // Mark the FramePtr as live-in in every block. Don't do this again for
583     // funclet prologues.
584     for (MachineBasicBlock &EveryMBB : MF)
585       EveryMBB.addLiveIn(MachineFramePtr);
586   } else {
587     NumBytes = StackSize - MMFI->getCalleeSavedFrameSize();
588   }
589 
590   // Skip the callee-saved push instructions.
591   bool PushedRegs = false;
592   int StackOffset = 2 * stackGrowth;
593 
594   while (MBBI != MBB.end() && MBBI->getFlag(MachineInstr::FrameSetup) &&
595          MBBI->getOpcode() == M68k::PUSH32r) {
596     PushedRegs = true;
597     ++MBBI;
598 
599     if (!HasFP && NeedsDwarfCFI) {
600       // Mark callee-saved push instruction.
601       // Define the current CFA rule to use the provided offset.
602       assert(StackSize);
603       BuildCFI(MBB, MBBI, DL,
604                MCCFIInstruction::cfiDefCfaOffset(nullptr, StackOffset));
605       StackOffset += stackGrowth;
606     }
607   }
608 
609   // Realign stack after we pushed callee-saved registers (so that we'll be
610   // able to calculate their offsets from the frame pointer).
611   if (TRI->hasStackRealignment(MF)) {
612     assert(HasFP && "There should be a frame pointer if stack is realigned.");
613     BuildStackAlignAND(MBB, MBBI, DL, StackPtr, MaxAlign);
614   }
615 
616   // If there is an SUB32ri of SP immediately before this instruction, merge
617   // the two. This can be the case when tail call elimination is enabled and
618   // the callee has more arguments then the caller.
619   NumBytes -= mergeSPUpdates(MBB, MBBI, true);
620 
621   // Adjust stack pointer: ESP -= numbytes.
622   emitSPUpdate(MBB, MBBI, -(int64_t)NumBytes, /*InEpilogue=*/false);
623 
624   unsigned SPOrEstablisher = StackPtr;
625 
626   // If we need a base pointer, set it up here. It's whatever the value
627   // of the stack pointer is at this point. Any variable size objects
628   // will be allocated after this, so we can still use the base pointer
629   // to reference locals.
630   if (TRI->hasBasePointer(MF)) {
631     // Update the base pointer with the current stack pointer.
632     BuildMI(MBB, MBBI, DL, TII.get(M68k::MOV32aa), BasePtr)
633         .addReg(SPOrEstablisher)
634         .setMIFlag(MachineInstr::FrameSetup);
635     if (MMFI->getRestoreBasePointer()) {
636       // Stash value of base pointer.  Saving SP instead of FP shortens
637       // dependence chain. Used by SjLj EH.
638       unsigned Opm = M68k::MOV32ja;
639       M68k::addRegIndirectWithDisp(BuildMI(MBB, MBBI, DL, TII.get(Opm)),
640                                    FramePtr, true,
641                                    MMFI->getRestoreBasePointerOffset())
642           .addReg(SPOrEstablisher)
643           .setMIFlag(MachineInstr::FrameSetup);
644     }
645   }
646 
647   if (((!HasFP && NumBytes) || PushedRegs) && NeedsDwarfCFI) {
648     // Mark end of stack pointer adjustment.
649     if (!HasFP && NumBytes) {
650       // Define the current CFA rule to use the provided offset.
651       assert(StackSize);
652       BuildCFI(
653           MBB, MBBI, DL,
654           MCCFIInstruction::cfiDefCfaOffset(nullptr, -StackSize + stackGrowth));
655     }
656 
657     // Emit DWARF info specifying the offsets of the callee-saved registers.
658     if (PushedRegs)
659       emitPrologueCalleeSavedFrameMoves(MBB, MBBI, DL);
660   }
661 
662   // TODO Interrupt handlers
663   // M68k Interrupt handling function cannot assume anything about the
664   // direction flag (DF in CCR register). Clear this flag by creating "cld"
665   // instruction in each prologue of interrupt handler function. The "cld"
666   // instruction should only in these cases:
667   // 1. The interrupt handling function uses any of the "rep" instructions.
668   // 2. Interrupt handling function calls another function.
669 }
670 
671 static bool isTailCallOpcode(unsigned Opc) {
672   return Opc == M68k::TCRETURNj || Opc == M68k::TCRETURNq;
673 }
674 
675 void M68kFrameLowering::emitEpilogue(MachineFunction &MF,
676                                      MachineBasicBlock &MBB) const {
677   const MachineFrameInfo &MFI = MF.getFrameInfo();
678   M68kMachineFunctionInfo *MMFI = MF.getInfo<M68kMachineFunctionInfo>();
679   MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
680   Optional<unsigned> RetOpcode;
681   if (MBBI != MBB.end())
682     RetOpcode = MBBI->getOpcode();
683   DebugLoc DL;
684   if (MBBI != MBB.end())
685     DL = MBBI->getDebugLoc();
686   Register FramePtr = TRI->getFrameRegister(MF);
687   unsigned MachineFramePtr = FramePtr;
688 
689   // Get the number of bytes to allocate from the FrameInfo.
690   uint64_t StackSize = MFI.getStackSize();
691   uint64_t MaxAlign = calculateMaxStackAlign(MF);
692   unsigned CSSize = MMFI->getCalleeSavedFrameSize();
693   uint64_t NumBytes = 0;
694 
695   if (hasFP(MF)) {
696     // Calculate required stack adjustment.
697     uint64_t FrameSize = StackSize - SlotSize;
698     NumBytes = FrameSize - CSSize;
699 
700     // Callee-saved registers were pushed on stack before the stack was
701     // realigned.
702     if (TRI->hasStackRealignment(MF))
703       NumBytes = alignTo(FrameSize, MaxAlign);
704 
705     // Pop FP.
706     BuildMI(MBB, MBBI, DL, TII.get(M68k::POP32r), MachineFramePtr)
707         .setMIFlag(MachineInstr::FrameDestroy);
708   } else {
709     NumBytes = StackSize - CSSize;
710   }
711 
712   // Skip the callee-saved pop instructions.
713   while (MBBI != MBB.begin()) {
714     MachineBasicBlock::iterator PI = std::prev(MBBI);
715     unsigned Opc = PI->getOpcode();
716 
717     if ((Opc != M68k::POP32r || !PI->getFlag(MachineInstr::FrameDestroy)) &&
718         Opc != M68k::DBG_VALUE && !PI->isTerminator())
719       break;
720 
721     --MBBI;
722   }
723   MachineBasicBlock::iterator FirstCSPop = MBBI;
724 
725   if (MBBI != MBB.end())
726     DL = MBBI->getDebugLoc();
727 
728   // If there is an ADD32ri or SUB32ri of SP immediately before this
729   // instruction, merge the two instructions.
730   if (NumBytes || MFI.hasVarSizedObjects())
731     NumBytes += mergeSPUpdates(MBB, MBBI, true);
732 
733   // If dynamic alloca is used, then reset SP to point to the last callee-saved
734   // slot before popping them off! Same applies for the case, when stack was
735   // realigned. Don't do this if this was a funclet epilogue, since the funclets
736   // will not do realignment or dynamic stack allocation.
737   if ((TRI->hasStackRealignment(MF) || MFI.hasVarSizedObjects())) {
738     if (TRI->hasStackRealignment(MF))
739       MBBI = FirstCSPop;
740     uint64_t LEAAmount = -CSSize;
741 
742     // 'move %FramePtr, SP' will not be recognized as an epilogue sequence.
743     // However, we may use this sequence if we have a frame pointer because the
744     // effects of the prologue can safely be undone.
745     if (LEAAmount != 0) {
746       unsigned Opc = M68k::LEA32p;
747       M68k::addRegIndirectWithDisp(
748           BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr), FramePtr, false,
749           LEAAmount);
750       --MBBI;
751     } else {
752       unsigned Opc = (M68k::MOV32rr);
753       BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr).addReg(FramePtr);
754       --MBBI;
755     }
756   } else if (NumBytes) {
757     // Adjust stack pointer back: SP += numbytes.
758     emitSPUpdate(MBB, MBBI, NumBytes, /*InEpilogue=*/true);
759     --MBBI;
760   }
761 
762   if (!RetOpcode || !isTailCallOpcode(*RetOpcode)) {
763     // Add the return addr area delta back since we are not tail calling.
764     int Offset = -1 * MMFI->getTCReturnAddrDelta();
765     assert(Offset >= 0 && "TCDelta should never be positive");
766     if (Offset) {
767       MBBI = MBB.getFirstTerminator();
768 
769       // Check for possible merge with preceding ADD instruction.
770       Offset += mergeSPUpdates(MBB, MBBI, true);
771       emitSPUpdate(MBB, MBBI, Offset, /*InEpilogue=*/true);
772     }
773   }
774 }
775 
776 void M68kFrameLowering::determineCalleeSaves(MachineFunction &MF,
777                                              BitVector &SavedRegs,
778                                              RegScavenger *RS) const {
779   TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS);
780 
781   MachineFrameInfo &MFI = MF.getFrameInfo();
782 
783   M68kMachineFunctionInfo *M68kFI = MF.getInfo<M68kMachineFunctionInfo>();
784   int64_t TailCallReturnAddrDelta = M68kFI->getTCReturnAddrDelta();
785 
786   if (TailCallReturnAddrDelta < 0) {
787     // create RETURNADDR area
788     //   arg
789     //   arg
790     //   RETADDR
791     //   { ...
792     //     RETADDR area
793     //     ...
794     //   }
795     //   [FP]
796     MFI.CreateFixedObject(-TailCallReturnAddrDelta,
797                           TailCallReturnAddrDelta - SlotSize, true);
798   }
799 
800   // Spill the BasePtr if it's used.
801   if (TRI->hasBasePointer(MF)) {
802     SavedRegs.set(TRI->getBaseRegister());
803   }
804 }
805 
806 bool M68kFrameLowering::assignCalleeSavedSpillSlots(
807     MachineFunction &MF, const TargetRegisterInfo *TRI,
808     std::vector<CalleeSavedInfo> &CSI) const {
809   MachineFrameInfo &MFI = MF.getFrameInfo();
810   M68kMachineFunctionInfo *M68kFI = MF.getInfo<M68kMachineFunctionInfo>();
811 
812   int SpillSlotOffset = getOffsetOfLocalArea() + M68kFI->getTCReturnAddrDelta();
813 
814   if (hasFP(MF)) {
815     // emitPrologue always spills frame register the first thing.
816     SpillSlotOffset -= SlotSize;
817     MFI.CreateFixedSpillStackObject(SlotSize, SpillSlotOffset);
818 
819     // Since emitPrologue and emitEpilogue will handle spilling and restoring of
820     // the frame register, we can delete it from CSI list and not have to worry
821     // about avoiding it later.
822     Register FPReg = TRI->getFrameRegister(MF);
823     for (unsigned i = 0, e = CSI.size(); i < e; ++i) {
824       if (TRI->regsOverlap(CSI[i].getReg(), FPReg)) {
825         CSI.erase(CSI.begin() + i);
826         break;
827       }
828     }
829   }
830 
831   // The rest is fine
832   return false;
833 }
834 
835 bool M68kFrameLowering::spillCalleeSavedRegisters(
836     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
837     ArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
838   auto &MRI = *static_cast<const M68kRegisterInfo *>(TRI);
839   auto DL = MBB.findDebugLoc(MI);
840 
841   int FI = 0;
842   unsigned Mask = 0;
843   for (const auto &Info : CSI) {
844     FI = std::max(FI, Info.getFrameIdx());
845     Register Reg = Info.getReg();
846     unsigned Shift = MRI.getSpillRegisterOrder(Reg);
847     Mask |= 1 << Shift;
848   }
849 
850   auto I =
851       M68k::addFrameReference(BuildMI(MBB, MI, DL, TII.get(M68k::MOVM32pm)), FI)
852           .addImm(Mask)
853           .setMIFlag(MachineInstr::FrameSetup);
854 
855   // Append implicit registers and mem locations
856   const MachineFunction &MF = *MBB.getParent();
857   const MachineRegisterInfo &RI = MF.getRegInfo();
858   for (const auto &Info : CSI) {
859     Register Reg = Info.getReg();
860     bool IsLiveIn = RI.isLiveIn(Reg);
861     if (!IsLiveIn)
862       MBB.addLiveIn(Reg);
863     I.addReg(Reg, IsLiveIn ? RegState::Implicit : RegState::ImplicitKill);
864     M68k::addMemOperand(I, Info.getFrameIdx(), 0);
865   }
866 
867   return true;
868 }
869 
870 bool M68kFrameLowering::restoreCalleeSavedRegisters(
871     MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
872     MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
873   auto &MRI = *static_cast<const M68kRegisterInfo *>(TRI);
874   auto DL = MBB.findDebugLoc(MI);
875 
876   int FI = 0;
877   unsigned Mask = 0;
878   for (const auto &Info : CSI) {
879     FI = std::max(FI, Info.getFrameIdx());
880     Register Reg = Info.getReg();
881     unsigned Shift = MRI.getSpillRegisterOrder(Reg);
882     Mask |= 1 << Shift;
883   }
884 
885   auto I = M68k::addFrameReference(
886                BuildMI(MBB, MI, DL, TII.get(M68k::MOVM32mp)).addImm(Mask), FI)
887                .setMIFlag(MachineInstr::FrameDestroy);
888 
889   // Append implicit registers and mem locations
890   for (const auto &Info : CSI) {
891     I.addReg(Info.getReg(), RegState::ImplicitDefine);
892     M68k::addMemOperand(I, Info.getFrameIdx(), 0);
893   }
894 
895   return true;
896 }
897