Move MachineCodeForInstruction.h and MachineFunctionInfo.h into lib/Target/SparcV9

llvm-svn: 15830
diff --git a/llvm/lib/Target/SparcV9/MachineCodeForInstruction.h b/llvm/lib/Target/SparcV9/MachineCodeForInstruction.h
new file mode 100644
index 0000000..fc36267
--- /dev/null
+++ b/llvm/lib/Target/SparcV9/MachineCodeForInstruction.h
@@ -0,0 +1,97 @@
+//===-- MachineCodeForInstruction.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.
+// 
+//===----------------------------------------------------------------------===//
+//
+// FIXME: This file is SparcV9 specific.  Do not rely on this class for new 
+// targets, it will go away in the future.
+//
+// Representation of the sequence of machine instructions created for a single
+// VM instruction.  Additionally records information about hidden and implicit
+// values used by the machine instructions: about hidden values used by the
+// machine instructions:
+// 
+// "Temporary values" are intermediate values used in the machine instruction
+// sequence, but not in the VM instruction Note that such values should be
+// treated as pure SSA values with no interpretation of their operands (i.e., as
+// a TmpInstruction object which actually represents such a value).
+// 
+// (2) "Implicit uses" are values used in the VM instruction but not in
+//     the machine instruction sequence
+// 
+//===----------------------------------------------------------------------===//
+
+#ifndef MACHINECODE_FOR_INSTRUCTION_H
+#define MACHINECODE_FOR_INSTRUCTION_H
+
+#include <vector>
+
+namespace llvm {
+
+class MachineInstr;
+class Instruction;
+class Value;
+class CallArgsDescriptor;
+
+  class MachineCodeForInstruction {
+  std::vector<Value*> tempVec;          // used by m/c instr but not VM instr
+  std::vector<MachineInstr*> Contents;  // the machine instr for this VM instr
+  CallArgsDescriptor* callArgsDesc;     // only used for CALL instructions
+public:
+  MachineCodeForInstruction() : callArgsDesc(NULL) {}
+  ~MachineCodeForInstruction();
+  
+  static MachineCodeForInstruction &get(const Instruction *I);
+  static void destroy(const Instruction *I);
+
+  // Access to underlying machine instructions...
+  typedef std::vector<MachineInstr*>::iterator iterator;
+  typedef std::vector<MachineInstr*>::const_iterator const_iterator;
+
+  unsigned size() const { return Contents.size(); }
+  bool empty() const { return Contents.empty(); }
+  MachineInstr *front() const { return Contents.front(); }
+  MachineInstr *back() const { return Contents.back(); }
+  MachineInstr *&operator[](unsigned i) { return Contents[i]; }
+  MachineInstr *operator[](unsigned i) const { return Contents[i]; }
+  void pop_back() { Contents.pop_back(); }
+
+  iterator begin() { return Contents.begin(); }
+  iterator end()   { return Contents.end(); }
+  const_iterator begin() const { return Contents.begin(); }
+  const_iterator end()   const { return Contents.end(); }
+
+  template<class InIt>
+  void insert(iterator where, InIt first, InIt last) {
+    Contents.insert(where, first, last);
+  }
+  iterator erase(iterator where) { return Contents.erase(where); }
+  iterator erase(iterator s, iterator e) { return Contents.erase(s, e); }
+  
+
+  // dropAllReferences() - This function drops all references within
+  // temporary (hidden) instructions created in implementing the original
+  // VM intruction.  This ensures there are no remaining "uses" within
+  // these hidden instructions, before the values of a method are freed.
+  //
+  void dropAllReferences();
+
+  const std::vector<Value*> &getTempValues() const { return tempVec; }
+        std::vector<Value*> &getTempValues()       { return tempVec; }
+  
+  MachineCodeForInstruction &addTemp(Value *tmp) {
+    tempVec.push_back(tmp);
+    return *this;
+  }
+
+  void setCallArgsDescriptor(CallArgsDescriptor* desc) { callArgsDesc = desc; }
+  CallArgsDescriptor* getCallArgsDescriptor() const    { return callArgsDesc; }
+};
+
+} // End llvm namespace
+
+#endif
diff --git a/llvm/lib/Target/SparcV9/MachineFunctionInfo.h b/llvm/lib/Target/SparcV9/MachineFunctionInfo.h
new file mode 100644
index 0000000..74a75e8
--- /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
diff --git a/llvm/lib/Target/SparcV9/MappingInfo.cpp b/llvm/lib/Target/SparcV9/MappingInfo.cpp
index 3aa2359..e8c7581 100644
--- a/llvm/lib/Target/SparcV9/MappingInfo.cpp
+++ b/llvm/lib/Target/SparcV9/MappingInfo.cpp
@@ -46,7 +46,7 @@
 #include "llvm/Pass.h"
 #include "llvm/Module.h"
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
+#include "MachineCodeForInstruction.h"
 #include "Support/StringExtras.h"
 
 namespace llvm {
diff --git a/llvm/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp b/llvm/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
index 74834f0..6a68a0b 100644
--- a/llvm/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
+++ b/llvm/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
@@ -26,6 +26,8 @@
 #include "RegAllocCommon.h"
 #include "RegClass.h"
 #include "../LiveVar/FunctionLiveVarInfo.h"
+#include "../MachineCodeForInstruction.h"
+#include "../MachineFunctionInfo.h"
 #include "../SparcV9InstrInfo.h"
 #include "../SparcV9TmpInstr.h"
 #include "llvm/Constants.h"
@@ -34,9 +36,7 @@
 #include "llvm/Module.h"
 #include "llvm/Type.h"
 #include "llvm/Analysis/LoopInfo.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "../MachineInstrAnnot.h"
diff --git a/llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
index 0be404d..fcdb5e0 100644
--- a/llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
@@ -25,12 +25,12 @@
 #include "llvm/Assembly/Writer.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/Support/Mangler.h"
 #include "Support/StringExtras.h"
 #include "Support/Statistic.h"
 #include "SparcV9Internals.h"
+#include "MachineFunctionInfo.h"
 #include <string>
 using namespace llvm;
 
diff --git a/llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp b/llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp
index 037cb32c..050599b 100644
--- a/llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp
@@ -21,15 +21,14 @@
 #include "SparcV9TmpInstr.h"
 #include "SparcV9FrameInfo.h"
 #include "SparcV9RegisterInfo.h"
+#include "MachineFunctionInfo.h"
 #include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
-#include "llvm/GlobalValue.h"
 #include "llvm/Instructions.h"
 #include "llvm/Intrinsics.h"
 #include "llvm/Module.h"
diff --git a/llvm/lib/Target/SparcV9/SparcV9CodeEmitter.cpp b/llvm/lib/Target/SparcV9/SparcV9CodeEmitter.cpp
index 65edfb1..e870a15 100644
--- a/llvm/lib/Target/SparcV9/SparcV9CodeEmitter.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9CodeEmitter.cpp
@@ -26,7 +26,6 @@
 #include "llvm/PassManager.h"
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/Target/TargetMachine.h"
@@ -38,6 +37,7 @@
 #include "SparcV9TargetMachine.h"
 #include "SparcV9RegInfo.h"
 #include "SparcV9CodeEmitter.h"
+#include "MachineFunctionInfo.h"
 #include "Config/alloca.h"
 
 namespace llvm {
diff --git a/llvm/lib/Target/SparcV9/SparcV9FrameInfo.cpp b/llvm/lib/Target/SparcV9/SparcV9FrameInfo.cpp
index 26d92eb..59e8113 100644
--- a/llvm/lib/Target/SparcV9/SparcV9FrameInfo.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9FrameInfo.cpp
@@ -12,8 +12,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/Target/TargetFrameInfo.h"
+#include "MachineFunctionInfo.h"
 #include "SparcV9FrameInfo.h"
 
 using namespace llvm;
diff --git a/llvm/lib/Target/SparcV9/SparcV9PrologEpilogInserter.cpp b/llvm/lib/Target/SparcV9/SparcV9PrologEpilogInserter.cpp
index 4f5214d..419b110 100644
--- a/llvm/lib/Target/SparcV9/SparcV9PrologEpilogInserter.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9PrologEpilogInserter.cpp
@@ -20,9 +20,9 @@
 #include "SparcV9RegClassInfo.h"
 #include "SparcV9RegisterInfo.h"
 #include "SparcV9FrameInfo.h"
+#include "MachineFunctionInfo.h"
+#include "MachineCodeForInstruction.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/Pass.h"
 #include "llvm/Function.h"
diff --git a/llvm/lib/Target/SparcV9/SparcV9RegInfo.cpp b/llvm/lib/Target/SparcV9/SparcV9RegInfo.cpp
index b01c4fc..41c17e0 100644
--- a/llvm/lib/Target/SparcV9/SparcV9RegInfo.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9RegInfo.cpp
@@ -13,9 +13,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
+#include "MachineFunctionInfo.h"
+#include "MachineCodeForInstruction.h"
 #include "MachineInstrAnnot.h"
 #include "RegAlloc/LiveRangeInfo.h"
 #include "RegAlloc/LiveRange.h"
diff --git a/llvm/lib/Target/SparcV9/SparcV9StackSlots.cpp b/llvm/lib/Target/SparcV9/SparcV9StackSlots.cpp
index c21defb..693d29e 100644
--- a/llvm/lib/Target/SparcV9/SparcV9StackSlots.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9StackSlots.cpp
@@ -17,10 +17,9 @@
 #include "llvm/Constant.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Function.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
-
-namespace llvm {
+#include "MachineFunctionInfo.h"
+using namespace llvm;
 
 namespace {
   class StackSlots : public MachineFunctionPass {
@@ -47,8 +46,7 @@
   };
 }
 
-Pass *createStackSlotsPass(const TargetMachine &Target) {
+Pass *llvm::createStackSlotsPass(const TargetMachine &Target) {
   return new StackSlots(Target);
 }
 
-} // End llvm namespace
diff --git a/llvm/lib/Target/SparcV9/SparcV9TargetMachine.cpp b/llvm/lib/Target/SparcV9/SparcV9TargetMachine.cpp
index bf4188f..bca50ab 100644
--- a/llvm/lib/Target/SparcV9/SparcV9TargetMachine.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9TargetMachine.cpp
@@ -19,13 +19,13 @@
 #include "llvm/CodeGen/InstrScheduling.h"
 #include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineFunctionInfo.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetMachineRegistry.h"
 #include "llvm/Transforms/Scalar.h"
 #include "MappingInfo.h" 
+#include "MachineFunctionInfo.h"
+#include "MachineCodeForInstruction.h"
 #include "SparcV9Internals.h"
 #include "SparcV9TargetMachine.h"
 #include "SparcV9BurgISel.h"
diff --git a/llvm/lib/Target/SparcV9/SparcV9TmpInstr.h b/llvm/lib/Target/SparcV9/SparcV9TmpInstr.h
index b4a7d49..fa71865 100644
--- a/llvm/lib/Target/SparcV9/SparcV9TmpInstr.h
+++ b/llvm/lib/Target/SparcV9/SparcV9TmpInstr.h
@@ -16,7 +16,7 @@
 #define SPARCV9TMPINSTR_H
 
 #include "llvm/Instruction.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
+#include "MachineCodeForInstruction.h"
 
 namespace llvm {