mini-llvm 0.1.0
Loading...
Searching...
No Matches
Module.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cstddef>
6#include <format>
7#include <iterator>
8#include <list>
9#include <memory>
10#include <ranges>
11#include <string>
12#include <string_view>
13#include <utility>
14
19
20namespace mini_llvm::mir {
21
23 using GlobalVarList = std::list<std::unique_ptr<GlobalVar>>;
24 using FunctionList = std::list<std::unique_ptr<Function>>;
25
26public:
29
32
33 Module() = default;
34 Module(const Module &) = delete;
35 Module(Module &&) = default;
36 Module &operator=(const Module &) = delete;
37 Module &operator=(Module &&) = default;
38
40 return global_var_iterator(globalVars_.begin());
41 }
42
44 return const_global_var_iterator(globalVars_.begin());
45 }
46
48 return global_var_iterator(globalVars_.end());
49 }
50
52 return const_global_var_iterator(globalVars_.end());
53 }
54
55 bool global_var_empty() const {
56 return globalVars_.empty();
57 }
58
59 size_t global_var_size() const {
60 return globalVars_.size();
61 }
62
63 GlobalVar &addGlobalVar(const_global_var_iterator pos, std::unique_ptr<GlobalVar> G);
64
65 GlobalVar &prependGlobalVar(std::unique_ptr<GlobalVar> G) {
66 return addGlobalVar(global_var_begin(), std::move(G));
67 }
68
69 GlobalVar &appendGlobalVar(std::unique_ptr<GlobalVar> G) {
70 return addGlobalVar(global_var_end(), std::move(G));
71 }
72
73 std::unique_ptr<GlobalVar> removeGlobalVar(const_global_var_iterator pos);
74
75 std::unique_ptr<GlobalVar> removeFirstGlobalVar() {
77 }
78
79 std::unique_ptr<GlobalVar> removeLastGlobalVar() {
80 return removeGlobalVar(std::prev(global_var_end()));
81 }
82
84
86 return function_iterator(functions_.begin());
87 }
88
90 return const_function_iterator(functions_.begin());
91 }
92
94 return function_iterator(functions_.end());
95 }
96
98 return const_function_iterator(functions_.end());
99 }
100
101 bool function_empty() const {
102 return functions_.empty();
103 }
104
105 size_t function_size() const {
106 return functions_.size();
107 }
108
109 Function &addFunction(const_function_iterator pos, std::unique_ptr<Function> F);
110
111 Function &prependFunction(std::unique_ptr<Function> F) {
112 return addFunction(function_begin(), std::move(F));
113 }
114
115 Function &appendFunction(std::unique_ptr<Function> F) {
116 return addFunction(function_end(), std::move(F));
117 }
118
119 std::unique_ptr<Function> removeFunction(const_function_iterator pos);
120
121 std::unique_ptr<Function> removeFirstFunction() {
123 }
124
125 std::unique_ptr<Function> removeLastFunction() {
126 return removeFunction(std::prev(function_end()));
127 }
128
130
131 std::string format() const;
132
133private:
134 GlobalVarList globalVars_;
135 FunctionList functions_;
136};
137
138inline auto globalVars(Module &M) {
139 return std::ranges::subrange(M.global_var_begin(), M.global_var_end());
140}
141
142inline auto globalVars(const Module &M) {
143 return std::ranges::subrange(M.global_var_begin(), M.global_var_end());
144}
145
146inline auto functions(Module &M) {
147 return std::ranges::subrange(M.function_begin(), M.function_end());
148}
149
150inline auto functions(const Module &M) {
151 return std::ranges::subrange(M.function_begin(), M.function_end());
152}
153
155MINI_LLVM_EXPORT const GlobalVar *getGlobalVarByName(const Module &M, std::string_view name);
157MINI_LLVM_EXPORT const Function *getFunctionByName(const Module &M, std::string_view name);
158
159} // namespace mini_llvm::mir
160
161template <>
162struct std::formatter<mini_llvm::mir::Module> {
163 constexpr auto parse(std::format_parse_context &ctx) {
164 return ctx.begin();
165 }
166
167 template <typename FormatContext>
168 auto format(const mini_llvm::mir::Module &M, FormatContext &ctx) const {
169 return std::format_to(ctx.out(), "{}", M.format());
170 }
171};
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition Function.h:21
Definition GlobalVar.h:16
Definition Module.h:22
Function & addFunction(const_function_iterator pos, std::unique_ptr< Function > F)
Module & operator=(const Module &)=delete
size_t function_size() const
Definition Module.h:105
function_iterator function_begin()
Definition Module.h:85
IndirectIterator< FunctionList::const_iterator > const_function_iterator
Definition Module.h:31
std::unique_ptr< Function > removeLastFunction()
Definition Module.h:125
IndirectIterator< GlobalVarList::const_iterator, const GlobalVar > const_global_var_iterator
Definition Module.h:28
Module & operator=(Module &&)=default
const_function_iterator function_end() const
Definition Module.h:97
Module(Module &&)=default
IndirectIterator< FunctionList::iterator > function_iterator
Definition Module.h:30
GlobalVar & appendGlobalVar(std::unique_ptr< GlobalVar > G)
Definition Module.h:69
bool function_empty() const
Definition Module.h:101
std::unique_ptr< GlobalVar > removeGlobalVar(const_global_var_iterator pos)
IndirectIterator< GlobalVarList::iterator, GlobalVar > global_var_iterator
Definition Module.h:27
std::unique_ptr< GlobalVar > removeFirstGlobalVar()
Definition Module.h:75
Function & prependFunction(std::unique_ptr< Function > F)
Definition Module.h:111
function_iterator function_end()
Definition Module.h:93
std::unique_ptr< Function > removeFunction(const_function_iterator pos)
bool global_var_empty() const
Definition Module.h:55
std::unique_ptr< GlobalVar > removeLastGlobalVar()
Definition Module.h:79
global_var_iterator global_var_begin()
Definition Module.h:39
GlobalVar & prependGlobalVar(std::unique_ptr< GlobalVar > G)
Definition Module.h:65
const_function_iterator function_begin() const
Definition Module.h:89
Function & appendFunction(std::unique_ptr< Function > F)
Definition Module.h:115
const_global_var_iterator global_var_end() const
Definition Module.h:51
Module(const Module &)=delete
std::string format() const
global_var_iterator global_var_end()
Definition Module.h:47
const_global_var_iterator global_var_begin() const
Definition Module.h:43
GlobalVar & addGlobalVar(const_global_var_iterator pos, std::unique_ptr< GlobalVar > G)
std::unique_ptr< Function > removeFirstFunction()
Definition Module.h:121
size_t global_var_size() const
Definition Module.h:59
Definition BasicBlock.h:22
MINI_LLVM_EXPORT GlobalVar * getGlobalVarByName(Module &M, std::string_view name)
auto globalVars(Module &M)
Definition Module.h:138
MINI_LLVM_EXPORT Function * getFunctionByName(Module &M, std::string_view name)
auto functions(Module &M)
Definition Module.h:146
Definition GraphColoringAllocator.h:13
constexpr const char * name(Diagnostic::Level level)
Definition Diagnostic.h:38
auto format(const mini_llvm::mir::Module &M, FormatContext &ctx) const
Definition Module.h:168
constexpr auto parse(std::format_parse_context &ctx)
Definition Module.h:163