mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
Move per-function state out of TargetLowering subclasses and into
MachineFunctionInfo subclasses. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101634 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include "PIC16AsmPrinter.h"
|
||||
#include "PIC16Section.h"
|
||||
#include "PIC16MCAsmInfo.h"
|
||||
#include "PIC16MachineFunctionInfo.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Module.h"
|
||||
@@ -379,6 +380,8 @@ bool PIC16AsmPrinter::doFinalization(Module &M) {
|
||||
void PIC16AsmPrinter::EmitFunctionFrame(MachineFunction &MF) {
|
||||
const Function *F = MF.getFunction();
|
||||
const TargetData *TD = TM.getTargetData();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
|
||||
// Emit the data section name.
|
||||
|
||||
PIC16Section *fPDataSection =
|
||||
@@ -420,7 +423,7 @@ void PIC16AsmPrinter::EmitFunctionFrame(MachineFunction &MF) {
|
||||
Twine(" RES ") + Twine(ArgSize));
|
||||
|
||||
// Emit temporary space
|
||||
int TempSize = PTLI->GetTmpSize();
|
||||
int TempSize = FuncInfo->getTmpSize();
|
||||
if (TempSize > 0)
|
||||
OutStreamer.EmitRawText(PAN::getTempdataLabel(CurrentFnSym->getName()) +
|
||||
Twine(" RES ") + Twine(TempSize));
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include "PIC16ISelLowering.h"
|
||||
#include "PIC16TargetObjectFile.h"
|
||||
#include "PIC16TargetMachine.h"
|
||||
#include "PIC16MachineFunctionInfo.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/GlobalValue.h"
|
||||
#include "llvm/Function.h"
|
||||
@@ -144,7 +145,7 @@ static const char *getStdLibCallName(unsigned opcode) {
|
||||
|
||||
// PIC16TargetLowering Constructor.
|
||||
PIC16TargetLowering::PIC16TargetLowering(PIC16TargetMachine &TM)
|
||||
: TargetLowering(TM, new PIC16TargetObjectFile()), TmpSize(0) {
|
||||
: TargetLowering(TM, new PIC16TargetObjectFile()) {
|
||||
|
||||
Subtarget = &TM.getSubtarget<PIC16Subtarget>();
|
||||
|
||||
@@ -321,18 +322,29 @@ static SDValue getOutFlag(SDValue &Op) {
|
||||
return Flag;
|
||||
}
|
||||
// Get the TmpOffset for FrameIndex
|
||||
unsigned PIC16TargetLowering::GetTmpOffsetForFI(unsigned FI, unsigned size) {
|
||||
unsigned PIC16TargetLowering::GetTmpOffsetForFI(unsigned FI, unsigned size,
|
||||
MachineFunction &MF) {
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
std::map<unsigned, unsigned> &FiTmpOffsetMap = FuncInfo->getFiTmpOffsetMap();
|
||||
|
||||
std::map<unsigned, unsigned>::iterator
|
||||
MapIt = FiTmpOffsetMap.find(FI);
|
||||
if (MapIt != FiTmpOffsetMap.end())
|
||||
return MapIt->second;
|
||||
|
||||
// This FI (FrameIndex) is not yet mapped, so map it
|
||||
FiTmpOffsetMap[FI] = TmpSize;
|
||||
TmpSize += size;
|
||||
FiTmpOffsetMap[FI] = FuncInfo->getTmpSize();
|
||||
FuncInfo->setTmpSize(FuncInfo->getTmpSize() + size);
|
||||
return FiTmpOffsetMap[FI];
|
||||
}
|
||||
|
||||
void PIC16TargetLowering::ResetTmpOffsetMap(SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
FuncInfo->getFiTmpOffsetMap().clear();
|
||||
FuncInfo->setTmpSize(0);
|
||||
}
|
||||
|
||||
// To extract chain value from the SDValue Nodes
|
||||
// This function will help to maintain the chain extracting
|
||||
// code at one place. In case of any change in future it will
|
||||
@@ -725,6 +737,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const Function *Func = MF.getFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
const std::string Name = Func->getName();
|
||||
|
||||
FrameIndexSDNode *FR = dyn_cast<FrameIndexSDNode>(Op);
|
||||
@@ -736,7 +749,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
||||
// the list and add their requested size.
|
||||
unsigned FIndex = FR->getIndex();
|
||||
const char *tmpName;
|
||||
if (FIndex < ReservedFrameCount) {
|
||||
if (FIndex < FuncInfo->getReservedFrameCount()) {
|
||||
tmpName = ESNames::createESName(PAN::getFrameLabel(Name));
|
||||
ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8);
|
||||
Offset = 0;
|
||||
@@ -747,7 +760,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
||||
// FrameIndex has been made for some temporary storage
|
||||
tmpName = ESNames::createESName(PAN::getTempdataLabel(Name));
|
||||
ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8);
|
||||
Offset = GetTmpOffsetForFI(FIndex, MFI->getObjectSize(FIndex));
|
||||
Offset = GetTmpOffsetForFI(FIndex, MFI->getObjectSize(FIndex), MF);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -1085,14 +1098,14 @@ SDValue PIC16TargetLowering::ConvertToMemOperand(SDValue Op,
|
||||
DAG.getEntryNode(),
|
||||
Op, ES,
|
||||
DAG.getConstant (1, MVT::i8), // Banksel.
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1, MF),
|
||||
MVT::i8));
|
||||
|
||||
// Load the value from ES.
|
||||
SDVTList Tys = DAG.getVTList(MVT::i8, MVT::Other);
|
||||
SDValue Load = DAG.getNode(PIC16ISD::PIC16Load, dl, Tys, Store,
|
||||
ES, DAG.getConstant (1, MVT::i8),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1, MF),
|
||||
MVT::i8));
|
||||
|
||||
return Load.getValue(0);
|
||||
@@ -1647,15 +1660,19 @@ SDValue PIC16TargetLowering::LowerSUB(SDValue Op, SelectionDAG &DAG) {
|
||||
return Op;
|
||||
}
|
||||
|
||||
void PIC16TargetLowering::InitReservedFrameCount(const Function *F) {
|
||||
void PIC16TargetLowering::InitReservedFrameCount(const Function *F,
|
||||
SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
|
||||
unsigned NumArgs = F->arg_size();
|
||||
|
||||
bool isVoidFunc = (F->getReturnType()->getTypeID() == Type::VoidTyID);
|
||||
|
||||
if (isVoidFunc)
|
||||
ReservedFrameCount = NumArgs;
|
||||
FuncInfo->setReservedFrameCount(NumArgs);
|
||||
else
|
||||
ReservedFrameCount = NumArgs + 1;
|
||||
FuncInfo->setReservedFrameCount(NumArgs + 1);
|
||||
}
|
||||
|
||||
// LowerFormalArguments - Argument values are loaded from the
|
||||
@@ -1678,9 +1695,9 @@ PIC16TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
std::string FuncName = F->getName();
|
||||
|
||||
// Reset the map of FI and TmpOffset
|
||||
ResetTmpOffsetMap();
|
||||
ResetTmpOffsetMap(DAG);
|
||||
// Initialize the ReserveFrameCount
|
||||
InitReservedFrameCount(F);
|
||||
InitReservedFrameCount(F, DAG);
|
||||
|
||||
// Create the <fname>.args external symbol.
|
||||
const char *tmpName = ESNames::createESName(PAN::getArgsLabel(FuncName));
|
||||
|
@@ -168,13 +168,11 @@ namespace llvm {
|
||||
// This function returns the Tmp Offset for FrameIndex. If any TmpOffset
|
||||
// already exists for the FI then it returns the same else it creates the
|
||||
// new offset and returns.
|
||||
unsigned GetTmpOffsetForFI(unsigned FI, unsigned slot_size);
|
||||
void ResetTmpOffsetMap() { FiTmpOffsetMap.clear(); SetTmpSize(0); }
|
||||
void InitReservedFrameCount(const Function *F);
|
||||
|
||||
// Return the size of Tmp variable
|
||||
unsigned GetTmpSize() { return TmpSize; }
|
||||
void SetTmpSize(unsigned Size) { TmpSize = Size; }
|
||||
unsigned GetTmpOffsetForFI(unsigned FI, unsigned slot_size,
|
||||
MachineFunction &MF);
|
||||
void ResetTmpOffsetMap(SelectionDAG &DAG);
|
||||
void InitReservedFrameCount(const Function *F,
|
||||
SelectionDAG &DAG);
|
||||
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
virtual unsigned getFunctionAlignment(const Function *) const {
|
||||
@@ -247,17 +245,6 @@ namespace llvm {
|
||||
// Keep a pointer to SelectionDAGISel to access its public
|
||||
// interface (It is required during legalization)
|
||||
SelectionDAGISel *ISel;
|
||||
|
||||
private:
|
||||
// The frameindexes generated for spill/reload are stack based.
|
||||
// This maps maintain zero based indexes for these FIs.
|
||||
std::map<unsigned, unsigned> FiTmpOffsetMap;
|
||||
unsigned TmpSize;
|
||||
|
||||
// These are the frames for return value and argument passing
|
||||
// These FrameIndices will be expanded to foo.frame external symbol
|
||||
// and all others will be expanded to foo.tmp external symbol.
|
||||
unsigned ReservedFrameCount;
|
||||
};
|
||||
} // namespace llvm
|
||||
|
||||
|
@@ -86,7 +86,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
//MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
BuildMI(MBB, I, DL, get(PIC16::movwf))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
@@ -101,7 +101,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
: PIC16::save_fsr1;
|
||||
BuildMI(MBB, I, DL, get(opcode))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
@@ -127,7 +127,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
||||
//MachineFunction &MF = *MBB.getParent();
|
||||
//MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
BuildMI(MBB, I, DL, get(PIC16::movf), DestReg)
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
@@ -141,7 +141,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
||||
unsigned opcode = (DestReg == PIC16::FSR0) ? PIC16::restore_fsr0
|
||||
: PIC16::restore_fsr1;
|
||||
BuildMI(MBB, I, DL, get(opcode), DestReg)
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
|
52
lib/Target/PIC16/PIC16MachineFunctionInfo.h
Normal file
52
lib/Target/PIC16/PIC16MachineFunctionInfo.h
Normal file
@@ -0,0 +1,52 @@
|
||||
//====- PIC16MachineFuctionInfo.h - PIC16 machine function info -*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares PIC16-specific per-machine-function information.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef PIC16MACHINEFUNCTIONINFO_H
|
||||
#define PIC16MACHINEFUNCTIONINFO_H
|
||||
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// PIC16MachineFunctionInfo - This class is derived from MachineFunction
|
||||
/// private PIC16 target-specific information for each MachineFunction.
|
||||
class PIC16MachineFunctionInfo : public MachineFunctionInfo {
|
||||
// The frameindexes generated for spill/reload are stack based.
|
||||
// This maps maintain zero based indexes for these FIs.
|
||||
std::map<unsigned, unsigned> FiTmpOffsetMap;
|
||||
unsigned TmpSize;
|
||||
|
||||
// These are the frames for return value and argument passing
|
||||
// These FrameIndices will be expanded to foo.frame external symbol
|
||||
// and all others will be expanded to foo.tmp external symbol.
|
||||
unsigned ReservedFrameCount;
|
||||
|
||||
public:
|
||||
PIC16MachineFunctionInfo()
|
||||
: TmpSize(0), ReservedFrameCount(0) {}
|
||||
|
||||
explicit PIC16MachineFunctionInfo(MachineFunction &MF)
|
||||
: TmpSize(0), ReservedFrameCount(0) {}
|
||||
|
||||
std::map<unsigned, unsigned> &getFiTmpOffsetMap() { return FiTmpOffsetMap; }
|
||||
|
||||
unsigned getTmpSize() const { return TmpSize; }
|
||||
void setTmpSize(unsigned Size) { TmpSize = Size; }
|
||||
|
||||
unsigned getReservedFrameCount() const { return ReservedFrameCount; }
|
||||
void setReservedFrameCount(unsigned Count) { ReservedFrameCount = Count; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user