MachineBasicBlock.h revision 506676de323b7ef16050ac6eb01712986234539d
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 17class MachineBasicBlock : public Annotation { 18 std::vector<MachineInstr*> Insts; 19public: 20 MachineBasicBlock() : Annotation(MCFBB_AID) {} 21 ~MachineBasicBlock() {} 22 23 // Static methods to retrieve or destroy the MachineBasicBlock 24 // object for a given basic block. 25 static MachineBasicBlock& get(const BasicBlock *BB) { 26 return *(MachineBasicBlock*) 27 ((Annotable*)BB)->getOrCreateAnnotation(MCFBB_AID); 28 } 29 30 static void destroy(const BasicBlock *BB) { 31 ((Annotable*)BB)->deleteAnnotation(MCFBB_AID); 32 } 33 34 typedef std::vector<MachineInstr*>::iterator iterator; 35 typedef std::vector<MachineInstr*>::const_iterator const_iterator; 36 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 37 typedef std::reverse_iterator<iterator> reverse_iterator; 38 39 unsigned size() const { return Insts.size(); } 40 bool empty() const { return Insts.empty(); } 41 42 MachineInstr * operator[](unsigned i) const { return Insts[i]; } 43 MachineInstr *&operator[](unsigned i) { return Insts[i]; } 44 45 MachineInstr *front() const { return Insts.front(); } 46 MachineInstr *back() const { return Insts.back(); } 47 48 iterator begin() { return Insts.begin(); } 49 const_iterator begin() const { return Insts.begin(); } 50 iterator end() { return Insts.end(); } 51 const_iterator end() const { return Insts.end(); } 52 reverse_iterator rbegin() { return Insts.rbegin(); } 53 const_reverse_iterator rbegin() const { return Insts.rbegin(); } 54 reverse_iterator rend () { return Insts.rend(); } 55 const_reverse_iterator rend () const { return Insts.rend(); } 56 57 void push_back(MachineInstr *MI) { Insts.push_back(MI); } 58 template<typename IT> 59 void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); } 60 iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); } 61 62 // erase - Remove the specified element or range from the instruction list. 63 // These functions do not delete any instructions removed. 64 // 65 iterator erase(iterator I) { return Insts.erase(I); } 66 iterator erase(iterator I, iterator E) { return Insts.erase(I, E); } 67 68 MachineInstr *pop_back() { 69 MachineInstr *R = back(); 70 Insts.pop_back(); 71 return R; 72 } 73}; 74 75 76#endif 77