2012-02-18 20:03:15 +08:00
|
|
|
//===-- PPCFrameLowering.h - Define frame lowering for PowerPC --*- C++ -*-===//
|
2005-04-22 07:30:14 +08:00
|
|
|
//
|
2004-08-15 06:16:36 +08:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-30 04:36:04 +08:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-22 07:30:14 +08:00
|
|
|
//
|
2004-08-15 06:16:36 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
//
|
2005-10-16 13:39:50 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2004-08-15 06:16:36 +08:00
|
|
|
|
2014-08-14 00:26:38 +08:00
|
|
|
#ifndef LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H
|
|
|
|
#define LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H
|
2004-08-15 06:16:36 +08:00
|
|
|
|
2005-10-15 07:51:18 +08:00
|
|
|
#include "PPC.h"
|
2012-12-04 15:12:27 +08:00
|
|
|
#include "llvm/ADT/STLExtras.h"
|
2011-01-10 20:39:04 +08:00
|
|
|
#include "llvm/Target/TargetFrameLowering.h"
|
2004-08-15 06:16:36 +08:00
|
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
|
|
|
|
namespace llvm {
|
2014-06-13 04:54:11 +08:00
|
|
|
class PPCSubtarget;
|
2004-08-15 06:16:36 +08:00
|
|
|
|
2011-01-10 20:39:04 +08:00
|
|
|
class PPCFrameLowering: public TargetFrameLowering {
|
2010-11-15 08:06:54 +08:00
|
|
|
const PPCSubtarget &Subtarget;
|
2015-02-13 08:39:27 +08:00
|
|
|
const unsigned ReturnSaveOffset;
|
2015-02-13 08:39:36 +08:00
|
|
|
const unsigned TOCSaveOffset;
|
2015-02-13 08:39:38 +08:00
|
|
|
const unsigned FramePointerSaveOffset;
|
2015-02-14 06:22:57 +08:00
|
|
|
const unsigned LinkageSize;
|
2015-02-14 06:48:53 +08:00
|
|
|
const unsigned BasePointerSaveOffset;
|
2005-04-22 07:30:14 +08:00
|
|
|
|
2004-08-15 06:16:36 +08:00
|
|
|
public:
|
2014-06-13 04:54:11 +08:00
|
|
|
PPCFrameLowering(const PPCSubtarget &STI);
|
2004-08-15 06:16:36 +08:00
|
|
|
|
2013-03-15 13:06:04 +08:00
|
|
|
unsigned determineFrameLayout(MachineFunction &MF,
|
|
|
|
bool UpdateMF = true,
|
|
|
|
bool UseEstimate = false) const;
|
2010-11-15 08:06:54 +08:00
|
|
|
|
|
|
|
/// emitProlog/emitEpilog - These methods insert prolog and epilog code into
|
|
|
|
/// the function.
|
2014-04-29 15:57:37 +08:00
|
|
|
void emitPrologue(MachineFunction &MF) const override;
|
|
|
|
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
2010-11-15 08:06:54 +08:00
|
|
|
|
2014-04-29 15:57:37 +08:00
|
|
|
bool hasFP(const MachineFunction &MF) const override;
|
2010-12-19 03:53:14 +08:00
|
|
|
bool needsFP(const MachineFunction &MF) const;
|
2013-03-22 03:03:19 +08:00
|
|
|
void replaceFPWithRealFP(MachineFunction &MF) const;
|
2010-11-19 05:19:35 +08:00
|
|
|
|
2010-11-28 07:05:25 +08:00
|
|
|
void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
2014-04-29 15:57:37 +08:00
|
|
|
RegScavenger *RS = nullptr) const override;
|
2013-03-15 04:33:40 +08:00
|
|
|
void processFunctionBeforeFrameFinalized(MachineFunction &MF,
|
2014-04-29 15:57:37 +08:00
|
|
|
RegScavenger *RS = nullptr) const override;
|
2013-03-15 13:06:04 +08:00
|
|
|
void addScavengingSpillSlot(MachineFunction &MF, RegScavenger *RS) const;
|
2010-11-28 07:05:25 +08:00
|
|
|
|
2012-09-12 22:47:47 +08:00
|
|
|
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|
|
|
MachineBasicBlock::iterator MI,
|
|
|
|
const std::vector<CalleeSavedInfo> &CSI,
|
2014-04-29 15:57:37 +08:00
|
|
|
const TargetRegisterInfo *TRI) const override;
|
2012-09-12 22:47:47 +08:00
|
|
|
|
2013-02-22 04:05:00 +08:00
|
|
|
void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
2014-04-29 15:57:37 +08:00
|
|
|
MachineBasicBlock &MBB,
|
|
|
|
MachineBasicBlock::iterator I) const override;
|
2013-02-22 04:05:00 +08:00
|
|
|
|
2012-09-12 22:47:47 +08:00
|
|
|
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
2014-04-29 15:57:37 +08:00
|
|
|
MachineBasicBlock::iterator MI,
|
|
|
|
const std::vector<CalleeSavedInfo> &CSI,
|
|
|
|
const TargetRegisterInfo *TRI) const override;
|
2012-09-12 22:47:47 +08:00
|
|
|
|
2010-11-15 08:06:54 +08:00
|
|
|
/// targetHandlesStackFrameRounding - Returns true if the target is
|
|
|
|
/// responsible for rounding up the stack frame (probably at emitPrologue
|
|
|
|
/// time).
|
2014-04-29 15:57:37 +08:00
|
|
|
bool targetHandlesStackFrameRounding() const override { return true; }
|
2010-11-15 08:06:54 +08:00
|
|
|
|
2006-12-07 01:42:06 +08:00
|
|
|
/// getReturnSaveOffset - Return the previous frame offset to save the
|
|
|
|
/// return address.
|
2015-02-13 08:39:27 +08:00
|
|
|
unsigned getReturnSaveOffset() const { return ReturnSaveOffset; }
|
2006-12-07 01:42:06 +08:00
|
|
|
|
[PowerPC] Simplify and improve loading into TOC register
During an indirect function call sequence on the 64-bit SVR4 ABI,
generate code must load and then restore the TOC register.
This does not use a regular LOAD instruction since the TOC
register r2 is marked as reserved. Instead, the are two
special instruction patterns:
let RST = 2, DS = 2 in
def LDinto_toc: DSForm_1a<58, 0, (outs), (ins g8rc:$reg),
"ld 2, 8($reg)", IIC_LdStLD,
[(PPCload_toc i64:$reg)]>, isPPC64;
let RST = 2, DS = 10, RA = 1 in
def LDtoc_restore : DSForm_1a<58, 0, (outs), (ins),
"ld 2, 40(1)", IIC_LdStLD,
[(PPCtoc_restore)]>, isPPC64;
Note that these not only restrict the destination of the
load to r2, but they also restrict the *source* of the
load to particular address combinations. The latter is
a problem when we want to support the ELFv2 ABI, since
there the TOC save slot is no longer at 40(1).
This patch replaces those two instructions with a single
instruction pattern that only hard-codes r2 as destination,
but supports generic addresses as source. This will allow
supporting the ELFv2 ABI, and also helps generate more
efficient code for calls to absolute addresses (allowing
simplification of the ppc64-calls.ll test case).
llvm-svn: 211193
2014-06-19 01:52:49 +08:00
|
|
|
/// getTOCSaveOffset - Return the previous frame offset to save the
|
|
|
|
/// TOC register -- 64-bit SVR4 ABI only.
|
2015-02-13 08:39:36 +08:00
|
|
|
unsigned getTOCSaveOffset() const { return TOCSaveOffset; }
|
[PowerPC] Simplify and improve loading into TOC register
During an indirect function call sequence on the 64-bit SVR4 ABI,
generate code must load and then restore the TOC register.
This does not use a regular LOAD instruction since the TOC
register r2 is marked as reserved. Instead, the are two
special instruction patterns:
let RST = 2, DS = 2 in
def LDinto_toc: DSForm_1a<58, 0, (outs), (ins g8rc:$reg),
"ld 2, 8($reg)", IIC_LdStLD,
[(PPCload_toc i64:$reg)]>, isPPC64;
let RST = 2, DS = 10, RA = 1 in
def LDtoc_restore : DSForm_1a<58, 0, (outs), (ins),
"ld 2, 40(1)", IIC_LdStLD,
[(PPCtoc_restore)]>, isPPC64;
Note that these not only restrict the destination of the
load to r2, but they also restrict the *source* of the
load to particular address combinations. The latter is
a problem when we want to support the ELFv2 ABI, since
there the TOC save slot is no longer at 40(1).
This patch replaces those two instructions with a single
instruction pattern that only hard-codes r2 as destination,
but supports generic addresses as source. This will allow
supporting the ELFv2 ABI, and also helps generate more
efficient code for calls to absolute addresses (allowing
simplification of the ppc64-calls.ll test case).
llvm-svn: 211193
2014-06-19 01:52:49 +08:00
|
|
|
|
2006-11-17 06:43:37 +08:00
|
|
|
/// getFramePointerSaveOffset - Return the previous frame offset to save the
|
|
|
|
/// frame pointer.
|
2015-02-13 08:39:38 +08:00
|
|
|
unsigned getFramePointerSaveOffset() const { return FramePointerSaveOffset; }
|
2010-11-15 08:06:05 +08:00
|
|
|
|
2013-07-17 08:45:52 +08:00
|
|
|
/// getBasePointerSaveOffset - Return the previous frame offset to save the
|
|
|
|
/// base pointer.
|
2015-02-14 06:48:53 +08:00
|
|
|
unsigned getBasePointerSaveOffset() const { return BasePointerSaveOffset; }
|
2013-07-17 08:45:52 +08:00
|
|
|
|
2006-11-17 06:43:37 +08:00
|
|
|
/// getLinkageSize - Return the size of the PowerPC ABI linkage area.
|
|
|
|
///
|
2015-02-14 06:22:57 +08:00
|
|
|
unsigned getLinkageSize() const { return LinkageSize; }
|
2006-11-17 06:43:37 +08:00
|
|
|
|
2009-09-28 01:58:47 +08:00
|
|
|
const SpillSlot *
|
2014-06-13 04:54:11 +08:00
|
|
|
getCalleeSavedSpillSlots(unsigned &NumEntries) const override;
|
2004-08-15 06:16:36 +08:00
|
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
|
|
|
|
#endif
|