Gyoji Compiler
Loading...
Searching...
No Matches
gyoji-codegen-private.hpp
1#pragma once
2
3#include "llvm/ADT/APFloat.h"
4#include "llvm/ADT/STLExtras.h"
5#include "llvm/IR/BasicBlock.h"
6#include "llvm/IR/Constants.h"
7#include "llvm/IR/DerivedTypes.h"
8#include "llvm/IR/Function.h"
9#include "llvm/IR/IRBuilder.h"
10#include "llvm/IR/Instructions.h"
11#include "llvm/IR/LLVMContext.h"
12#include "llvm/IR/LegacyPassManager.h"
13#include "llvm/IR/Module.h"
14#include "llvm/IR/Type.h"
15#include "llvm/IR/Verifier.h"
16#include "llvm/MC/TargetRegistry.h"
17#include "llvm/Support/FileSystem.h"
18#include "llvm/Support/TargetSelect.h"
19#include "llvm/Support/raw_ostream.h"
20#include "llvm/Target/TargetMachine.h"
21#include "llvm/Target/TargetOptions.h"
22#include "llvm/TargetParser/Host.h"
23
24namespace Gyoji::codegen {
25 class CodeGeneratorLLVMContext {
26 public:
27 CodeGeneratorLLVMContext(
28 const Gyoji::context::CompilerContext & _context,
29 const Gyoji::mir::MIR & _mir
30 );
31 ~CodeGeneratorLLVMContext();
32 void initialize();
33 void generate();
34 int output(const std::string & filename);
35
36 private:
40
41 const Gyoji::context::CompilerContext & compiler_context;
42 const Gyoji::mir::MIR & mir;
43
45
49
50
51 void create_types(const Gyoji::mir::MIR & mir);
52 llvm::Type *create_type(const Gyoji::mir::Type * type);
53 llvm::Type *create_type_primitive(const Gyoji::mir::Type *primitive);
54 llvm::Type *create_type_enum(const Gyoji::mir::Type *enumtype);
55 llvm::Type *create_type_composite(const Gyoji::mir::Type *compositetype);
56 llvm::Type *create_type_pointer(const Gyoji::mir::Type *pointertype);
57 llvm::Type *create_type_reference(const Gyoji::mir::Type *referencetype);
58 llvm::Type *create_type_function_pointer(const Gyoji::mir::Type *fptr_type);
59 llvm::Type *create_type_array(const Gyoji::mir::Type *array_type);
60
61
62 // Global symbols
63 void generate_operation_function_call(
65 const Gyoji::mir::Function & mir_function,
66 const Gyoji::mir::OperationFunctionCall & operation
67 );
68 void generate_operation_symbol(
70 const Gyoji::mir::Function & mir_function,
71 const Gyoji::mir::OperationSymbol & operation
72 );
73
74 // Cast operations
75 void generate_operation_widen_numeric(
77 const Gyoji::mir::Function & mir_function,
78 const Gyoji::mir::OperationCast & operation
79 );
80
81 // Indirect access
82 void generate_operation_array_index(
85 const Gyoji::mir::Function & mir_function,
86 const Gyoji::mir::OperationArrayIndex & operation
87 );
88 void generate_operation_dot(
91 const Gyoji::mir::Function & mir_function,
92 const Gyoji::mir::OperationDot & operation
93 );
94
95 // Variable access
96 void generate_operation_local_variable(
99 const Gyoji::mir::Function & mir_function,
100 const Gyoji::mir::OperationLocalVariable & operation
101 );
102 void generate_operation_local_declare(
104 const Gyoji::mir::Function & mir_function,
105 const Gyoji::mir::OperationLocalDeclare & operation
106 );
107 void generate_operation_local_undeclare(
109 const Gyoji::mir::Function & mir_function,
111 );
112
113 // Literals
114 void generate_operation_literal_char(
116 const Gyoji::mir::Function & mir_function,
117 const Gyoji::mir::OperationLiteralChar & operation
118 );
119 void generate_operation_literal_string(
121 const Gyoji::mir::Function & mir_function,
122 const Gyoji::mir::OperationLiteralString & operation
123 );
124 void generate_operation_literal_int(
126 const Gyoji::mir::Function & mir_function,
127 const Gyoji::mir::OperationLiteralInt & operation
128 );
129 void generate_operation_literal_float(
131 const Gyoji::mir::Function & mir_function,
132 const Gyoji::mir::OperationLiteralFloat & operation
133 );
134 void generate_operation_literal_bool(
136 const Gyoji::mir::Function & mir_function,
137 const Gyoji::mir::OperationLiteralBool & operation
138 );
139 void generate_operation_literal_null(
141 const Gyoji::mir::Function & mir_function,
142 const Gyoji::mir::OperationLiteralNull & operation
143 );
144
145 // Unary operations
146 void generate_operation_addressof(
149 const Gyoji::mir::Function & mir_function,
150 const Gyoji::mir::OperationUnary & operation
151 );
152 void generate_operation_dereference(
155 const Gyoji::mir::Function & mir_function,
156 const Gyoji::mir::OperationUnary & operation
157 );
158 void generate_operation_arithmetic_negate(
160 const Gyoji::mir::Function & mir_function,
161 const Gyoji::mir::OperationUnary & operation
162 );
163 void generate_operation_bitwise_not(
165 const Gyoji::mir::Function & mir_function,
166 const Gyoji::mir::OperationUnary & operation
167 );
168 void generate_operation_logical_not(
170 const Gyoji::mir::Function & mir_function,
171 const Gyoji::mir::OperationUnary & operation
172 );
173
174 // Binary operations
175 void generate_operation_add(
177 const Gyoji::mir::Function & mir_function,
178 const Gyoji::mir::OperationBinary & operation
179 );
180 void generate_operation_subtract(
182 const Gyoji::mir::Function & mir_function,
183 const Gyoji::mir::OperationBinary & operation
184 );
185 void generate_operation_multiply(
187 const Gyoji::mir::Function & mir_function,
188 const Gyoji::mir::OperationBinary & operation
189 );
190 void generate_operation_divide(
192 const Gyoji::mir::Function & mir_function,
193 const Gyoji::mir::OperationBinary & operation
194 );
195 void generate_operation_modulo(
197 const Gyoji::mir::Function & mir_function,
198 const Gyoji::mir::OperationBinary & operation
199 );
200 void generate_operation_logical_and(
202 const Gyoji::mir::Function & mir_function,
203 const Gyoji::mir::OperationBinary & operation
204 );
205 void generate_operation_logical_or(
207 const Gyoji::mir::Function & mir_function,
208 const Gyoji::mir::OperationBinary & operation
209 );
210 void generate_operation_bitwise_and(
212 const Gyoji::mir::Function & mir_function,
213 const Gyoji::mir::OperationBinary & operation
214 );
215 void generate_operation_bitwise_or(
217 const Gyoji::mir::Function & mir_function,
218 const Gyoji::mir::OperationBinary & operation
219 );
220 void generate_operation_bitwise_xor(
222 const Gyoji::mir::Function & mir_function,
223 const Gyoji::mir::OperationBinary & operation
224 );
225 void generate_operation_shift(
227 const Gyoji::mir::Function & mir_function,
228 const Gyoji::mir::OperationBinary & operation
229 );
230
231 // Binary operations: comparisons
232 void generate_operation_comparison(
234 const Gyoji::mir::Function & mir_function,
235 const Gyoji::mir::OperationBinary & operation
236 );
237 void generate_operation_sizeof_type(
240 const Gyoji::mir::Function & mir_function,
241 const Gyoji::mir::OperationSizeofType & operation
242 );
243 // Binary operations: assignments
244 void generate_operation_assign(
247 const Gyoji::mir::Function & mir_function,
248 const Gyoji::mir::OperationBinary & operation
249 );
250
251 // Branch and flow control
252 void generate_operation_jump_conditional(
254 const Gyoji::mir::Function & mir_function,
256 );
257 void generate_operation_jump(
259 const Gyoji::mir::Function & mir_function,
260 const Gyoji::mir::OperationJump & operation
261 );
262 llvm::Value *generate_operation_return(
264 const Gyoji::mir::Function & mir_function,
265 const Gyoji::mir::OperationReturn & operation
266 );
267 llvm::Value *generate_operation_return_void(
269 const Gyoji::mir::Function & mir_function,
270 const Gyoji::mir::OperationReturnVoid & operation
271 );
272
273 llvm::Value *generate_basic_block(
274 const Gyoji::mir::Function & function,
275 const Gyoji::mir::BasicBlock & mir_block
276 );
277
278 void generate_function(const Gyoji::mir::Function & function);
279
280 llvm::Function * create_function(const Gyoji::mir::Function & function);
281 llvm::AllocaInst *CreateEntryBlockAlloca(
282 llvm::Function *TheFunction,
283 const llvm::StringRef & VarName
284 );
285
286 };
287
288};
constexpr void generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
Compiler Context.
Definition gyoji-context.hpp:30
Basic block of a function.
Definition functions.hpp:103
Function inside a translation unit.
Definition functions.hpp:303
The middle-tier intermediate representation (MIR) of a translation unit.
Definition gyoji-mir.hpp:57
This subclass of OperationBinary represents indexing an array.
Definition operations.hpp:1141
This subclass of Operation represents a binary operation.
Definition operations.hpp:1028
This subclass of OperationUnary represents a cast operation.
Definition operations.hpp:981
This subclass of Operation is used to access member variables of classes and other aggregate types by...
Definition operations.hpp:1177
Function call (invoke) operation.
Definition operations.hpp:1069
This operation represents a conditional jump.
Definition operations.hpp:1619
Unconditional Jump.
Definition operations.hpp:1655
Literal bool.
Definition operations.hpp:1512
Literal character.
Definition operations.hpp:1256
Literal float.
Definition operations.hpp:1463
Literal integer.
Definition operations.hpp:1325
Literal null.
Definition operations.hpp:1549
Literal string.
Definition operations.hpp:1287
Declare a local variable in scope.
Definition operations.hpp:1742
Un-declare a variable (remove it from scope)
Definition operations.hpp:1780
Load a local variable.
Definition operations.hpp:1220
Return from a function without a value.
Definition operations.hpp:1714
Return from a function with a value.
Definition operations.hpp:1691
The operation for obtaining the storage size of a type.
Definition operations.hpp:1579
Symbol-table lookup.
Definition operations.hpp:1102
This subclass of Operation represents a unary operation.
Definition operations.hpp:939
This represents a type as declared in a translation unit.
Definition types.hpp:299