MachineBasicBlock.h revision fce1143bcfa73f61845002fa50473d1a01384202
1fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman//===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*--=//
2deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve//
3e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner// Collect the sequence of machine instructions for a basic block.
4e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner//
5deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve//===---------------------------------------------------------------------===//
6deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
7fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
8fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#define LLVM_CODEGEN_MACHINEBASICBLOCK_H
9deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
10deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve#include "llvm/BasicBlock.h"
11deb9654056939a12981446f6ed1139dca3412746Vikram S. Adveclass MachineInstr;
12deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
13deb9654056939a12981446f6ed1139dca3412746Vikram S. Adveextern AnnotationID MCFBB_AID;
14deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
15fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman// FIXME: this should go away soon
16fce1143bcfa73f61845002fa50473d1a01384202Misha Brukmanclass MachineBasicBlock;
17fce1143bcfa73f61845002fa50473d1a01384202Misha Brukmantypedef MachineBasicBlock MachineCodeForBasicBlock;
18fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman
19fce1143bcfa73f61845002fa50473d1a01384202Misha Brukmanclass MachineBasicBlock: public Annotation {
20deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  std::vector<MachineInstr*> Insts;
21deb9654056939a12981446f6ed1139dca3412746Vikram S. Advepublic:
22fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman  MachineBasicBlock();
23fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman  ~MachineBasicBlock() {}
24deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
25fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman  // Static methods to retrieve or destroy the MachineBasicBlock
26deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  // object for a given basic block.
27fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman  static MachineBasicBlock& get(const BasicBlock *bb) {
28fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman    return *(MachineBasicBlock*)bb->getOrCreateAnnotation(MCFBB_AID);
29deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  }
30deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
31deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  static void destroy(const BasicBlock *bb) {
32deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    bb->deleteAnnotation(MCFBB_AID);
33deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  }
34deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
35deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::vector<MachineInstr*>::iterator                iterator;
36deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::vector<MachineInstr*>::const_iterator    const_iterator;
37deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
38deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  typedef std::reverse_iterator<iterator>             reverse_iterator;
39deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
40deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  unsigned size() const { return Insts.size(); }
41deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  bool empty() const { return Insts.empty(); }
42deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
43deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr * operator[](unsigned i) const { return Insts[i]; }
44deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *&operator[](unsigned i)       { return Insts[i]; }
45deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
46deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *front() const { return Insts.front(); }
47deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *back()  const { return Insts.back(); }
48deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
49deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator                begin()       { return Insts.begin();  }
50deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_iterator          begin() const { return Insts.begin();  }
51deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator                  end()       { return Insts.end();    }
52deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_iterator            end() const { return Insts.end();    }
53deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  reverse_iterator       rbegin()       { return Insts.rbegin(); }
54deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_reverse_iterator rbegin() const { return Insts.rbegin(); }
55deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  reverse_iterator       rend  ()       { return Insts.rend();   }
56deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  const_reverse_iterator rend  () const { return Insts.rend();   }
57deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
58deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  void push_back(MachineInstr *MI) { Insts.push_back(MI); }
59deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  template<typename IT>
60deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); }
61deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); }
62deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
6346d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  // erase - Remove the specified element or range from the instruction list.
6446d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  // These functions do not delete any instructions removed.
65deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  //
6646d6a1aeb549a2e4ccd982a1a2cefda541d79c52Vikram S. Adve  iterator erase(iterator I)             { return Insts.erase(I); }
67deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  iterator erase(iterator I, iterator E) { return Insts.erase(I, E); }
68deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
69deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  MachineInstr *pop_back() {
70deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    MachineInstr *R = back();
71deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    Insts.pop_back();
72deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve    return R;
73deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  }
74deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve};
75deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
76deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
77deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve#endif
78