File indexing completed on 2026-05-10 08:43:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_ANALYSIS_TRACE_H
0018 #define LLVM_ANALYSIS_TRACE_H
0019
0020 #include <cassert>
0021 #include <vector>
0022
0023 namespace llvm {
0024
0025 class BasicBlock;
0026 class Function;
0027 class Module;
0028 class raw_ostream;
0029
0030 class Trace {
0031 using BasicBlockListType = std::vector<BasicBlock *>;
0032
0033 BasicBlockListType BasicBlocks;
0034
0035 public:
0036
0037
0038
0039 Trace(const std::vector<BasicBlock *> &vBB) : BasicBlocks (vBB) {}
0040
0041
0042
0043 BasicBlock *getEntryBasicBlock () const { return BasicBlocks[0]; }
0044
0045
0046 BasicBlock *operator[](unsigned i) const { return BasicBlocks[i]; }
0047 BasicBlock *getBlock(unsigned i) const { return BasicBlocks[i]; }
0048
0049
0050 Function *getFunction () const;
0051
0052
0053
0054 Module *getModule () const;
0055
0056
0057
0058 int getBlockIndex(const BasicBlock *X) const {
0059 for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
0060 if (BasicBlocks[i] == X)
0061 return i;
0062 return -1;
0063 }
0064
0065
0066
0067 bool contains(const BasicBlock *X) const {
0068 return getBlockIndex(X) != -1;
0069 }
0070
0071
0072
0073 bool dominates(const BasicBlock *B1, const BasicBlock *B2) const {
0074 int B1Idx = getBlockIndex(B1), B2Idx = getBlockIndex(B2);
0075 assert(B1Idx != -1 && B2Idx != -1 && "Block is not in the trace!");
0076 return B1Idx <= B2Idx;
0077 }
0078
0079
0080 using iterator = BasicBlockListType::iterator;
0081 using const_iterator = BasicBlockListType::const_iterator;
0082 using reverse_iterator = std::reverse_iterator<iterator>;
0083 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
0084
0085 iterator begin() { return BasicBlocks.begin(); }
0086 const_iterator begin() const { return BasicBlocks.begin(); }
0087 iterator end () { return BasicBlocks.end(); }
0088 const_iterator end () const { return BasicBlocks.end(); }
0089
0090 reverse_iterator rbegin() { return BasicBlocks.rbegin(); }
0091 const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
0092 reverse_iterator rend () { return BasicBlocks.rend(); }
0093 const_reverse_iterator rend () const { return BasicBlocks.rend(); }
0094
0095 unsigned size() const { return BasicBlocks.size(); }
0096 bool empty() const { return BasicBlocks.empty(); }
0097
0098 iterator erase(iterator q) { return BasicBlocks.erase (q); }
0099 iterator erase(iterator q1, iterator q2) { return BasicBlocks.erase (q1, q2); }
0100
0101
0102 void print(raw_ostream &O) const;
0103
0104
0105
0106 void dump() const;
0107 };
0108
0109 }
0110
0111 #endif