ClearBlue
SEGPhiNode.h
1 /*
2  * SEGPhiNode.h
3  *
4  * Qingkai
5  *
6  * This node is to model a phi value.
7  */
8 
9 #ifndef IR_SEG_SEGPHINODE_H
10 #define IR_SEG_SEGPHINODE_H
11 
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>
21 
22 #include "IR/LLVMWrapper/ValueWrapper.h"
23 #include "IR/SEG/SymbolicExprGraph.h"
24 
25 using namespace llvm;
26 
27 class PersistedSEGPhiNode;
28 
31 class SEGPhiNode : public SEGOperandNode {
32 public:
35  SEGPhiNode(PersistedSEGPhiNode *Node, SymbolicExprGraph *SEG);
36 
37  virtual void assembleSEGObject(std::map<int, SEGObject *> &FuncSEGObjMap);
38 
39 public:
40  struct IncomeNode {
41  SEGNodeBase *ValNode; // The incoming value
42  WrappedBasicBlock *BB = nullptr; // The incoming basic block.
43  SEGNodeBase *InCondNode; // The condition node on immediate predecessor
44  bool Cond;
45  };
46 
47 private:
51  std::vector<IncomeNode> InComingNodes;
52 
54  friend class SymbolicExprGraph;
55 
58  SEGPhiNode(Value *Val, Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB);
59 
60 public:
61  typedef std::vector<IncomeNode>::const_iterator const_iterator;
62 
63  ~SEGPhiNode() = default;
64 
65  virtual PersistedSEGObject *createPersistedObject() const;
66 
68  void addIncomeValue(SEGNodeBase *InValue, BasicBlock *BB,
69  SEGNodeBase *condValue, bool Cond) {
70  auto *WrappedBB = WrappedValue::findWrappedBasicBlock(BB);
71  struct IncomeNode Node;
72  Node.ValNode = InValue;
73  Node.BB = WrappedBB;
74  Node.InCondNode = condValue;
75  Node.Cond = Cond;
76  InComingNodes.emplace_back(Node);
77  // Also add it to children set.
78  addChild(InValue);
79  }
80 
81  // Get the "IN" condition for a phi "IN".
82  std::pair<SEGNodeBase *, bool> getInCond(size_t I) {
83  assert(I < size() && "getInCond i should less than the size.");
84 
85  auto &InComingNode = InComingNodes[I];
86  return std::make_pair(InComingNode.InCondNode, InComingNode.Cond);
87  }
88 
89  void dot(raw_fd_ostream &O) const;
90 
91  // Override
92  bool isTerminalNode() const { return InComingNodes.empty(); }
93 
94  const_iterator begin() const { return InComingNodes.begin(); }
95 
96  const_iterator end() const { return InComingNodes.end(); }
97 
98  size_t size() const { return InComingNodes.size(); }
99 
100  bool empty() const { return InComingNodes.empty(); }
101 
102 public:
103  static bool classof(const SEGObject *O) {
104  return O->getKind() == SEGOBJK_Phi;
105  }
106 };
107 
108 #endif
SEGPhiNode::IncomeNode
Definition: SEGPhiNode.h:40
SEGOperandNode
Definition: SymbolicExprGraph.h:539
SymbolicExprGraph
Definition: SymbolicExprGraph.h:855
SEGPhiNode::addIncomeValue
void addIncomeValue(SEGNodeBase *InValue, BasicBlock *BB, SEGNodeBase *condValue, bool Cond)
Add a incoming edge during construction.
Definition: SEGPhiNode.h:68
SEGObject
Definition: SymbolicExprGraph.h:87
SEGPhiNode
Definition: SEGPhiNode.h:31
SEGNodeBase
The node base of symbolic expression graph.
Definition: SymbolicExprGraph.h:288