diff options
Diffstat (limited to 'llvm/lib/Target/SparcV9/MachineFunctionInfo.h')
-rw-r--r-- | llvm/lib/Target/SparcV9/MachineFunctionInfo.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/llvm/lib/Target/SparcV9/MachineFunctionInfo.h b/llvm/lib/Target/SparcV9/MachineFunctionInfo.h new file mode 100644 index 00000000000..74a75e8e483 --- /dev/null +++ b/llvm/lib/Target/SparcV9/MachineFunctionInfo.h @@ -0,0 +1,124 @@ +//===-- MachineFunctionInfo.h -----------------------------------*- C++ -*-===// +// +// 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 class keeps track of information about the stack frame and about the +// per-function constant pool. +// +// FIXME: This class is completely SparcV9 specific. Do not use it for future +// targets. This file will be eliminated in future versions of LLVM. +// +//===----------------------------------------------------------------------===// + +#ifndef MACHINEFUNCTIONINFO_H +#define MACHINEFUNCTIONINFO_H + +#include "MachineCodeForInstruction.h" +#include "Support/HashExtras.h" +#include "Support/hash_set" + +namespace llvm { + +class MachineFunction; +class Constant; +class Type; + +class MachineFunctionInfo { + hash_set<const Constant*> constantsForConstPool; + hash_map<const Value*, int> offsets; + + unsigned staticStackSize; + unsigned automaticVarsSize; + unsigned regSpillsSize; + unsigned maxOptionalArgsSize; + unsigned maxOptionalNumArgs; + unsigned currentTmpValuesSize; + unsigned maxTmpValuesSize; + bool compiledAsLeaf; + bool spillsAreaFrozen; + bool automaticVarsAreaFrozen; + + MachineFunction &MF; +public: + hash_map<const Instruction*, MachineCodeForInstruction> MCFIEntries; + + MachineFunctionInfo(MachineFunction &mf) : MF(mf) { + staticStackSize = automaticVarsSize = regSpillsSize = 0; + maxOptionalArgsSize = maxOptionalNumArgs = currentTmpValuesSize = 0; + maxTmpValuesSize = 0; + compiledAsLeaf = spillsAreaFrozen = automaticVarsAreaFrozen = false; + } + + /// CalculateArgSize - Call this method to fill in the maxOptionalArgsSize & + /// staticStackSize fields... + /// + void CalculateArgSize(); + + // + // Accessors for global information about generated code for a method. + // + bool isCompiledAsLeafMethod() const { return compiledAsLeaf; } + unsigned getStaticStackSize() const { return staticStackSize; } + unsigned getAutomaticVarsSize() const { return automaticVarsSize; } + unsigned getRegSpillsSize() const { return regSpillsSize; } + unsigned getMaxOptionalArgsSize() const { return maxOptionalArgsSize;} + unsigned getMaxOptionalNumArgs() const { return maxOptionalNumArgs;} + const hash_set<const Constant*> &getConstantPoolValues() const { + return constantsForConstPool; + } + + // + // Modifiers used during code generation + // + void initializeFrameLayout (); + + void addToConstantPool (const Constant* constVal) { + constantsForConstPool.insert(constVal); + } + + void markAsLeafMethod() { compiledAsLeaf = true; } + + int computeOffsetforLocalVar (const Value* local, + unsigned& getPaddedSize, + unsigned sizeToUse = 0); + int allocateLocalVar (const Value* local, + unsigned sizeToUse = 0); + + int allocateSpilledValue (const Type* type); + int pushTempValue (unsigned size); + void popAllTempValues (); + + void freezeSpillsArea () { spillsAreaFrozen = true; } + void freezeAutomaticVarsArea () { automaticVarsAreaFrozen=true; } + +private: + void incrementAutomaticVarsSize(int incr) { + automaticVarsSize+= incr; + staticStackSize += incr; + } + void incrementRegSpillsSize(int incr) { + regSpillsSize+= incr; + staticStackSize += incr; + } + void incrementTmpAreaSize(int incr) { + currentTmpValuesSize += incr; + if (maxTmpValuesSize < currentTmpValuesSize) + { + staticStackSize += currentTmpValuesSize - maxTmpValuesSize; + maxTmpValuesSize = currentTmpValuesSize; + } + } + void resetTmpAreaSize() { + currentTmpValuesSize = 0; + } + int allocateOptionalArg(const Type* type); +}; + +} // End llvm namespace + +#endif |