9 #ifndef IR_SEG_SEGPHINODE_H
10 #define IR_SEG_SEGPHINODE_H
12 #include <llvm/IR/BasicBlock.h>
13 #include <llvm/IR/CallSite.h>
14 #include <llvm/IR/Constants.h>
15 #include <llvm/IR/Function.h>
16 #include <llvm/IR/Instructions.h>
17 #include <llvm/IR/Value.h>
18 #include <llvm/Support/FileSystem.h>
19 #include <llvm/Support/Format.h>
20 #include <llvm/Support/raw_ostream.h>
22 #include "IR/LLVMWrapper/ValueWrapper.h"
23 #include "IR/SEG/SymbolicExprGraph.h"
27 class PersistedSEGPhiNode;
37 virtual void assembleSEGObject(std::map<int, SEGObject *> &FuncSEGObjMap);
42 WrappedBasicBlock *BB =
nullptr;
51 std::vector<IncomeNode> InComingNodes;
61 typedef std::vector<IncomeNode>::const_iterator const_iterator;
65 virtual PersistedSEGObject *createPersistedObject()
const;
70 auto *WrappedBB = WrappedValue::findWrappedBasicBlock(BB);
72 Node.ValNode = InValue;
74 Node.InCondNode = condValue;
76 InComingNodes.emplace_back(Node);
82 std::pair<SEGNodeBase *, bool> getInCond(
size_t I) {
83 assert(I < size() &&
"getInCond i should less than the size.");
85 auto &InComingNode = InComingNodes[I];
86 return std::make_pair(InComingNode.InCondNode, InComingNode.Cond);
89 void dot(raw_fd_ostream &O)
const;
92 bool isTerminalNode()
const {
return InComingNodes.empty(); }
94 const_iterator begin()
const {
return InComingNodes.begin(); }
96 const_iterator end()
const {
return InComingNodes.end(); }
98 size_t size()
const {
return InComingNodes.size(); }
100 bool empty()
const {
return InComingNodes.empty(); }
103 static bool classof(
const SEGObject *O) {
104 return O->getKind() == SEGOBJK_Phi;