2904cf1ccf1b5244248480da01716d0325076d68
[oota-llvm.git] / include / llvm / CodeGen / MachineBasicBlock.h
1 //===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===//
2 // 
3 // Collect the sequence of machine instructions for a basic block.
4 //
5 //===----------------------------------------------------------------------===//
6
7 #ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
8 #define LLVM_CODEGEN_MACHINEBASICBLOCK_H
9
10 #include "llvm/Annotation.h"
11 #include <vector>
12 class BasicBlock;
13 class MachineInstr;
14
15 extern AnnotationID MCFBB_AID;
16
17 // FIXME: this should go away soon
18 class MachineBasicBlock;
19 typedef MachineBasicBlock MachineCodeForBasicBlock;
20
21 class MachineBasicBlock : public Annotation {
22   std::vector<MachineInstr*> Insts;
23 public:
24   MachineBasicBlock() : Annotation(MCFBB_AID) {}
25   ~MachineBasicBlock() {}
26   
27   // Static methods to retrieve or destroy the MachineBasicBlock
28   // object for a given basic block.
29   static MachineBasicBlock& get(const BasicBlock *BB) {
30     return *(MachineBasicBlock*)
31       ((Annotable*)BB)->getOrCreateAnnotation(MCFBB_AID);
32   }
33   
34   static void destroy(const BasicBlock *BB) {
35     ((Annotable*)BB)->deleteAnnotation(MCFBB_AID);
36   }
37   
38   typedef std::vector<MachineInstr*>::iterator                iterator;
39   typedef std::vector<MachineInstr*>::const_iterator    const_iterator;
40   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
41   typedef std::reverse_iterator<iterator>             reverse_iterator;
42
43   unsigned size() const { return Insts.size(); }
44   bool empty() const { return Insts.empty(); }
45
46   MachineInstr * operator[](unsigned i) const { return Insts[i]; }
47   MachineInstr *&operator[](unsigned i)       { return Insts[i]; }
48
49   MachineInstr *front() const { return Insts.front(); }
50   MachineInstr *back()  const { return Insts.back(); }
51
52   iterator                begin()       { return Insts.begin();  }
53   const_iterator          begin() const { return Insts.begin();  }
54   iterator                  end()       { return Insts.end();    }
55   const_iterator            end() const { return Insts.end();    }
56   reverse_iterator       rbegin()       { return Insts.rbegin(); }
57   const_reverse_iterator rbegin() const { return Insts.rbegin(); }
58   reverse_iterator       rend  ()       { return Insts.rend();   }
59   const_reverse_iterator rend  () const { return Insts.rend();   }
60
61   void push_back(MachineInstr *MI) { Insts.push_back(MI); }
62   template<typename IT>
63   void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); }
64   iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); }
65
66   // erase - Remove the specified element or range from the instruction list.
67   // These functions do not delete any instructions removed.
68   //
69   iterator erase(iterator I)             { return Insts.erase(I); }
70   iterator erase(iterator I, iterator E) { return Insts.erase(I, E); }
71
72   MachineInstr *pop_back() {
73     MachineInstr *R = back();
74     Insts.pop_back();
75     return R;
76   }
77 };
78
79
80 #endif