llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
prog.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 <string>
8 #include <memory>
9 #include <vector>
10 #include <unordered_map>
11 #include <map>
12 
13 #include <llvm/ADT/ilist.h>
14 #include <llvm/ADT/ilist_node.h>
15 #include <llvm/ADT/iterator_range.h>
16 
17 #include "core/constant.h"
18 #include "core/expr.h"
19 #include "core/extern.h"
20 #include "core/symbol_table.h"
21 #include "core/data.h"
22 #include "core/object.h"
23 #include "core/func.h"
24 #include "core/xtor.h"
25 
26 class Extern;
27 
28 
29 
33 class Prog final {
34 private:
38  using DataListType = llvm::ilist<Data>;
42  using XtorListType = llvm::ilist<Xtor>;
43 
45  using GlobalMap = std::unordered_map<std::string_view, Global *>;
46 
47  class global_iterator
48  : public llvm::iterator_adaptor_base
49  < global_iterator
50  , GlobalMap::iterator
51  , std::random_access_iterator_tag
52  , Global *
53  >
54  {
55  public:
56  explicit global_iterator(GlobalMap::iterator it)
57  : iterator_adaptor_base(it)
58  {
59  }
60 
61  Global *operator*() const { return this->I->second; }
62 
63  Global *operator->() const { return this->I->second; }
64  };
65 
66  class const_global_iterator
67  : public llvm::iterator_adaptor_base
68  < const_global_iterator
69  , GlobalMap::const_iterator
70  , std::random_access_iterator_tag
71  , const Global *
72  >
73  {
74  public:
75  explicit const_global_iterator(GlobalMap::const_iterator it)
76  : iterator_adaptor_base(it)
77  {
78  }
79 
80  const Global *operator*() const { return this->I->second; }
81 
82  const Global *operator->() const { return this->I->second; }
83  };
84 
85 public:
87  using iterator = FuncListType::iterator;
88  using const_iterator = FuncListType::const_iterator;
89 
91  using data_iterator = DataListType::iterator;
92  using const_data_iterator = DataListType::const_iterator;
93 
95  using ext_iterator = ExternListType::iterator;
96  using const_ext_iterator = ExternListType::const_iterator;
97 
99  using xtor_iterator = XtorListType::iterator;
100  using const_xtor_iterator = XtorListType::const_iterator;
101 
102 public:
104  Prog(std::string_view path);
106  ~Prog();
107 
109  Global *GetGlobalOrExtern(const std::string_view name);
111  Extern *GetExtern(const std::string_view name);
113  Data *GetOrCreateData(const std::string_view name);
115  Data *GetData(const std::string_view name);
117  Global *GetGlobal(const std::string_view name) const;
118 
120  const std::string &GetName() const { return name_; }
122  llvm::StringRef getName() const { return { name_.data(), name_.size() }; }
123 
125  void remove(iterator it) { funcs_.remove(it); }
127  void erase(iterator it) { funcs_.erase(it); }
129  void remove(ext_iterator it) { externs_.remove(it); }
131  void erase(ext_iterator it) { externs_.erase(it); }
133  void remove(data_iterator it) { datas_.remove(it); }
135  void erase(data_iterator it) { datas_.erase(it); }
137  void remove(xtor_iterator it) { xtors_.remove(it); }
139  void erase(xtor_iterator it) { xtors_.erase(it); }
140 
142  void AddFunc(Func *func, Func *before = nullptr);
143  // Iterators over functions.
144  size_t size() const { return funcs_.size(); }
145  bool empty() const { return funcs_.empty(); }
146  iterator begin() { return funcs_.begin(); }
147  iterator end() { return funcs_.end(); }
148  const_iterator begin() const { return funcs_.begin(); }
149  const_iterator end() const { return funcs_.end(); }
150  llvm::iterator_range<const_iterator> funcs() const;
151  llvm::iterator_range<iterator> funcs();
152 
154  void AddExtern(Extern *ext, Extern *before = nullptr);
155  // Iterator over external symbols.
156  size_t ext_size() const { return externs_.size(); }
157  ext_iterator ext_begin() { return externs_.begin(); }
158  ext_iterator ext_end() { return externs_.end(); }
159  const_ext_iterator ext_begin() const { return externs_.begin(); }
160  const_ext_iterator ext_end() const { return externs_.end(); }
161  llvm::iterator_range<const_ext_iterator> externs() const;
162  llvm::iterator_range<ext_iterator> externs();
163 
165  void AddData(Data *data, Data *before = nullptr);
166  // Iterator over data segments.
167  size_t data_size() const { return datas_.size(); }
168  bool data_empty() const { return datas_.empty(); }
169  data_iterator data_begin() { return datas_.begin(); }
170  data_iterator data_end() { return datas_.end(); }
171  const_data_iterator data_begin() const { return datas_.begin(); }
172  const_data_iterator data_end() const { return datas_.end(); }
173  llvm::iterator_range<const_data_iterator> data() const;
174  llvm::iterator_range<data_iterator> data();
175 
177  void AddXtor(Xtor *xtor, Xtor *before = nullptr);
178  // Iterator over constructors/destructors.
179  size_t xtor_size() const { return xtors_.size(); }
180  bool xtor_empty() const { return xtors_.empty(); }
181  xtor_iterator xtor_begin() { return xtors_.begin(); }
182  xtor_iterator xtor_end() { return xtors_.end(); }
183  const_xtor_iterator xtor_begin() const { return xtors_.begin(); }
184  const_xtor_iterator xtor_end() const { return xtors_.end(); }
185  llvm::iterator_range<const_xtor_iterator> xtor() const;
186  llvm::iterator_range<xtor_iterator> xtor();
187 
189  global_iterator global_begin() { return global_iterator(globals_.begin()); }
190  global_iterator global_end() { return global_iterator(globals_.end()); }
191  const_global_iterator global_begin() const { return const_global_iterator(globals_.begin()); }
192  const_global_iterator global_end() const { return const_global_iterator(globals_.end()); }
193  llvm::iterator_range<global_iterator> globals();
194  llvm::iterator_range<const_global_iterator> globals() const;
195 
197  void dump(llvm::raw_ostream &os = llvm::errs()) const;
198 
199 private:
202  friend class SymbolTableListTraits<Func>;
203  friend class SymbolTableListTraits<Extern>;
204  friend class SymbolTableListTraits<Atom>;
205  friend struct llvm::ilist_traits<Data>;
206  friend struct llvm::ilist_traits<Object>;
207 
208  void insertGlobal(Global *g);
209  void removeGlobalName(std::string_view name);
210 
211  static FuncListType Prog::*getSublistAccess(Func *) { return &Prog::funcs_; }
212  static ExternListType Prog::*getSublistAccess(Extern *) { return &Prog::externs_; }
213  static DataListType Prog::*getSublistAccess(Data *) { return &Prog::datas_; }
214  static XtorListType Prog::*getSublistAccess(Xtor *) { return &Prog::xtors_; }
215 
216 private:
218  std::string name_;
220  std::unordered_map<std::string_view, Global *> globals_;
222  FuncListType funcs_;
224  DataListType datas_;
226  ExternListType externs_;
228  XtorListType xtors_;
229 };
Prog::Prog
Prog(std::string_view path)
Creates a new program.
Definition: prog.cpp:16
Prog::remove
void remove(iterator it)
Removes a function.
Definition: prog.h:125
Func
Definition: func.h:30
SymbolTableList< Func >
Prog::getName
llvm::StringRef getName() const
Returns the name of the program.
Definition: prog.h:122
Atom
Definition: atom.h:23
Prog::data_iterator
DataListType::iterator data_iterator
Iterator over segments.
Definition: prog.h:91
Prog::erase
void erase(ext_iterator it)
Erases an extern.
Definition: prog.h:131
Prog::~Prog
~Prog()
Deletes a program.
Definition: prog.cpp:21
Prog::GetOrCreateData
Data * GetOrCreateData(const std::string_view name)
Fetches a data segment, creates it if it does not exist.
Definition: prog.cpp:88
Prog::remove
void remove(xtor_iterator it)
Removes a constructor/destructor.
Definition: prog.h:137
Data
Definition: data.h:47
Prog::AddExtern
void AddExtern(Extern *ext, Extern *before=nullptr)
Adds an extern.
Definition: prog.cpp:36
Object
Definition: object.h:43
Prog::AddXtor
void AddXtor(Xtor *xtor, Xtor *before=nullptr)
Add a constructor or a destructor.
Definition: prog.cpp:56
SymbolTableListTraits
Definition: symbol_table.h:33
Xtor
Constructor/Destructor information.
Definition: xtor.h:20
Prog::AddData
void AddData(Data *data, Data *before=nullptr)
Adds a data item.
Definition: prog.cpp:46
Prog::erase
void erase(xtor_iterator it)
Erases a constructor/destructor.
Definition: prog.h:139
Prog::GetName
const std::string & GetName() const
Returns the name of the program.
Definition: prog.h:120
Prog::AddFunc
void AddFunc(Func *func, Func *before=nullptr)
Adds a function.
Definition: prog.cpp:26
Prog::erase
void erase(iterator it)
Erases a function.
Definition: prog.h:127
Prog::remove
void remove(data_iterator it)
Removes a data segment.
Definition: prog.h:133
Prog::iterator
FuncListType::iterator iterator
Iterator over the functions.
Definition: prog.h:87
Prog::GetData
Data * GetData(const std::string_view name)
Fetches a data segment.
Definition: prog.cpp:99
Prog::erase
void erase(data_iterator it)
Erases a data segment.
Definition: prog.h:135
Prog
Definition: prog.h:33
Prog::GetGlobalOrExtern
Global * GetGlobalOrExtern(const std::string_view name)
Returns a global or creates a dummy extern.
Definition: prog.cpp:66
Block
Definition: block.h:29
Prog::GetGlobal
Global * GetGlobal(const std::string_view name) const
Fetches a global.
Definition: prog.cpp:110
Extern
Definition: extern.h:20
Prog::remove
void remove(ext_iterator it)
Removes an extern.
Definition: prog.h:129
Prog::dump
void dump(llvm::raw_ostream &os=llvm::errs()) const
Dumps the representation of the function.
Definition: prog.cpp:233
Prog::ext_iterator
ExternListType::iterator ext_iterator
Iterator over externs.
Definition: prog.h:95
Prog::xtor_iterator
XtorListType::iterator xtor_iterator
Iterator over ctors and dtors.
Definition: prog.h:99
Prog::GetExtern
Extern * GetExtern(const std::string_view name)
Returns an extern.
Definition: prog.cpp:78
Prog::global_begin
global_iterator global_begin()
Range of globals.
Definition: prog.h:189
Global
Definition: global.h:23