diff --git a/lib/Target/TriCore/TriCoreFrameLowering.cpp b/lib/Target/TriCore/TriCoreFrameLowering.cpp new file mode 100644 index 0000000000000000000000000000000000000000..24205934f6b3f87929726fc4c04f85b8e5910610 --- /dev/null +++ b/lib/Target/TriCore/TriCoreFrameLowering.cpp @@ -0,0 +1,74 @@ +//===-- TriCoreFrameLowering.cpp - Frame info for TriCore Target --------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains TriCore frame information that doesn't fit anywhere else +// cleanly... +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "target_tricore" + +#include "TriCoreFrameLowering.h" +#include "TriCoreInstrInfo.h" +#include "TriCoreMisc.h" +#include "TriCore.h" + +#include "llvm/Function.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/RegisterScavenging.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetInstrInfo.h" + +namespace llvm { + +// Inserts prologue code into the function. +void TriCoreFrameLowering::emitPrologue(MachineFunction &mf) const { + DebugLoc dl; + MachineBasicBlock &mbb = mf.front(); + MachineBasicBlock::iterator it = mbb.begin(); + uint64_t stackSize = mf.getFrameInfo()->getStackSize(); + const TargetFrameLowering *tfi = mf.getTarget().getFrameLowering(); + const TargetInstrInfo *tii = mf.getTarget().getInstrInfo(); + + DEBUG(errs() << "TriCoreFrameLowering::emitPrologue(): mf = " << mf.getFunction()->getName() << "\n"); + + if (it != mbb.end()) + dl = it->getDebugLoc(); + + // Set frame pointer if one is used; adjust stack pointer + if (tfi->hasFP(mf)) { + BuildMI(mbb, it, dl, tii->get(TriCore::MOV_AAsrr), FRAME_POINTER) + .addReg(STACK_POINTER); + } + adjustStackPointer(mf, mbb, it, -stackSize); +} + + +// Inserts epilogue code into the function. +void TriCoreFrameLowering::emitEpilogue(MachineFunction &mf, + MachineBasicBlock &mbb) const { + // Nothing to do - the ret instruction performs all cleanup automatically, + // including restoring stack pointer and frame pointer (being located in the + // upper context). +} + +// This method is called immediately before PrologEpilogInserter scans the +// physical registers used to determine what callee saved registers should be +// spilled. +void TriCoreFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &mf, RegScavenger *rs) const { + // FIXME: This always leads to the generation of an emergency spill slot in + // the stack frame, whether we actually need one or not. + const TargetRegisterClass *rc = TriCore::IRRegisterClass; + int fi = mf.getFrameInfo()->CreateStackObject(rc->getSize(), + rc->getAlignment(), false); + rs->setScavengingFrameIndex(fi); +} + +} diff --git a/lib/Target/TriCore/TriCoreMisc.cpp b/lib/Target/TriCore/TriCoreMisc.cpp index 242d297c6efe2830f0d4ebe9efbe145d9ec5b15a..abccb26aed0c1a251ebf6c6b076e44dcf786d98e 100644 --- a/lib/Target/TriCore/TriCoreMisc.cpp +++ b/lib/Target/TriCore/TriCoreMisc.cpp @@ -26,7 +26,7 @@ #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" -using namespace llvm; +namespace llvm { // Increments or decrements the stack pointer by the given number of bytes. void adjustStackPointer(MachineFunction &mf, @@ -57,3 +57,5 @@ void adjustStackPointer(MachineFunction &mf, } } } + +}