llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
symbolic_heap.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 <unordered_map>
8 
9 #include "core/adt/id.h"
10 
11 class CallSite;
12 class Object;
13 class SymbolicObject;
14 class Func;
15 
16 
17 
21 class SymbolicHeap final {
22 public:
24  class Origin final {
25  public:
27  enum class Kind {
28  DATA,
29  FRAME,
30  ALLOC,
31  };
32 
34  struct DataOrigin {
35  Kind K;
36  Object *Obj;
37 
38  DataOrigin(Object *obj)
39  : K(Kind::DATA)
40  , Obj(obj)
41  {
42  }
43  };
44 
46  struct FrameOrigin {
47  Kind K;
48  unsigned Frame;
49  unsigned Index;
50 
51  FrameOrigin(unsigned frame, unsigned index)
52  : K(Kind::FRAME)
53  , Frame(frame)
54  , Index(index)
55  {
56  }
57  };
58 
60  struct AllocOrigin {
61  Kind K;
62  unsigned Frame;
63  CallSite *Alloc;
64 
65  AllocOrigin(unsigned frame, CallSite *alloc)
66  : K(Kind::ALLOC)
67  , Frame(frame)
68  , Alloc(alloc)
69  {
70  }
71  };
72 
74  Kind GetKind() const { return v_.K; }
75 
77  DataOrigin &AsData() { return v_.D; }
79  FrameOrigin &AsFrame() { return v_.F; }
81  AllocOrigin &AsAlloc() { return v_.A; }
82 
83  public:
84  template <typename... Args>
85  Origin(Args... args) : v_(std::forward<Args>(args)...) {}
86 
87  public:
89  union U {
90  Kind K;
91  DataOrigin D;
92  FrameOrigin F;
93  AllocOrigin A;
94 
95  U(Object *object) { new (&D) DataOrigin(object); }
96  U(unsigned fr, unsigned idx) { new (&F) FrameOrigin(fr, idx); }
97  U(unsigned fr, CallSite *alloc) { new (&A) AllocOrigin(fr, alloc); }
98  } v_;
99  };
100 
101 
102 public:
104  SymbolicHeap() : next_(0u) {}
105 
107  ID<SymbolicObject> Data(Object *object);
109  ID<SymbolicObject> Frame(unsigned frame, unsigned object);
111  ID<SymbolicObject> Alloc(unsigned frame, CallSite *site);
113  ID<Func> Function(Func *f);
114 
116  Origin &Map(ID<SymbolicObject> id) { return origins_[id]; }
118  Func &Map(ID<Func> id);
119 
120 private:
122  unsigned next_;
124  std::unordered_map<Object *, ID<SymbolicObject>> objects_;
126  std::unordered_map<std::pair<unsigned, unsigned>, ID<SymbolicObject>> frames_;
128  std::unordered_map<std::pair<unsigned, CallSite *>, ID<SymbolicObject>> allocs_;
130  std::vector<Origin> origins_;
132  std::unordered_map<Func *, ID<Func>> funcToIDs_;
134  std::vector<Func *> idToFunc_;
135 };
Func
Definition: func.h:30
SymbolicHeap::Origin::AsFrame
FrameOrigin & AsFrame()
Return the frame origin.
Definition: symbolic_heap.h:79
SymbolicHeap::Origin::AsData
DataOrigin & AsData()
Return the data origin.
Definition: symbolic_heap.h:77
SymbolicHeap::Alloc
ID< SymbolicObject > Alloc(unsigned frame, CallSite *site)
Record an ID for an allocation.
Definition: symbolic_heap.cpp:34
SymbolicHeap::Origin::U
ID of the object kind.
Definition: symbolic_heap.h:89
SymbolicObject
Definition: symbolic_object.h:26
ID< SymbolicObject >
SymbolicHeap::Origin::AsAlloc
AllocOrigin & AsAlloc()
Return the alloc origin.
Definition: symbolic_heap.h:81
SymbolicHeap::Map
Origin & Map(ID< SymbolicObject > id)
Returns the origin of an object.
Definition: symbolic_heap.h:116
Object
Definition: object.h:43
SymbolicHeap::Data
ID< SymbolicObject > Data(Object *object)
Record an ID for an object.
Definition: symbolic_heap.cpp:12
SymbolicHeap::Origin::Kind
Kind
Enumeration of object kinds.
Definition: symbolic_heap.h:27
SymbolicHeap::Frame
ID< SymbolicObject > Frame(unsigned frame, unsigned object)
Record an ID for a frame.
Definition: symbolic_heap.cpp:23
SymbolicHeap::Origin::FrameOrigin
Frame object.
Definition: symbolic_heap.h:46
SymbolicHeap::Origin::AllocOrigin
Heap object.
Definition: symbolic_heap.h:60
SymbolicHeap::Origin::DataOrigin
Data object.
Definition: symbolic_heap.h:34
SymbolicHeap::SymbolicHeap
SymbolicHeap()
Initialise the mapping.
Definition: symbolic_heap.h:104
SymbolicHeap::Origin::GetKind
Kind GetKind() const
Return the kind of the object.
Definition: symbolic_heap.h:74
SymbolicHeap::Function
ID< Func > Function(Func *f)
Record an ID for a function.
Definition: symbolic_heap.cpp:45
SymbolicHeap::Origin
Class to describe the origin of an object.
Definition: symbolic_heap.h:24
SymbolicHeap
Definition: symbolic_heap.h:21