llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
object.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 <llvm/ADT/ilist.h>
8 
9 #include "core/atom.h"
10 #include "core/symbol_table.h"
11 
12 class Object;
13 class Prog;
14 class Atom;
15 
16 
17 
21 template <> struct llvm::ilist_traits<Object> {
22 private:
23  using instr_iterator = simple_ilist<Object>::iterator;
24 
25 public:
26  void deleteNode(Object *inst);
27  void addNodeToList(Object *inst);
28  void removeNodeFromList(Object *inst);
29  void transferNodesFromList(
30  ilist_traits &from,
31  instr_iterator first,
32  instr_iterator last
33  );
34 
35  Data *getParent();
36 };
37 
38 
39 
43 class Object final : public llvm::ilist_node_with_parent<Object, Prog> {
44 private:
47 
49  using iterator = AtomListType::iterator;
50  using const_iterator = AtomListType::const_iterator;
52  using reverse_iterator = AtomListType::reverse_iterator;
53  using const_reverse_iterator = AtomListType::const_reverse_iterator;
54 
55 public:
56  // Initialises the data segment.
57  Object() : parent_(nullptr), isThreadLocal_(false) {}
58 
60  ~Object();
61 
63  void removeFromParent();
65  void eraseFromParent();
66 
68  Data *getParent() const { return parent_; }
69 
71  void remove(iterator it) { atoms_.remove(it); }
73  void erase(iterator it) { atoms_.erase(it); }
75  void AddAtom(Atom *atom, Atom *before = nullptr);
76 
77  // Iterators over atoms.
78  bool empty() const { return atoms_.empty(); }
79  size_t size() const { return atoms_.size(); }
80  iterator begin() { return atoms_.begin(); }
81  iterator end() { return atoms_.end(); }
82  const_iterator begin() const { return atoms_.begin(); }
83  const_iterator end() const { return atoms_.end(); }
84  reverse_iterator rbegin() { return atoms_.rbegin(); }
85  reverse_iterator rend() { return atoms_.rend(); }
86  const_reverse_iterator rbegin() const { return atoms_.rbegin(); }
87  const_reverse_iterator rend() const { return atoms_.rend(); }
88 
90  void dump(llvm::raw_ostream &os = llvm::errs()) const;
91 
93  Value *Load(uint64_t offset, Type type);
95  bool Store(uint64_t offset, Ref<Value> value, Type type);
96 
98  void SetThreadLocal(bool flag = true) { isThreadLocal_ = flag; }
100  bool IsThreadLocal() const { return isThreadLocal_; }
101 
102 private:
103  friend struct llvm::ilist_traits<Object>;
104  friend class SymbolTableListTraits<Atom>;
105  static AtomListType Object::*getSublistAccess(Atom *) {
106  return &Object::atoms_;
107  }
108 
110  void setParent(Data *parent) { parent_ = parent; }
111 
112 private:
114  Data *parent_;
116  AtomListType atoms_;
118  bool isThreadLocal_;
119 };
120 
122 inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Object &obj)
123 {
124  obj.dump(os);
125  return os;
126 }
Object::IsThreadLocal
bool IsThreadLocal() const
Check whether the object is thread-local.
Definition: object.h:100
SymbolTableList< Atom >
Atom
Definition: atom.h:23
Object::Load
Value * Load(uint64_t offset, Type type)
Load a value from an offset.
Definition: object.cpp:190
Value
Definition: value.h:22
Object::Store
bool Store(uint64_t offset, Ref< Value > value, Type type)
Store a value to an offset.
Definition: object.cpp:392
Data
Definition: data.h:47
Object
Definition: object.h:43
Object::erase
void erase(iterator it)
Erases an atom.
Definition: object.h:73
SymbolTableListTraits
Definition: symbol_table.h:33
Object::dump
void dump(llvm::raw_ostream &os=llvm::errs()) const
Dump the object.
Definition: object.cpp:43
Object::remove
void remove(iterator it)
Removes an atom.
Definition: object.h:71
Object::removeFromParent
void removeFromParent()
Removes the segment from the parent.
Definition: object.cpp:21
Prog
Definition: prog.h:33
Object::AddAtom
void AddAtom(Atom *atom, Atom *before=nullptr)
Adds an atom to the atom.
Definition: object.cpp:33
Ref< Value >
Object::~Object
~Object()
Deletes the data segment.
Definition: object.cpp:16
Object::SetThreadLocal
void SetThreadLocal(bool flag=true)
Set the thread local flag.
Definition: object.h:98
Object::eraseFromParent
void eraseFromParent()
Removes an parent from the data section.
Definition: object.cpp:27
Object::getParent
Data * getParent() const
Returns a pointer to the parent section.
Definition: object.h:68