MachineBasicBlock.h revision d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68
151a8d8528135ba4e3e4cf7cd711a9e47b19078a3Chris Lattner//===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===//
2deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve//
3e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner// Collect the sequence of machine instructions for a basic block.
4e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner//
551a8d8528135ba4e3e4cf7cd711a9e47b19078a3Chris Lattner//===----------------------------------------------------------------------===//
6deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
7fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
8fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#define LLVM_CODEGEN_MACHINEBASICBLOCK_H
9deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
10aec11f1decda111112c39803cb89dace81cd0568Chris Lattner#include <vector>
11aec11f1decda111112c39803cb89dace81cd0568Chris Lattnerclass BasicBlock;
12deb9654056939a12981446f6ed1139dca3412746Vikram S. Adveclass MachineInstr;
138e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattnertemplate <typename T> struct ilist_traits;
14deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
15d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattnerclass MachineBasicBlock {
16deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  std::vector<MachineInstr*> Insts;
178e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  MachineBasicBlock *Prev, *Next;
18d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  BasicBlock *BB;
19deb9654056939a12981446f6ed1139dca3412746Vikram S. Advepublic:
20d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  MachineBasicBlock(BasicBlock *bb = 0) : Prev(0), Next(0), BB(bb) {}
21fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman  ~MachineBasicBlock() {}
22deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
23d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // get - This deprecated static method returns the MachineBasicBlock object
24d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // for the specified BasicBlock.
25d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //
26d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  static MachineBasicBlock& get(const BasicBlock *BB);
27d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
28d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  /// getBasicBlock - Return the LLVM basic block that this instance
29d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  /// corresponded to originally.
30d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  ///
31d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  BasicBlock *getBasicBlock() const { return BB; }
32deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
33deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::vector<MachineInstr*>::iterator                iterator;
34deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::vector<MachineInstr*>::const_iterator    const_iterator;
35deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
36deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::reverse_iterator<iterator>             reverse_iterator;
37deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
38deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  unsigned size() const { return Insts.size(); }
39deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  bool empty() const { return Insts.empty(); }
40deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
41deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr * operator[](unsigned i) const { return Insts[i]; }
42deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *&operator[](unsigned i)       { return Insts[i]; }
43deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
44deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *front() const { return Insts.front(); }
45deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *back()  const { return Insts.back(); }
46deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
47deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator                begin()       { return Insts.begin();  }
48deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_iterator          begin() const { return Insts.begin();  }
49deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator                  end()       { return Insts.end();    }
50deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_iterator            end() const { return Insts.end();    }
51deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  reverse_iterator       rbegin()       { return Insts.rbegin(); }
52deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_reverse_iterator rbegin() const { return Insts.rbegin(); }
53deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  reverse_iterator       rend  ()       { return Insts.rend();   }
54deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_reverse_iterator rend  () const { return Insts.rend();   }
55deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
56deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  void push_back(MachineInstr *MI) { Insts.push_back(MI); }
57deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  template<typename IT>
58deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); }
59deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); }
60deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
6146d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  // erase - Remove the specified element or range from the instruction list.
6246d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  // These functions do not delete any instructions removed.
63deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  //
6446d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  iterator erase(iterator I)             { return Insts.erase(I); }
65deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator erase(iterator I, iterator E) { return Insts.erase(I, E); }
66deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
67deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *pop_back() {
68deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    MachineInstr *R = back();
69deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    Insts.pop_back();
70deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    return R;
71deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  }
728e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner
738e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattnerprivate:   // Methods used to maintain doubly linked list of blocks...
748e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  friend class ilist_traits<MachineBasicBlock>;
758e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner
768e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  MachineBasicBlock *getPrev() const { return Prev; }
778e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  MachineBasicBlock *getNext() const { return Next; }
788e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  void setPrev(MachineBasicBlock *P) { Prev = P; }
798e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  void setNext(MachineBasicBlock *N) { Next = N; }
80deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve};
81deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
82deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
83deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve#endif
84