aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/MachineFunctionInfo.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-12-28 20:07:33 +0000
committerChris Lattner <sabre@nondot.org>2002-12-28 20:07:33 +0000
commit1951c5b98726313bc3bf8fba708b91146ad022fb (patch)
treef88a88014e1e5cd98775cefbd9b185e4898e2fce /include/llvm/CodeGen/MachineFunctionInfo.h
parent7ad6be7b01a902f532eebb607306f7b3f4627718 (diff)
State for frame and constant pool information pulled out of MachineFunction
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5165 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/MachineFunctionInfo.h')
-rw-r--r--include/llvm/CodeGen/MachineFunctionInfo.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/MachineFunctionInfo.h b/include/llvm/CodeGen/MachineFunctionInfo.h
new file mode 100644
index 0000000000..53df8bde7f
--- /dev/null
+++ b/include/llvm/CodeGen/MachineFunctionInfo.h
@@ -0,0 +1,108 @@
+//===-- llvm/CodeGen/MachineFunctionInfo.h ----------------------*- C++ -*-===//
+//
+// This class keeps track of information about the stack frame and about the
+// per-function constant pool.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_MACHINEFUNCTIONINFO_H
+#define LLVM_CODEGEN_MACHINEFUNCTIONINFO_H
+
+#include "Support/HashExtras.h"
+#include "Support/hash_set"
+class MachineFunction;
+class Value;
+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:
+ 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; }
+
+ int getOffset (const Value* val) const;
+
+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);
+};
+
+#endif