1 //===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===//
3 // Collect the sequence of machine instructions for a basic block.
5 //===----------------------------------------------------------------------===//
7 #ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
8 #define LLVM_CODEGEN_MACHINEBASICBLOCK_H
10 #include "llvm/Annotation.h"
15 extern AnnotationID MCFBB_AID;
17 // FIXME: this should go away soon
18 class MachineBasicBlock;
19 typedef MachineBasicBlock MachineCodeForBasicBlock;
21 class MachineBasicBlock : public Annotation {
22 std::vector<MachineInstr*> Insts;
24 MachineBasicBlock() : Annotation(MCFBB_AID) {}
25 ~MachineBasicBlock() {}
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);
34 static void destroy(const BasicBlock *BB) {
35 ((Annotable*)BB)->deleteAnnotation(MCFBB_AID);
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;
43 unsigned size() const { return Insts.size(); }
44 bool empty() const { return Insts.empty(); }
46 MachineInstr * operator[](unsigned i) const { return Insts[i]; }
47 MachineInstr *&operator[](unsigned i) { return Insts[i]; }
49 MachineInstr *front() const { return Insts.front(); }
50 MachineInstr *back() const { return Insts.back(); }
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(); }
61 void push_back(MachineInstr *MI) { Insts.push_back(MI); }
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); }
66 // erase - Remove the specified element or range from the instruction list.
67 // These functions do not delete any instructions removed.
69 iterator erase(iterator I) { return Insts.erase(I); }
70 iterator erase(iterator I, iterator E) { return Insts.erase(I, E); }
72 MachineInstr *pop_back() {
73 MachineInstr *R = back();