- Treat a live range defined by an implicit_def as a zero-sized one.
[oota-llvm.git] / include / llvm / CodeGen / MachineFunction.h
1 //===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Collect native machine code for a function.  This class contains a list of
11 // MachineBasicBlock instances that make up the current compiled function.
12 //
13 // This class also contains pointers to various classes which hold
14 // target-specific information about the generated code.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
19 #define LLVM_CODEGEN_MACHINEFUNCTION_H
20
21 #include "llvm/CodeGen/MachineBasicBlock.h"
22 #include "llvm/Support/Annotation.h"
23
24 namespace llvm {
25
26 class Function;
27 class TargetMachine;
28 class MachineRegisterInfo;
29 class MachineFrameInfo;
30 class MachineConstantPool;
31 class MachineJumpTableInfo;
32
33 // ilist_traits
34 template <>
35 struct ilist_traits<MachineBasicBlock> {
36   // this is only set by the MachineFunction owning the ilist
37   friend class MachineFunction;
38   MachineFunction* Parent;
39
40 public:
41   ilist_traits<MachineBasicBlock>() : Parent(0) { }
42
43   static MachineBasicBlock* getPrev(MachineBasicBlock* N) { return N->Prev; }
44   static MachineBasicBlock* getNext(MachineBasicBlock* N) { return N->Next; }
45
46   static const MachineBasicBlock*
47   getPrev(const MachineBasicBlock* N) { return N->Prev; }
48
49   static const MachineBasicBlock*
50   getNext(const MachineBasicBlock* N) { return N->Next; }
51
52   static void setPrev(MachineBasicBlock* N, MachineBasicBlock* prev) {
53     N->Prev = prev;
54   }
55   static void setNext(MachineBasicBlock* N, MachineBasicBlock* next) {
56     N->Next = next;
57   }
58
59   static MachineBasicBlock* createSentinel();
60   static void destroySentinel(MachineBasicBlock *MBB) { delete MBB; }
61   void addNodeToList(MachineBasicBlock* N);
62   void removeNodeFromList(MachineBasicBlock* N);
63   void transferNodesFromList(iplist<MachineBasicBlock,
64                                     ilist_traits<MachineBasicBlock> > &toList,
65                              ilist_iterator<MachineBasicBlock> first,
66                              ilist_iterator<MachineBasicBlock> last);
67 };
68
69 /// MachineFunctionInfo - This class can be derived from and used by targets to
70 /// hold private target-specific information for each MachineFunction.  Objects
71 /// of type are accessed/created with MF::getInfo and destroyed when the
72 /// MachineFunction is destroyed.
73 struct MachineFunctionInfo {
74   virtual ~MachineFunctionInfo() {}
75 };
76
77 class MachineFunction : private Annotation {
78   const Function *Fn;
79   const TargetMachine &Target;
80
81   // List of machine basic blocks in function
82   ilist<MachineBasicBlock> BasicBlocks;
83
84   // RegInfo - Information about each register in use in the function.
85   MachineRegisterInfo *RegInfo;
86
87   // Used to keep track of target-specific per-machine function information for
88   // the target implementation.
89   MachineFunctionInfo *MFInfo;
90
91   // Keep track of objects allocated on the stack.
92   MachineFrameInfo *FrameInfo;
93
94   // Keep track of constants which are spilled to memory
95   MachineConstantPool *ConstantPool;
96   
97   // Keep track of jump tables for switch instructions
98   MachineJumpTableInfo *JumpTableInfo;
99
100   // Function-level unique numbering for MachineBasicBlocks.  When a
101   // MachineBasicBlock is inserted into a MachineFunction is it automatically
102   // numbered and this vector keeps track of the mapping from ID's to MBB's.
103   std::vector<MachineBasicBlock*> MBBNumbering;
104
105 public:
106   MachineFunction(const Function *Fn, const TargetMachine &TM);
107   ~MachineFunction();
108
109   /// getFunction - Return the LLVM function that this machine code represents
110   ///
111   const Function *getFunction() const { return Fn; }
112
113   /// getTarget - Return the target machine this machine code is compiled with
114   ///
115   const TargetMachine &getTarget() const { return Target; }
116
117   /// getRegInfo - Return information about the registers currently in use.
118   ///
119   MachineRegisterInfo &getRegInfo() const { return *RegInfo; }
120
121   /// getFrameInfo - Return the frame info object for the current function.
122   /// This object contains information about objects allocated on the stack
123   /// frame of the current function in an abstract way.
124   ///
125   MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
126
127   /// getJumpTableInfo - Return the jump table info object for the current 
128   /// function.  This object contains information about jump tables for switch
129   /// instructions in the current function.
130   ///
131   MachineJumpTableInfo *getJumpTableInfo() const { return JumpTableInfo; }
132   
133   /// getConstantPool - Return the constant pool object for the current
134   /// function.
135   ///
136   MachineConstantPool *getConstantPool() const { return ConstantPool; }
137
138   /// MachineFunctionInfo - Keep track of various per-function pieces of
139   /// information for backends that would like to do so.
140   ///
141   template<typename Ty>
142   Ty *getInfo() {
143     if (!MFInfo) MFInfo = new Ty(*this);
144
145     assert((void*)dynamic_cast<Ty*>(MFInfo) == (void*)MFInfo &&
146            "Invalid concrete type or multiple inheritence for getInfo");
147     return static_cast<Ty*>(MFInfo);
148   }
149
150   template<typename Ty>
151   const Ty *getInfo() const {
152      return const_cast<MachineFunction*>(this)->getInfo<Ty>();
153   }
154
155   /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they
156   /// are inserted into the machine function.  The block number for a machine
157   /// basic block can be found by using the MBB::getBlockNumber method, this
158   /// method provides the inverse mapping.
159   ///
160   MachineBasicBlock *getBlockNumbered(unsigned N) {
161     assert(N < MBBNumbering.size() && "Illegal block number");
162     assert(MBBNumbering[N] && "Block was removed from the machine function!");
163     return MBBNumbering[N];
164   }
165
166   /// getNumBlockIDs - Return the number of MBB ID's allocated.
167   ///
168   unsigned getNumBlockIDs() const { return MBBNumbering.size(); }
169   
170   /// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
171   /// recomputes them.  This guarantees that the MBB numbers are sequential,
172   /// dense, and match the ordering of the blocks within the function.  If a
173   /// specific MachineBasicBlock is specified, only that block and those after
174   /// it are renumbered.
175   void RenumberBlocks(MachineBasicBlock *MBBFrom = 0);
176   
177   /// print - Print out the MachineFunction in a format suitable for debugging
178   /// to the specified stream.
179   ///
180   void print(std::ostream &OS) const;
181   void print(std::ostream *OS) const { if (OS) print(*OS); }
182
183   /// viewCFG - This function is meant for use from the debugger.  You can just
184   /// say 'call F->viewCFG()' and a ghostview window should pop up from the
185   /// program, displaying the CFG of the current function with the code for each
186   /// basic block inside.  This depends on there being a 'dot' and 'gv' program
187   /// in your path.
188   ///
189   void viewCFG() const;
190
191   /// viewCFGOnly - This function is meant for use from the debugger.  It works
192   /// just like viewCFG, but it does not include the contents of basic blocks
193   /// into the nodes, just the label.  If you are only interested in the CFG
194   /// this can make the graph smaller.
195   ///
196   void viewCFGOnly() const;
197
198   /// dump - Print the current MachineFunction to cerr, useful for debugger use.
199   ///
200   void dump() const;
201
202   /// construct - Allocate and initialize a MachineFunction for a given Function
203   /// and Target
204   ///
205   static MachineFunction& construct(const Function *F, const TargetMachine &TM);
206
207   /// destruct - Destroy the MachineFunction corresponding to a given Function
208   ///
209   static void destruct(const Function *F);
210
211   /// get - Return a handle to a MachineFunction corresponding to the given
212   /// Function.  This should not be called before "construct()" for a given
213   /// Function.
214   ///
215   static MachineFunction& get(const Function *F);
216
217   // Provide accessors for the MachineBasicBlock list...
218   typedef ilist<MachineBasicBlock> BasicBlockListType;
219   typedef BasicBlockListType::iterator iterator;
220   typedef BasicBlockListType::const_iterator const_iterator;
221   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
222   typedef std::reverse_iterator<iterator>             reverse_iterator;
223
224   // Provide accessors for basic blocks...
225   const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
226         BasicBlockListType &getBasicBlockList()       { return BasicBlocks; }
227
228   //===--------------------------------------------------------------------===//
229   // BasicBlock iterator forwarding functions
230   //
231   iterator                 begin()       { return BasicBlocks.begin(); }
232   const_iterator           begin() const { return BasicBlocks.begin(); }
233   iterator                 end  ()       { return BasicBlocks.end();   }
234   const_iterator           end  () const { return BasicBlocks.end();   }
235
236   reverse_iterator        rbegin()       { return BasicBlocks.rbegin(); }
237   const_reverse_iterator  rbegin() const { return BasicBlocks.rbegin(); }
238   reverse_iterator        rend  ()       { return BasicBlocks.rend();   }
239   const_reverse_iterator  rend  () const { return BasicBlocks.rend();   }
240
241   unsigned                  size() const { return BasicBlocks.size(); }
242   bool                     empty() const { return BasicBlocks.empty(); }
243   const MachineBasicBlock &front() const { return BasicBlocks.front(); }
244         MachineBasicBlock &front()       { return BasicBlocks.front(); }
245   const MachineBasicBlock & back() const { return BasicBlocks.back(); }
246         MachineBasicBlock & back()       { return BasicBlocks.back(); }
247
248   //===--------------------------------------------------------------------===//
249   // Internal functions used to automatically number MachineBasicBlocks
250   //
251
252   /// getNextMBBNumber - Returns the next unique number to be assigned
253   /// to a MachineBasicBlock in this MachineFunction.
254   ///
255   unsigned addToMBBNumbering(MachineBasicBlock *MBB) {
256     MBBNumbering.push_back(MBB);
257     return MBBNumbering.size()-1;
258   }
259
260   /// removeFromMBBNumbering - Remove the specific machine basic block from our
261   /// tracker, this is only really to be used by the MachineBasicBlock
262   /// implementation.
263   void removeFromMBBNumbering(unsigned N) {
264     assert(N < MBBNumbering.size() && "Illegal basic block #");
265     MBBNumbering[N] = 0;
266   }
267 };
268
269 //===--------------------------------------------------------------------===//
270 // GraphTraits specializations for function basic block graphs (CFGs)
271 //===--------------------------------------------------------------------===//
272
273 // Provide specializations of GraphTraits to be able to treat a
274 // machine function as a graph of machine basic blocks... these are
275 // the same as the machine basic block iterators, except that the root
276 // node is implicitly the first node of the function.
277 //
278 template <> struct GraphTraits<MachineFunction*> :
279   public GraphTraits<MachineBasicBlock*> {
280   static NodeType *getEntryNode(MachineFunction *F) {
281     return &F->front();
282   }
283
284   // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
285   typedef MachineFunction::iterator nodes_iterator;
286   static nodes_iterator nodes_begin(MachineFunction *F) { return F->begin(); }
287   static nodes_iterator nodes_end  (MachineFunction *F) { return F->end(); }
288 };
289 template <> struct GraphTraits<const MachineFunction*> :
290   public GraphTraits<const MachineBasicBlock*> {
291   static NodeType *getEntryNode(const MachineFunction *F) {
292     return &F->front();
293   }
294
295   // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
296   typedef MachineFunction::const_iterator nodes_iterator;
297   static nodes_iterator nodes_begin(const MachineFunction *F) { return F->begin(); }
298   static nodes_iterator nodes_end  (const MachineFunction *F) { return F->end(); }
299 };
300
301
302 // Provide specializations of GraphTraits to be able to treat a function as a
303 // graph of basic blocks... and to walk it in inverse order.  Inverse order for
304 // a function is considered to be when traversing the predecessor edges of a BB
305 // instead of the successor edges.
306 //
307 template <> struct GraphTraits<Inverse<MachineFunction*> > :
308   public GraphTraits<Inverse<MachineBasicBlock*> > {
309   static NodeType *getEntryNode(Inverse<MachineFunction*> G) {
310     return &G.Graph->front();
311   }
312 };
313 template <> struct GraphTraits<Inverse<const MachineFunction*> > :
314   public GraphTraits<Inverse<const MachineBasicBlock*> > {
315   static NodeType *getEntryNode(Inverse<const MachineFunction *> G) {
316     return &G.Graph->front();
317   }
318 };
319
320 } // End llvm namespace
321
322 #endif