MachineBasicBlock.h revision aec11f1decda111112c39803cb89dace81cd0568
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>
12class BasicBlock;
13class MachineInstr;
14
15extern AnnotationID MCFBB_AID;
16
17// FIXME: this should go away soon
18class MachineBasicBlock;
19typedef MachineBasicBlock MachineCodeForBasicBlock;
20
21class MachineBasicBlock : public Annotation {
22  std::vector<MachineInstr*> Insts;
23public:
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
81