14 #ifndef LLVM_CODEGEN_MACHINEFRAMEINFO_H
15 #define LLVM_CODEGEN_MACHINEFRAMEINFO_H
18 #include "llvm/Support/DataTypes.h"
25 class TargetRegisterClass;
27 class MachineFunction;
28 class MachineBasicBlock;
29 class TargetFrameLowering;
43 :
Reg(R), FrameIdx(FI) {}
117 StackObject(uint64_t Sz,
unsigned Al, int64_t SP,
bool IM,
119 : SPOffset(SP), Size(Sz), Alignment(Al), isImmutable(IM),
120 isSpillSlot(isSS), MayNeedSP(NSP), Alloca(Val), PreAllocated(
false) {}
127 std::vector<StackObject> Objects;
133 unsigned NumFixedObjects;
138 bool HasVarSizedObjects;
142 bool FrameAddressTaken;
146 bool ReturnAddressTaken;
164 int OffsetAdjustment;
173 unsigned MaxAlignment;
184 int StackProtectorIdx;
188 int FunctionContextIdx;
196 unsigned MaxCallFrameSize;
202 std::vector<CalleeSavedInfo> CSInfo;
212 int64_t LocalFrameSize;
216 unsigned LocalFrameMaxAlign;
221 bool UseLocalStackAllocationBlock;
229 : TM(TM), RealignOption(RealignOpt) {
230 StackSize = NumFixedObjects = OffsetAdjustment = MaxAlignment = 0;
231 HasVarSizedObjects =
false;
232 FrameAddressTaken =
false;
233 ReturnAddressTaken =
false;
234 AdjustsStack =
false;
236 StackProtectorIdx = -1;
237 FunctionContextIdx = -1;
238 MaxCallFrameSize = 0;
241 LocalFrameMaxAlign = 0;
242 UseLocalStackAllocationBlock =
false;
296 LocalFrameObjects.
push_back(std::pair<int, int64_t>(ObjectIndex, Offset));
297 Objects[ObjectIndex + NumFixedObjects].PreAllocated =
true;
302 assert (i >= 0 && (
unsigned)i < LocalFrameObjects.
size() &&
303 "Invalid local object reference!");
304 return LocalFrameObjects[i];
334 UseLocalStackAllocationBlock = v;
340 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
341 "Invalid Object Idx!");
342 return Objects[ObjectIdx+NumFixedObjects].PreAllocated;
348 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
349 "Invalid Object Idx!");
350 return Objects[ObjectIdx+NumFixedObjects].Size;
355 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
356 "Invalid Object Idx!");
357 Objects[ObjectIdx+NumFixedObjects].Size = Size;
362 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
363 "Invalid Object Idx!");
364 return Objects[ObjectIdx+NumFixedObjects].Alignment;
369 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
370 "Invalid Object Idx!");
371 Objects[ObjectIdx+NumFixedObjects].Alignment =
Align;
378 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
379 "Invalid Object Idx!");
380 return Objects[ObjectIdx+NumFixedObjects].Alloca;
386 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
387 "Invalid Object Idx!");
388 return Objects[ObjectIdx+NumFixedObjects].MayNeedSP;
395 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
396 "Invalid Object Idx!");
398 "Getting frame offset for a dead object?");
399 return Objects[ObjectIdx+NumFixedObjects].SPOffset;
406 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
407 "Invalid Object Idx!");
409 "Setting frame offset for a dead object?");
410 Objects[ObjectIdx+NumFixedObjects].SPOffset = SPOffset;
473 return ObjectIdx < 0 && (ObjectIdx >= -(int)NumFixedObjects);
479 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
480 "Invalid Object Idx!");
481 return Objects[ObjectIdx+NumFixedObjects].isImmutable;
487 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
488 "Invalid Object Idx!");
489 return Objects[ObjectIdx+NumFixedObjects].isSpillSlot;
495 assert(
unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
496 "Invalid Object Idx!");
497 return Objects[ObjectIdx+NumFixedObjects].Size == ~0ULL;
504 bool MayNeedSP =
false,
const AllocaInst *Alloca = 0);
516 Objects[ObjectIdx+NumFixedObjects].Size = ~0ULL;
int getFunctionContextIndex() const
void setFrameAddressIsTaken(bool T)
COFF::RelocationTypeX86 Type
void push_back(const T &Elt)
void mapLocalFrameObject(int ObjectIndex, int64_t Offset)
mapLocalFrameObject - Map a frame index into the local object block
void setCalleeSavedInfoValid(bool v)
bool adjustsStack() const
unsigned getNumObjects() const
bool isReturnAddressTaken() const
bool isObjectPreAllocated(int ObjectIdx) const
unsigned getMaxAlignment() const
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
uint64_t getStackSize() const
int64_t getLocalFrameSize() const
getLocalFrameSize - Get the size of the local object blob.
void setLocalFrameSize(int64_t sz)
setLocalFrameSize - Set the size of the local object blob.
void setUseLocalStackAllocationBlock(bool v)
Abstract Stack Frame Information.
bool isFrameAddressTaken() const
bool isFixedObjectIndex(int ObjectIdx) const
void setFunctionContextIndex(int I)
void print(const MachineFunction &MF, raw_ostream &OS) const
int getObjectIndexBegin() const
bool hasStackObjects() const
int getOffsetAdjustment() const
unsigned getLocalFrameMaxAlign() const
void setLocalFrameMaxAlign(unsigned Align)
bool isImmutableObjectIndex(int ObjectIdx) const
unsigned getNumFixedObjects() const
getNumFixedObjects - Return the number of fixed objects.
void setStackProtectorIndex(int I)
unsigned estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
bool isSpillSlotObjectIndex(int ObjectIdx) const
MachineFrameInfo(const TargetMachine &TM, bool RealignOpt)
void RemoveStackObject(int ObjectIdx)
bool getUseLocalStackAllocationBlock()
void setStackSize(uint64_t Size)
bool isCalleeSavedInfoValid() const
isCalleeSavedInfoValid - Has the callee saved info been calculated yet?
void setObjectSize(int ObjectIdx, int64_t Size)
setObjectSize - Change the size of the specified stack object.
int CreateSpillStackObject(uint64_t Size, unsigned Alignment)
int64_t getObjectOffset(int ObjectIdx) const
bool isDeadObjectIndex(int ObjectIdx) const
bool hasCalls() const
hasCalls - Return true if the current function has any function calls.
BitVector getPristineRegs(const MachineBasicBlock *MBB) const
int64_t getLocalFrameObjectCount()
CalleeSavedInfo(unsigned R, int FI=0)
unsigned getObjectAlignment(int ObjectIdx) const
getObjectAlignment - Return the alignment of the specified stack object.
unsigned getMaxCallFrameSize() const
void setOffsetAdjustment(int Adj)
void setAdjustsStack(bool V)
int CreateVariableSizedObject(unsigned Alignment)
static cl::opt< AlignMode > Align(cl::desc("Load/store alignment support"), cl::Hidden, cl::init(DefaultAlign), cl::values(clEnumValN(DefaultAlign,"arm-default-align","Generate unaligned accesses only on hardware/OS ""combinations that are known to support them"), clEnumValN(StrictAlign,"arm-strict-align","Disallow all unaligned memory accesses"), clEnumValN(NoStrictAlign,"arm-no-strict-align","Allow unaligned memory accesses"), clEnumValEnd))
int getStackProtectorIndex() const
void setCalleeSavedInfo(const std::vector< CalleeSavedInfo > &CSI)
int CreateStackObject(uint64_t Size, unsigned Alignment, bool isSS, bool MayNeedSP=false, const AllocaInst *Alloca=0)
void ensureMaxAlignment(unsigned Align)
void setMaxCallFrameSize(unsigned S)
bool hasVarSizedObjects() const
void setReturnAddressIsTaken(bool s)
void dump(const MachineFunction &MF) const
dump - Print the function to stderr.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
std::pair< int, int64_t > getLocalFrameObjectMap(int i)
getLocalFrameObjectMap - Get the local offset mapping for a for an object
int getObjectIndexEnd() const
int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool Immutable)
const AllocaInst * getObjectAllocation(int ObjectIdx) const
void setObjectAlignment(int ObjectIdx, unsigned Align)
setObjectAlignment - Change the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
bool MayNeedStackProtector(int ObjectIdx) const