llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
pointer_closure.h
1 // This file if part of the llir-opt project.
2 // Licensing information can be found in the LICENSE file.
3 // (C) 2018 Nandor Licker. All rights reserved.
4 
5 #pragma once
6 
7 #include <set>
8 
9 #include "core/adt/bitset.h"
10 #include "core/adt/hash.h"
11 #include "core/adt/union_find.h"
12 
13 class SymbolicContext;
14 class SymbolicValue;
15 class SymbolicPointer;
16 class SymbolicObject;
17 class SymbolicHeap;
18 class SymbolicFrame;
19 class Func;
20 class Object;
21 class CallSite;
22 
23 
24 
29 public:
33  class Node {
34  public:
38  class node_iterator : public std::iterator
39  < std::forward_iterator_tag
40  , Node *
41  >
42  {
43  public:
45  : graph_(graph)
46  , it_(it)
47  {
48  }
49 
50  bool operator==(const node_iterator &that) const { return it_ == that.it_; }
51  bool operator!=(const node_iterator &that) const { return !(*this == that); }
52 
53  node_iterator &operator++()
54  {
55  ++it_;
56  return *this;
57  }
58 
59  node_iterator operator++(int)
60  {
61  auto tmp = *this;
62  ++*this;
63  return tmp;
64  }
65 
66  Node *operator*() const { return graph_.nodes_.Map(*it_); }
67  Node *operator->() const { return operator*(); }
68 
69  private:
70  PointerClosure &graph_;
72  };
73 
74  public:
75  Node(ID<Node> id, PointerClosure &graph) : id_(id), graph_(graph){}
76 
77  node_iterator nodes_begin() { return node_iterator(graph_, nodes_.begin()); }
78  node_iterator nodes_end() { return node_iterator(graph_, nodes_.end()); }
79 
81  void Union(const Node &that)
82  {
83  nodes_.Union(that.nodes_);
84  self_.Union(that.self_);
85  refs_.Union(that.refs_);
86  stacks_.Union(that.stacks_);
87  funcs_.Union(that.funcs_);
88  }
89 
90  private:
91  friend class PointerClosure;
93  ID<Node> id_;
95  PointerClosure &graph_;
97  BitSet<Node> nodes_;
103  BitSet<SymbolicFrame> stacks_;
105  BitSet<Func> funcs_;
106  };
107 
110 
111 public:
116 
122  void Add(const SymbolicValue &value);
123 
125  void AddRead(Object *g);
127  void AddWritten(Object *g);
129  void AddEscaped(Object *g);
130 
132  void Add(Func *f);
133 
137  std::shared_ptr<SymbolicPointer> BuildTainted();
138 
142  std::shared_ptr<SymbolicPointer> BuildTaint();
143 
145  Node *GetRoot() { return nodes_.Map(0); }
146 
148  size_t func_size() const { return funcs_.Size(); }
149  func_iterator func_begin() const { return funcs_.begin(); }
150  func_iterator func_end() const { return funcs_.end(); }
151  llvm::iterator_range<func_iterator> funcs() const
152  {
153  return llvm::make_range(func_begin(), func_end());
154  }
155 
156 private:
158  ID<Node> GetNode(ID<SymbolicObject> id);
160  ID<Node> GetNode(Object *object);
161 
163  void Build(ID<Node> id, SymbolicObject &object);
164 
166  void Compact();
167 
168 private:
170  SymbolicHeap &heap_;
172  SymbolicContext &ctx_;
173 
175  UnionFind<Node> nodes_;
177  std::unordered_map<ID<SymbolicObject>, ID<Node>> objectToNode_;
178 
180  std::set<SymbolicObject *> objects_;
182  BitSet<SymbolicObject> escapes_;
184  BitSet<SymbolicObject> tainted_;
186  BitSet<Func> funcs_;
188  BitSet<SymbolicFrame> stacks_;
189 };
PointerClosure::AddEscaped
void AddEscaped(Object *g)
Add the pointer itself to the closure.
Definition: pointer_closure.cpp:122
BitSet::iterator
Iterator over the bitset items.
Definition: bitset.h:199
SymbolicContext
Definition: symbolic_context.h:28
SymbolicPointer
Definition: symbolic_pointer.h:270
PointerClosure::AddRead
void AddRead(Object *g)
Add contained objects to the closure.
Definition: pointer_closure.cpp:104
Func
Definition: func.h:30
BitSet::Size
size_t Size() const
Returns the size of the document.
Definition: bitset.h:516
PointerClosure::BuildTaint
std::shared_ptr< SymbolicPointer > BuildTaint()
Definition: pointer_closure.cpp:150
SymbolicValue
Definition: symbolic_value.h:24
PointerClosure::Node
Definition: pointer_closure.h:33
BitSet::begin
iterator begin() const
Start iterator.
Definition: bitset.h:356
PointerClosure::GetRoot
Node * GetRoot()
Return the root node.
Definition: pointer_closure.h:145
SymbolicObject
Definition: symbolic_object.h:26
BitSet::end
iterator end() const
End iterator.
Definition: bitset.h:362
ID
Definition: id.h:19
Object
Definition: object.h:43
PointerClosure::func_size
size_t func_size() const
Iterator over functions.
Definition: pointer_closure.h:148
PointerClosure::Add
void Add(const SymbolicValue &value)
Definition: pointer_closure.cpp:48
PointerClosure::PointerClosure
PointerClosure(SymbolicHeap &heap, SymbolicContext &ctx)
Definition: pointer_closure.cpp:34
PointerClosure::AddWritten
void AddWritten(Object *g)
Add contained objects to the set of overwritten ones.
Definition: pointer_closure.cpp:113
BitSet
Definition: bitset.h:24
PointerClosure
Definition: pointer_closure.h:28
SymbolicFrame
Definition: symbolic_frame.h:29
PointerClosure::func_iterator
BitSet< Func >::iterator func_iterator
Iterator over functions.
Definition: pointer_closure.h:109
PointerClosure::BuildTainted
std::shared_ptr< SymbolicPointer > BuildTainted()
Definition: pointer_closure.cpp:139
PointerClosure::Node::node_iterator
Definition: pointer_closure.h:38
BitSet::Union
unsigned Union(const BitSet &that)
Definition: bitset.h:434
UnionFind
Definition: union_find.h:18
PointerClosure::Node::Union
void Union(const Node &that)
Merge another node into this one.
Definition: pointer_closure.h:81
SymbolicHeap
Definition: symbolic_heap.h:21