X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FMRegisterInfo.cpp;h=920bb5d3af3f66e6d1294d21a7bc1afa16649b36;hb=f3e1b1d716ccff0ccb387802349c5a813f223241;hp=6f358152638420f875c4c8b05c8573f088a05b56;hpb=b576c94c15af9a440f69d9d03c2afead7971118c;p=oota-llvm.git diff --git a/lib/Target/MRegisterInfo.cpp b/lib/Target/MRegisterInfo.cpp index 6f358152638..920bb5d3af3 100644 --- a/lib/Target/MRegisterInfo.cpp +++ b/lib/Target/MRegisterInfo.cpp @@ -1,10 +1,10 @@ //===- MRegisterInfo.cpp - Target Register Information Implementation -----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the MRegisterInfo interface. @@ -13,31 +13,52 @@ #include "llvm/Target/MRegisterInfo.h" -MRegisterInfo::MRegisterInfo(const MRegisterDesc *D, unsigned NR, +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineLocation.h" + +using namespace llvm; + +MRegisterInfo::MRegisterInfo(const TargetRegisterDesc *D, unsigned NR, regclass_iterator RCB, regclass_iterator RCE, - int CFSO, int CFDO) + int CFSO, int CFDO) : Desc(D), NumRegs(NR), RegClassBegin(RCB), RegClassEnd(RCE) { assert(NumRegs < FirstVirtualRegister && "Target has too many physical registers!"); - PhysRegClasses = new const TargetRegisterClass*[NumRegs]; - for (unsigned i = 0; i != NumRegs; ++i) - PhysRegClasses[i] = 0; - - // Fill in the PhysRegClasses map - for (MRegisterInfo::regclass_iterator I = regclass_begin(), - E = regclass_end(); I != E; ++I) - for (unsigned i = 0, e = (*I)->getNumRegs(); i != e; ++i) { - unsigned Reg = (*I)->getRegister(i); - assert(PhysRegClasses[Reg] == 0 && "Register in more than one class?"); - PhysRegClasses[Reg] = *I; - } - CallFrameSetupOpcode = CFSO; CallFrameDestroyOpcode = CFDO; } +MRegisterInfo::~MRegisterInfo() {} -MRegisterInfo::~MRegisterInfo() { - delete[] PhysRegClasses; +std::vector MRegisterInfo::getAllocatableSet(MachineFunction &MF) const { + std::vector Allocatable(NumRegs); + for (MRegisterInfo::regclass_iterator I = regclass_begin(), + E = regclass_end(); I != E; ++I) { + const TargetRegisterClass *RC = *I; + for (TargetRegisterClass::iterator I = RC->allocation_order_begin(MF), + E = RC->allocation_order_end(MF); I != E; ++I) + Allocatable[*I] = true; + } + return Allocatable; +} + +/// getLocation - This method should return the actual location of a frame +/// variable given the frame index. The location is returned in ML. +/// Subclasses should override this method for special handling of frame +/// variables and then call MRegisterInfo::getLocation for the default action. +void MRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, + MachineLocation &ML) const { + MachineFrameInfo *MFI = MF.getFrameInfo(); + ML.set(getFrameRegister(MF), + MFI->getObjectOffset(Index) + MFI->getStackSize()); } + +/// getInitialFrameState - Returns a list of machine moves that are assumed +/// on entry to a function. +void +MRegisterInfo::getInitialFrameState(std::vector &Moves) const { + // Default is to do nothing. +} +