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