GCC Code Coverage Report


Directory: ./
File: src/codegen/llvm/llvm_gen.h
Date: 2023-04-27 00:55:30
Exec Total Coverage
Lines: 5 5 100.0%
Functions: 2 2 100.0%
Branches: 2 2 100.0%

Line Branch Exec Source
1 #ifndef LYTHON_LLVM_GEN_HEADER
2 #define LYTHON_LLVM_GEN_HEADER
3
4 #include "ast/magic.h"
5 #include "ast/ops.h"
6 #include "ast/visitor.h"
7 #include "sema/bindings.h"
8 #include "sema/builtin.h"
9 #include "sema/errors.h"
10 #include "utilities/strings.h"
11
12 #if WITH_LLVM_CODEGEN
13 // LLVM
14 # include "llvm/IR/IRBuilder.h"
15 # include "llvm/IR/LLVMContext.h"
16 # include "llvm/IR/Module.h"
17
18 namespace lython {
19
20 struct LLVMGenVisitorTrait {
21 using StmtRet = void;
22 using ExprRet = llvm::Value*;
23 using ModRet = void;
24 using PatRet = void;
25 using IsConst = std::false_type;
26 using Trace = std::true_type;
27
28 enum {
29 MaxRecursionDepth = LY_MAX_VISITOR_RECURSION_DEPTH
30 };
31 };
32
33
34 template<typename T>
35 struct ArrayScope {
36 ArrayScope(Array<T>& array): array(array), oldsize(array.size()) {
37 31 }
38
39 ~ArrayScope() {
40
2/2
✓ Branch 1 taken 31 times.
✓ Branch 2 taken 31 times.
62 for (std::size_t i = oldsize; i < array.size(); i++) {
41 31 array[oldsize] = nullptr;
42 }
43 31 array.resize(oldsize);
44 31 }
45
46 Array<T>& array;
47 std::size_t oldsize;
48 };
49
50
51 /*
52 */
53 struct LLVMGen: BaseVisitor<LLVMGen, false, LLVMGenVisitorTrait> {
54 using Super = BaseVisitor<LLVMGen, false, LLVMGenVisitorTrait>;
55
56 using StmtRet = Super::StmtRet;
57 using ExprRet = Super::ExprRet;
58 using ModRet = Super::ModRet;
59 using PatRet = Super::PatRet;
60
61 Unique<llvm::LLVMContext> context;
62 Unique<llvm::Module> llmodule;
63 Unique<llvm::IRBuilder<>> builder;
64
65 Array<llvm::Value*> named_values;
66 Dict<Identifier, std::size_t> index_to_index;
67
68 llvm::Type* builtin_type(StringRef name);
69 llvm::Type* retrieve_type(ExprNode* type, int depth);
70
71 llvm::BasicBlock* start_block = nullptr;
72 llvm::BasicBlock* end_block = nullptr;
73
74 # if WITH_LLVM_DEBUG_SYMBOL
75 Unique<llvm::DIBuilder> dbuilder;
76 DICompileUnit* debug_compile_unit;
77 Arrayr<DIScope*> scopes;
78
79 void emit_location(ExprNode* node);
80 # endif
81
82 ExprRet
83 binary_operator(llvm::IRBuilder<>* builder, ExprNode* left, ExprNode* right, int op, int depth);
84
85 LLVMGen();
86 ~LLVMGen();
87
88 void dump() const;
89
90 # define TYPE_GEN(rtype) using rtype##_t = Super::rtype##_t;
91
92 # define X(name, _)
93 # define SSECTION(name)
94 # define EXPR(name, fun) TYPE_GEN(name)
95 # define STMT(name, fun) TYPE_GEN(name)
96 # define MOD(name, fun) TYPE_GEN(name)
97 # define MATCH(name, fun) TYPE_GEN(name)
98
99 NODEKIND_ENUM(X, SSECTION, EXPR, STMT, MOD, MATCH)
100
101 # undef X
102 # undef SSECTION
103 # undef EXPR
104 # undef STMT
105 # undef MOD
106 # undef MATCH
107 # undef TYPE_GEN
108
109 # define FUNCTION_GEN(name, fun, ret) virtual ret fun(name##_t* n, int depth);
110
111 # define X(name, _)
112 # define SSECTION(name)
113 # define MOD(name, fun) FUNCTION_GEN(name, fun, ModRet)
114 # define EXPR(name, fun) FUNCTION_GEN(name, fun, ExprRet)
115 # define STMT(name, fun) FUNCTION_GEN(name, fun, StmtRet)
116 # define MATCH(name, fun) FUNCTION_GEN(name, fun, PatRet)
117
118 NODEKIND_ENUM(X, SSECTION, EXPR, STMT, MOD, MATCH)
119
120 # undef X
121 # undef SSECTION
122 # undef EXPR
123 # undef STMT
124 # undef MOD
125 # undef MATCH
126
127 # undef FUNCTION_GEN
128 };
129
130 } // namespace lython
131
132 #endif
133 #endif
134