llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
data.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 <cstdint>
8 #include <string_view>
9 #include <unordered_map>
10 
11 #include <llvm/ADT/ilist.h>
12 
13 #include "core/object.h"
14 #include "core/global.h"
15 #include "core/symbol_table.h"
16 
17 class Prog;
18 class Data;
19 class Object;
20 
21 
22 
26 template <> struct llvm::ilist_traits<Data> {
27 private:
28  using instr_iterator = simple_ilist<Data>::iterator;
29 
30 public:
31  void deleteNode(Data *inst);
32  void addNodeToList(Data *inst);
33  void removeNodeFromList(Data *inst);
34  void transferNodesFromList(
35  ilist_traits &from,
36  instr_iterator first,
37  instr_iterator last
38  );
39 
40  Prog *getParent();
41 };
42 
43 
47 class Data final : public llvm::ilist_node_with_parent<Data, Prog> {
48 private:
50  using ObjectListType = llvm::ilist<Object>;
51 
53  using iterator = ObjectListType::iterator;
54  using const_iterator = ObjectListType::const_iterator;
56  using reverse_iterator = ObjectListType::reverse_iterator;
57  using const_reverse_iterator = ObjectListType::const_reverse_iterator;
58 
59 public:
60  // Initialises the data segment.
61  Data(const std::string_view name);
62 
64  ~Data();
65 
67  bool IsConstant();
69  bool IsZeroed() const;
71  bool IsWritable() const;
72 
74  void removeFromParent();
76  void eraseFromParent();
77 
79  Prog *getParent() const { return parent_; }
80 
81  // Returns the segment name.
82  std::string_view GetName() const { return name_; }
84  llvm::StringRef getName() const { return name_; }
85 
86  // Checks if the section is empty.
87  bool IsEmpty() const { return objects_.empty(); }
88 
90  void remove(iterator it) { objects_.remove(it); }
92  void erase(iterator it) { objects_.erase(it); }
94  void AddObject(Object *object, Object *before = nullptr);
95 
96  // Iterators over objects.
97  bool empty() const { return objects_.empty(); }
98  size_t size() const { return objects_.size(); }
99  iterator begin() { return objects_.begin(); }
100  iterator end() { return objects_.end(); }
101  const_iterator begin() const { return objects_.begin(); }
102  const_iterator end() const { return objects_.end(); }
103  reverse_iterator rbegin() { return objects_.rbegin(); }
104  reverse_iterator rend() { return objects_.rend(); }
105  const_reverse_iterator rbegin() const { return objects_.rbegin(); }
106  const_reverse_iterator rend() const { return objects_.rend(); }
107 
108 private:
109  friend struct llvm::ilist_traits<Data>;
110  friend struct llvm::ilist_traits<Object>;
111  static ObjectListType Data::*getSublistAccess(Object *) {
112  return &Data::objects_;
113  }
114 
116  void setParent(Prog *parent) { parent_ = parent; }
117 
118 private:
120  Prog *parent_;
122  const std::string name_;
124  ObjectListType objects_;
125 };
Data::remove
void remove(iterator it)
Removes an object.
Definition: data.h:90
Data
Definition: data.h:47
Data::getParent
Prog * getParent() const
Returns a pointer to the parent section.
Definition: data.h:79
Object
Definition: object.h:43
Data::eraseFromParent
void eraseFromParent()
Removes an parent from the data section.
Definition: data.cpp:50
Data::IsConstant
bool IsConstant()
Returns true if the values in this segment can be forwarded to code.
Definition: data.cpp:30
Data::IsWritable
bool IsWritable() const
Returns true if the section is writeable.
Definition: data.cpp:37
Data::IsZeroed
bool IsZeroed() const
Returns true if the section is BSS.
Definition: data.cpp:24
Data::erase
void erase(iterator it)
Erases an object.
Definition: data.h:92
Data::AddObject
void AddObject(Object *object, Object *before=nullptr)
Adds an object to the segment.
Definition: data.cpp:56
Prog
Definition: prog.h:33
Data::removeFromParent
void removeFromParent()
Removes the segment from the parent.
Definition: data.cpp:44
Data::~Data
~Data()
Deletes the data segment.
Definition: data.cpp:19
Data::getName
llvm::StringRef getName() const
Returns the segment name.
Definition: data.h:84