Rearrange code, indent for the namespace, add the createMachineFunctionPrinterPass
[oota-llvm.git] / include / llvm / CodeGen / MachineFunction.h
index 01c9fd9d24f035c120be3c1af9961d5465776f0f..4f255598d385e76cbdd838e19d54f75d15b1491f 100644 (file)
-//===-- llvm/CodeGen/MachineCodeForMethod.h ----------------------*- C++ -*--=//
+//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
 // 
-// Purpose:
-//   Collect native machine code information for a method.
-//   This allows target-specific information about the generated code
-//   to be stored with each method.
+//                     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.
+// 
+//===----------------------------------------------------------------------===//
+// 
+// Collect native machine code for a function.  This class contains a list of
+// MachineBasicBlock instances that make up the current compiled function.
+//
+// This class also contains pointers to various classes which hold
+// target-specific information about the generated code.
+//   
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CODEGEN_MACHINECODEFORMETHOD_H
-#define LLVM_CODEGEN_MACHINECODEFORMETHOD_H
+#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
+#define LLVM_CODEGEN_MACHINEFUNCTION_H
+
+#include "llvm/CodeGen/MachineBasicBlock.h"
+#include "Support/Annotation.h"
+#include "Support/ilist"
+
+namespace llvm {
 
-#include "llvm/Annotation.h"
-#include "Support/NonCopyable.h"
-#include "Support/HashExtras.h"
-#include <ext/hash_set>
-class Value;
 class Function;
-class Constant;
-class Type;
 class TargetMachine;
+class SSARegMap;
+class MachineFunctionInfo;
+class MachineFrameInfo;
+class MachineConstantPool;
+
+class MachineFunction : private Annotation {
+  const Function *Fn;
+  const TargetMachine &Target;
+
+  // List of machine basic blocks in function
+  iplist<MachineBasicBlock> BasicBlocks;
+
+  // Keeping track of mapping from SSA values to registers
+  SSARegMap *SSARegMapping;
 
+  // Used to keep track of frame and constant area information for sparc be
+  MachineFunctionInfo *MFInfo;
+
+  // Keep track of objects allocated on the stack.
+  MachineFrameInfo *FrameInfo;
+
+  // Keep track of constants which are spilled to memory
+  MachineConstantPool *ConstantPool;
 
-class MachineCodeForMethod : private Annotation {
-  const Function* method;
-  bool          compiledAsLeaf;
-  unsigned     staticStackSize;
-  unsigned     automaticVarsSize;
-  unsigned     regSpillsSize;
-  unsigned     currentOptionalArgsSize;
-  unsigned     maxOptionalArgsSize;
-  unsigned     currentTmpValuesSize;
-  unsigned     maxTmpValuesSize;
-  std::hash_set<const Constant*> constantsForConstPool;
-  std::hash_map<const Value*, int> offsets;
-  
 public:
-  /*ctor*/      MachineCodeForMethod(const Function* function,
-                                     const TargetMachine& target);
-  
-  // The next two methods are used to construct and to retrieve
-  // the MachineCodeForMethod object for the given method.
+  MachineFunction(const Function *Fn, const TargetMachine &TM);
+  ~MachineFunction();
+
+  /// getFunction - Return the LLVM function that this machine code represents
+  ///
+  const Function *getFunction() const { return Fn; }
+
+  /// getTarget - Return the target machine this machine code is compiled with
+  ///
+  const TargetMachine &getTarget() const { return Target; }
+
+  /// SSARegMap Interface... Keep track of information about each SSA virtual
+  /// register, such as which register class it belongs to.
+  ///
+  SSARegMap *getSSARegMap() const { return SSARegMapping; }
+  void clearSSARegMap();
+
+  /// getFrameInfo - Return the frame info object for the current function.
+  /// This object contains information about objects allocated on the stack
+  /// frame of the current function in an abstract way.
+  ///
+  MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
+
+  /// getConstantPool - Return the constant pool object for the current
+  /// function.
+  MachineConstantPool *getConstantPool() const { return ConstantPool; }
+
+  /// MachineFunctionInfo - Keep track of various per-function pieces of
+  /// information for the sparc backend.
+  ///
+  MachineFunctionInfo *getInfo() const { return MFInfo; }
+
+
+  /// print - Print out the MachineFunction in a format suitable for debugging
+  /// to the specified stream.
+  ///
+  void print(std::ostream &OS) const;
+
+  /// dump - Print the current MachineFunction to cerr, useful for debugger use.
+  ///
+  void dump() const;
+
+  // The next three methods are used to construct, destruct, and retrieve the
+  // MachineFunction object for the given method.
+  //
   // construct() -- Allocates and initializes for a given method and target
   // get()       -- Returns a handle to the object.
   //                This should not be called before "construct()"
   //                for a given Method.
   // 
-  static MachineCodeForMethod& construct(const Function *method,
-                                         const TargetMachine &target);
+  static MachineFunction& construct(const Function *F, const TargetMachine &TM);
   static void destruct(const Function *F);
-  static MachineCodeForMethod& get(const Function* function);
-  
-  //
-  // Accessors for global information about generated code for a method.
-  // 
-  inline bool     isCompiledAsLeafMethod() const { return compiledAsLeaf; }
-  inline unsigned getStaticStackSize()     const { return staticStackSize; }
-  inline unsigned getAutomaticVarsSize()   const { return automaticVarsSize; }
-  inline unsigned getRegSpillsSize()       const { return regSpillsSize; }
-  inline unsigned getMaxOptionalArgsSize() const { return maxOptionalArgsSize;}
-  inline unsigned getCurrentOptionalArgsSize() const
-                                             { return currentOptionalArgsSize;}
-  inline const std::hash_set<const Constant*>&
-                  getConstantPoolValues() const {return constantsForConstPool;}
-  
+  static MachineFunction& get(const Function *F);
+
+  // Provide accessors for the MachineBasicBlock list...
+  typedef iplist<MachineBasicBlock> BasicBlockListType;
+  typedef BasicBlockListType::iterator iterator;
+  typedef BasicBlockListType::const_iterator const_iterator;
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef std::reverse_iterator<iterator>             reverse_iterator;
+
+  // Provide accessors for basic blocks...
+  const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
+        BasicBlockListType &getBasicBlockList()       { return BasicBlocks; }
+  //===--------------------------------------------------------------------===//
+  // BasicBlock iterator forwarding functions
   //
-  // Modifiers used during code generation
-  // 
-  void            initializeFrameLayout    (const TargetMachine& target);
-  
-  void            addToConstantPool        (const Constant* constVal)
-                                    { constantsForConstPool.insert(constVal); }
-  
-  inline void     markAsLeafMethod()              { compiledAsLeaf = true; }
-  
-  int             computeOffsetforLocalVar (const TargetMachine& target,
-                                            const Value* local,
-                                            unsigned int& getPaddedSize,
-                                            unsigned int  sizeToUse = 0);
-  
-  int             allocateLocalVar         (const TargetMachine& target,
-                                            const Value* local,
-                                            unsigned int sizeToUse = 0);
-  
-  int             allocateSpilledValue     (const TargetMachine& target,
-                                            const Type* type);
-  
-  int             allocateOptionalArg      (const TargetMachine& target,
-                                            const Type* type);
-  
-  void            resetOptionalArgs        (const TargetMachine& target);
-  
-  int             pushTempValue            (const TargetMachine& target,
-                                            unsigned int size);
-  
-  void            popAllTempValues         (const TargetMachine& target);
-  
-  int             getOffset                (const Value* val) const;
-  
-  // int          getOffsetFromFP       (const Value* val) const;
-  
-  void            dump                     () const;
-
-private:
-  inline void     incrementAutomaticVarsSize(int incr) {
-    automaticVarsSize+= incr;
-    staticStackSize += incr;
-  }
-  inline void     incrementRegSpillsSize(int incr) {
-    regSpillsSize+= incr;
-    staticStackSize += incr;
-  }
-  inline void     incrementTmpAreaSize(int incr) {
-    currentTmpValuesSize += incr;
-    if (maxTmpValuesSize < currentTmpValuesSize)
-      {
-        staticStackSize += currentTmpValuesSize - maxTmpValuesSize;
-        maxTmpValuesSize = currentTmpValuesSize;
-      }
-  }
-  inline void     resetTmpAreaSize() {
-    currentTmpValuesSize = 0;
-  }
-  inline void     incrementCurrentOptionalArgsSize(int incr) {
-    currentOptionalArgsSize+= incr;     // stack size already includes this!
-  }
+  iterator                 begin()       { return BasicBlocks.begin(); }
+  const_iterator           begin() const { return BasicBlocks.begin(); }
+  iterator                 end  ()       { return BasicBlocks.end();   }
+  const_iterator           end  () const { return BasicBlocks.end();   }
+
+  reverse_iterator        rbegin()       { return BasicBlocks.rbegin(); }
+  const_reverse_iterator  rbegin() const { return BasicBlocks.rbegin(); }
+  reverse_iterator        rend  ()       { return BasicBlocks.rend();   }
+  const_reverse_iterator  rend  () const { return BasicBlocks.rend();   }
+
+  unsigned                  size() const { return BasicBlocks.size(); }
+  bool                     empty() const { return BasicBlocks.empty(); }
+  const MachineBasicBlock &front() const { return BasicBlocks.front(); }
+        MachineBasicBlock &front()       { return BasicBlocks.front(); }
+  const MachineBasicBlock & back() const { return BasicBlocks.back(); }
+        MachineBasicBlock & back()       { return BasicBlocks.back(); }
 };
 
+} // End llvm namespace
+
 #endif