MachineBasicBlock.h revision c0b9dc5be79f009d260edb5cd5e1d8346587aaa2
1627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert//===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===// 2627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// 3627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// The LLVM Compiler Infrastructure 4627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// 5627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// This file was developed by the LLVM research group and is distributed under 6627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// the University of Illinois Open Source License. See LICENSE.TXT for details. 7627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// 8627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert//===----------------------------------------------------------------------===// 9627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// 10627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// Collect the sequence of machine instructions for a basic block. 11627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert// 12627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert//===----------------------------------------------------------------------===// 13627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 14627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H 15627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert#define LLVM_CODEGEN_MACHINEBASICBLOCK_H 16627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 17627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert#include "llvm/CodeGen/MachineInstr.h" 18627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert#include "Support/ilist" 19627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 20627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringertnamespace llvm { 21627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 22627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringertclass BasicBlock; 23627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 24627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringertclass MachineBasicBlock { 25627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringertpublic: 26627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert typedef ilist<MachineInstr> Instructions; 27627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert Instructions Insts; 28627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert MachineBasicBlock *Prev, *Next; 29627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert const BasicBlock *BB; 30627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringertpublic: 31627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert MachineBasicBlock(const BasicBlock *bb = 0) : Prev(0), Next(0), BB(bb) {} 32627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert ~MachineBasicBlock() {} 33627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 34627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert /// getBasicBlock - Return the LLVM basic block that this instance 35627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert /// corresponded to originally. 36627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert /// 37627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert const BasicBlock *getBasicBlock() const { return BB; } 38627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 39627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert typedef ilist<MachineInstr>::iterator iterator; 40627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert typedef ilist<MachineInstr>::const_iterator const_iterator; 41627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 42627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert typedef std::reverse_iterator<iterator> reverse_iterator; 43627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 44627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert unsigned size() const { return Insts.size(); } 45627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert bool empty() const { return Insts.empty(); } 46627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert 47627dc6e7310bb8f6435b625f86c9f0ceeb3b0920Bjorn Bringert const MachineInstr& operator[](unsigned i) const { 48 const_iterator it = Insts.begin(); 49 std::advance(it, i); 50 return *it; 51 } 52 MachineInstr& operator[](unsigned i) { 53 iterator it = Insts.begin(); 54 std::advance(it, i); 55 return *it; 56 } 57 58 MachineInstr& front() { return Insts.front(); } 59 MachineInstr& back() { return Insts.back(); } 60 61 iterator begin() { return Insts.begin(); } 62 const_iterator begin() const { return Insts.begin(); } 63 iterator end() { return Insts.end(); } 64 const_iterator end() const { return Insts.end(); } 65 reverse_iterator rbegin() { return Insts.rbegin(); } 66 const_reverse_iterator rbegin() const { return Insts.rbegin(); } 67 reverse_iterator rend () { return Insts.rend(); } 68 const_reverse_iterator rend () const { return Insts.rend(); } 69 70 void push_back(MachineInstr *MI) { Insts.push_back(MI); } 71 template<typename IT> 72 void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); } 73 iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); } 74 75 // erase - Remove the specified element or range from the instruction list. 76 // These functions delete any instructions removed. 77 // 78 iterator erase(iterator I) { return Insts.erase(I); } 79 iterator erase(iterator I, iterator E) { return Insts.erase(I, E); } 80 MachineInstr* remove(iterator &I) { return Insts.remove(I); } 81 82private: // Methods used to maintain doubly linked list of blocks... 83 friend class ilist_traits<MachineBasicBlock>; 84 85 MachineBasicBlock *getPrev() const { return Prev; } 86 MachineBasicBlock *getNext() const { return Next; } 87 void setPrev(MachineBasicBlock *P) { Prev = P; } 88 void setNext(MachineBasicBlock *N) { Next = N; } 89}; 90 91} // End llvm namespace 92 93#endif 94