ClearBlue
SEGArgumentNode.h
1 /*
2  * SEGArgumentNode.h
3  *
4  * Qingkai
5  *
6  * This node is to model arguments of a function.
7  */
8 
9 #ifndef IR_SEG_SEGARGUMENTNODE_H
10 #define IR_SEG_SEGARGUMENTNODE_H
11 
12 #include <llvm/IR/BasicBlock.h>
13 
14 #include "CBAccessPath.h"
15 #include "IR/SEG/SymbolicExprGraph.h"
16 using namespace llvm;
17 
19 protected:
20  SEGArgumentNode(SEGObjectKind NTy, Type *Ty, SymbolicExprGraph *SEG,
21  BasicBlock *BB, bool fromDisk)
22  : SEGOperandNode(NTy, Ty, SEG, BB, fromDisk) {}
23 
24  SEGArgumentNode(SEGObjectKind NTy, Value *Val, Type *Ty,
25  SymbolicExprGraph *SEG, BasicBlock *BB, bool fromDisk)
26  : SEGOperandNode(NTy, Val, Ty, SEG, BB, fromDisk) {}
27 
28  ~SEGArgumentNode() {}
29 
30  friend class SymbolicExprGraph;
31 
32 public:
33  virtual int64_t getIndex() const = 0;
34 
35 public:
36  static bool classof(const SEGObject *N) {
37  return N->getKind() >= SEGOBJK_ArgumentBegin &&
38  N->getKind() <= SEGOBJK_ArgumentEnd;
39  }
40 };
41 
43 private:
44  // The index is set by SEG
45  int64_t Index = -1;
46 
47  SEGCommonArgumentNode(Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB,
48  bool fromDisk)
49  : SEGArgumentNode(SEGOBJK_CommonArgument, Ty, SEG, BB, fromDisk) {
50  if (fromDisk) {
51  return;
52  }
53  std::string Desc(std::string("carg_") + this->getDescription());
54  this->setDescription(Desc);
55  }
56 
57  SEGCommonArgumentNode(Value *Val, Type *Ty, SymbolicExprGraph *SEG,
58  BasicBlock *BB, bool fromDisk)
59  : SEGArgumentNode(SEGOBJK_CommonArgument, Val, Ty, SEG, BB, fromDisk) {
60  if (fromDisk) {
61  return;
62  }
63  std::string Desc(std::string("carg_") + this->getDescription());
64  this->setDescription(Desc);
65  }
66 
67  friend class SymbolicExprGraph;
68  friend class SEGSerializer;
69  friend class SEGHash;
70 
71 public:
72  virtual ~SEGCommonArgumentNode() {}
73 
74  virtual int64_t getIndex() const {
75  assert(Index != (int64_t)-1 && "Index of a common argument is not set!");
76  return Index;
77  }
78 
79  virtual std::string getAuxiliaryDebugStr() const {
80  return "the index of this common argument is " + std::to_string(Index);
81  }
82 
83 public:
84  static bool classof(const SEGObject *N) {
85  return N->getKind() == SEGOBJK_CommonArgument;
86  }
87 };
88 
90 private:
91  SEGVarArgumentNode(Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB,
92  bool fromDisk)
93  : SEGArgumentNode(SEGOBJK_VarArgument, Ty, SEG, BB, fromDisk) {
94  std::string Desc(std::string("varg_") + this->getDescription());
95  this->setDescription(Desc);
96  }
97 
98  SEGVarArgumentNode(Value *Val, Type *Ty, SymbolicExprGraph *SEG,
99  BasicBlock *BB, bool fromDisk)
100  : SEGArgumentNode(SEGOBJK_VarArgument, Val, Ty, SEG, BB, fromDisk) {
101  std::string Desc(std::string("varg_") + this->getDescription());
102  this->setDescription(Desc);
103  }
104 
105  friend class SymbolicExprGraph;
106 
107 public:
108  ~SEGVarArgumentNode() {}
109 
110  virtual int64_t getIndex() const {
111  assert(false);
112  return -1;
113  }
114 
115 public:
116  static bool classof(const SEGObject *N) {
117  return N->getKind() == SEGOBJK_VarArgument;
118  }
119 };
120 
122 private:
123  int64_t Index = -1;
124 
125  CBAccessPath AP;
126 
127  SEGPseudoArgumentNode(Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB,
128  bool fromDisk)
129  : SEGArgumentNode(SEGOBJK_PseudoArgument, Ty, SEG, BB, fromDisk) {
130  std::string Desc(std::string("parg_") + this->getDescription());
131  this->setDescription(Desc);
132  }
133 
134  SEGPseudoArgumentNode(Value *Val, Type *Ty, SymbolicExprGraph *SEG,
135  BasicBlock *BB, bool fromDisk)
136  : SEGArgumentNode(SEGOBJK_PseudoArgument, Val, Ty, SEG, BB, fromDisk) {
137  std::string Desc(std::string("parg_") + this->getDescription());
138  this->setDescription(Desc);
139  }
140 
141  friend class SymbolicExprGraph;
142  friend class SEGSerializer;
143  friend class SEGHash;
144 
145 public:
147 
148  virtual int64_t getIndex() const {
149  assert(Index != (int64_t)-1 && "Index of a pseudo argument is not set!");
150  return Index;
151  }
152 
153 public:
154  static bool classof(const SEGObject *N) {
155  return N->getKind() == SEGOBJK_PseudoArgument;
156  }
157 
158  CBAccessPath &getAccessPath() { return AP; }
159 
160  const CBAccessPath &getAccessPath() const { return AP; }
161 };
162 
163 #endif
SEGVarArgumentNode
Definition: SEGArgumentNode.h:89
SEGOperandNode
Definition: SymbolicExprGraph.h:456
SEGPseudoArgumentNode
Definition: SEGArgumentNode.h:121
SEGCommonArgumentNode
Definition: SEGArgumentNode.h:42
SymbolicExprGraph
Definition: SymbolicExprGraph.h:708
SEGArgumentNode
Definition: SEGArgumentNode.h:18
SEGObject
Definition: SymbolicExprGraph.h:76
CBAccessPath
Definition: CBAccessPath.h:22