00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef LLVM_ANALYSIS_TRACE_H
00019 #define LLVM_ANALYSIS_TRACE_H
00020
00021 #include <vector>
00022 #include <cassert>
00023
00024 namespace llvm {
00025 class BasicBlock;
00026 class Function;
00027 class Module;
00028 class raw_ostream;
00029
00030 class Trace {
00031 typedef std::vector<BasicBlock *> BasicBlockListType;
00032 BasicBlockListType BasicBlocks;
00033
00034 public:
00039 Trace(const std::vector<BasicBlock *> &vBB) : BasicBlocks (vBB) {}
00040
00044 BasicBlock *getEntryBasicBlock () const { return BasicBlocks[0]; }
00045
00048 BasicBlock *operator[](unsigned i) const { return BasicBlocks[i]; }
00049 BasicBlock *getBlock(unsigned i) const { return BasicBlocks[i]; }
00050
00053 Function *getFunction () const;
00054
00058 Module *getModule () const;
00059
00062 int getBlockIndex(const BasicBlock *X) const {
00063 for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
00064 if (BasicBlocks[i] == X)
00065 return i;
00066 return -1;
00067 }
00068
00072 bool contains(const BasicBlock *X) const {
00073 return getBlockIndex(X) != -1;
00074 }
00075
00079 bool dominates(const BasicBlock *B1, const BasicBlock *B2) const {
00080 int B1Idx = getBlockIndex(B1), B2Idx = getBlockIndex(B2);
00081 assert(B1Idx != -1 && B2Idx != -1 && "Block is not in the trace!");
00082 return B1Idx <= B2Idx;
00083 }
00084
00085
00086 typedef BasicBlockListType::iterator iterator;
00087 typedef BasicBlockListType::const_iterator const_iterator;
00088 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00089 typedef std::reverse_iterator<iterator> reverse_iterator;
00090
00091 iterator begin() { return BasicBlocks.begin(); }
00092 const_iterator begin() const { return BasicBlocks.begin(); }
00093 iterator end () { return BasicBlocks.end(); }
00094 const_iterator end () const { return BasicBlocks.end(); }
00095
00096 reverse_iterator rbegin() { return BasicBlocks.rbegin(); }
00097 const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
00098 reverse_iterator rend () { return BasicBlocks.rend(); }
00099 const_reverse_iterator rend () const { return BasicBlocks.rend(); }
00100
00101 unsigned size() const { return BasicBlocks.size(); }
00102 bool empty() const { return BasicBlocks.empty(); }
00103
00104 iterator erase(iterator q) { return BasicBlocks.erase (q); }
00105 iterator erase(iterator q1, iterator q2) { return BasicBlocks.erase (q1, q2); }
00106
00109 void print(raw_ostream &O) const;
00110
00114 void dump() const;
00115 };
00116
00117 }
00118
00119 #endif // TRACE_H