X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARMMachineFunctionInfo.h;h=138f0c2622718526583264e231de68522878340a;hb=8a8d28b0392a27ff8e0c60c04561671023a08dc2;hp=3b34a23774df6edff747ab515543ef00d5e89463;hpb=8155ea4c3a656d32b0ddd93de6e7bbca4ace867a;p=oota-llvm.git diff --git a/lib/Target/ARM/ARMMachineFunctionInfo.h b/lib/Target/ARM/ARMMachineFunctionInfo.h index 3b34a23774d..138f0c26227 100644 --- a/lib/Target/ARM/ARMMachineFunctionInfo.h +++ b/lib/Target/ARM/ARMMachineFunctionInfo.h @@ -22,8 +22,8 @@ namespace llvm { -/// ARMFunctionInfo - This class is derived from MachineFunction private -/// ARM target-specific information for each MachineFunction. +/// ARMFunctionInfo - This class is derived from MachineFunctionInfo and +/// contains private ARM-specific information for each MachineFunction. class ARMFunctionInfo : public MachineFunctionInfo { /// isThumb - True if this function is compiled under Thumb mode. @@ -55,33 +55,35 @@ class ARMFunctionInfo : public MachineFunctionInfo { /// spill stack offset. unsigned FramePtrSpillOffset; - /// GPRCSOffset, DPRCSOffset - Starting offset of callee saved register - /// spills areas (excluding R9 for Mac OS X): + /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved + /// register spills areas. For Mac OS X: /// - /// GPR callee-saved (1) : r4, r5, r6, r7, r8, r9, r10, r11, lr + /// GPR callee-saved (1) : r4, r5, r6, r7, lr + /// -------------------------------------------- + /// GPR callee-saved (2) : r8, r10, r11 /// -------------------------------------------- /// DPR callee-saved : d8 - d15 - unsigned GPRCSOffset; + unsigned GPRCS1Offset; + unsigned GPRCS2Offset; unsigned DPRCSOffset; - /// GPRCSSize, DPRCSSize - Sizes of callee saved register spills areas. - unsigned GPRCSSize; + /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills + /// areas. + unsigned GPRCS1Size; + unsigned GPRCS2Size; unsigned DPRCSSize; - /// GPRCSFrames, DPRCSFrames - Keeps track of frame indices which belong - /// to these spill areas. - BitVector GPRCSFrames; + /// GPRCS1Frames, GPRCS2Frames, DPRCSFrames - Keeps track of frame indices + /// which belong to these spill areas. + BitVector GPRCS1Frames; + BitVector GPRCS2Frames; BitVector DPRCSFrames; - /// SpilledCSRegs - A BitVector mask of all spilled callee-saved registers. - /// - BitVector SpilledCSRegs; - /// JumpTableUId - Unique id for jumptables. /// unsigned JumpTableUId; - unsigned ConstPoolEntryUId; + unsigned PICLabelUId; /// VarArgsFrameIndex - FrameIndex for start of varargs area. int VarArgsFrameIndex; @@ -89,29 +91,32 @@ class ARMFunctionInfo : public MachineFunctionInfo { /// HasITBlocks - True if IT blocks have been inserted. bool HasITBlocks; + /// CPEClones - Track constant pool entries clones created by Constant Island + /// pass. + DenseMap CPEClones; + public: ARMFunctionInfo() : isThumb(false), hasThumb2(false), VarArgsRegSaveSize(0), HasStackFrame(false), RestoreSPFromFP(false), LRSpilledForFarJump(false), - FramePtrSpillOffset(0), GPRCSOffset(0), DPRCSOffset(0), - GPRCSSize(0), DPRCSSize(0), - GPRCSFrames(0), DPRCSFrames(0), - JumpTableUId(0), ConstPoolEntryUId(0), VarArgsFrameIndex(0), - HasITBlocks(false) {} + FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0), + GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), + GPRCS1Frames(0), GPRCS2Frames(0), DPRCSFrames(0), + JumpTableUId(0), PICLabelUId(0), + VarArgsFrameIndex(0), HasITBlocks(false) {} explicit ARMFunctionInfo(MachineFunction &MF) : isThumb(MF.getTarget().getSubtarget().isThumb()), hasThumb2(MF.getTarget().getSubtarget().hasThumb2()), VarArgsRegSaveSize(0), HasStackFrame(false), RestoreSPFromFP(false), LRSpilledForFarJump(false), - FramePtrSpillOffset(0), GPRCSOffset(0), DPRCSOffset(0), - GPRCSSize(0), DPRCSSize(0), - GPRCSFrames(32), DPRCSFrames(32), - SpilledCSRegs(MF.getTarget().getRegisterInfo()->getNumRegs()), - JumpTableUId(0), ConstPoolEntryUId(0), VarArgsFrameIndex(0), - HasITBlocks(false) {} + FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0), + GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0), + GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32), + JumpTableUId(0), PICLabelUId(0), + VarArgsFrameIndex(0), HasITBlocks(false) {} bool isThumbFunction() const { return isThumb; } bool isThumb1OnlyFunction() const { return isThumb && !hasThumb2; } @@ -132,22 +137,31 @@ public: unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; } void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; } - unsigned getGPRCalleeSavedAreaOffset() const { return GPRCSOffset; } + unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; } + unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; } unsigned getDPRCalleeSavedAreaOffset() const { return DPRCSOffset; } - void setGPRCalleeSavedAreaOffset(unsigned o) { GPRCSOffset = o; } + void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; } + void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; } void setDPRCalleeSavedAreaOffset(unsigned o) { DPRCSOffset = o; } - unsigned getGPRCalleeSavedAreaSize() const { return GPRCSSize; } + unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; } + unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; } unsigned getDPRCalleeSavedAreaSize() const { return DPRCSSize; } - void setGPRCalleeSavedAreaSize(unsigned s) { GPRCSSize = s; } + void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; } + void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; } void setDPRCalleeSavedAreaSize(unsigned s) { DPRCSSize = s; } - bool isGPRCalleeSavedAreaFrame(int fi) const { - if (fi < 0 || fi >= (int)GPRCSFrames.size()) + bool isGPRCalleeSavedArea1Frame(int fi) const { + if (fi < 0 || fi >= (int)GPRCS1Frames.size()) + return false; + return GPRCS1Frames[fi]; + } + bool isGPRCalleeSavedArea2Frame(int fi) const { + if (fi < 0 || fi >= (int)GPRCS2Frames.size()) return false; - return GPRCSFrames[fi]; + return GPRCS2Frames[fi]; } bool isDPRCalleeSavedAreaFrame(int fi) const { if (fi < 0 || fi >= (int)DPRCSFrames.size()) @@ -155,16 +169,28 @@ public: return DPRCSFrames[fi]; } - void addGPRCalleeSavedAreaFrame(int fi) { + void addGPRCalleeSavedArea1Frame(int fi) { + if (fi >= 0) { + int Size = GPRCS1Frames.size(); + if (fi >= Size) { + Size *= 2; + if (fi >= Size) + Size = fi+1; + GPRCS1Frames.resize(Size); + } + GPRCS1Frames[fi] = true; + } + } + void addGPRCalleeSavedArea2Frame(int fi) { if (fi >= 0) { - int Size = GPRCSFrames.size(); + int Size = GPRCS2Frames.size(); if (fi >= Size) { Size *= 2; if (fi >= Size) Size = fi+1; - GPRCSFrames.resize(Size); + GPRCS2Frames.resize(Size); } - GPRCSFrames[fi] = true; + GPRCS2Frames[fi] = true; } } void addDPRCalleeSavedAreaFrame(int fi) { @@ -180,18 +206,6 @@ public: } } - void setCSRegisterIsSpilled(unsigned Reg) { - SpilledCSRegs.set(Reg); - } - - bool isCSRegisterSpilled(unsigned Reg) const { - return SpilledCSRegs[Reg]; - } - - const BitVector &getSpilledCSRegisters() const { - return SpilledCSRegs; - } - unsigned createJumpTableUId() { return JumpTableUId++; } @@ -200,16 +214,16 @@ public: return JumpTableUId; } - void initConstPoolEntryUId(unsigned UId) { - ConstPoolEntryUId = UId; + void initPICLabelUId(unsigned UId) { + PICLabelUId = UId; } - unsigned getNumConstPoolEntries() const { - return ConstPoolEntryUId; + unsigned getNumPICLabels() const { + return PICLabelUId; } - unsigned createConstPoolEntryUId() { - return ConstPoolEntryUId++; + unsigned createPICLabelUId() { + return PICLabelUId++; } int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } @@ -217,6 +231,19 @@ public: bool hasITBlocks() const { return HasITBlocks; } void setHasITBlocks(bool h) { HasITBlocks = h; } + + void recordCPEClone(unsigned CPIdx, unsigned CPCloneIdx) { + if (!CPEClones.insert(std::make_pair(CPCloneIdx, CPIdx)).second) + assert(0 && "Duplicate entries!"); + } + + unsigned getOriginalCPIdx(unsigned CloneIdx) const { + DenseMap::const_iterator I = CPEClones.find(CloneIdx); + if (I != CPEClones.end()) + return I->second; + else + return -1U; + } }; } // End llvm namespace