11
11
#include <llvm-c/Transforms/PassBuilder.h>
12
12
#include <stdlib.h>
13
13
14
+ #include "jit-cache.h"
14
15
#include "jit.h"
15
16
#include "riscv_private.h"
16
17
@@ -49,15 +50,15 @@ FORCE_INLINE LLVMBasicBlockRef t2c_block_map_search(struct LLVM_block_map *map,
49
50
return NULL ;
50
51
}
51
52
52
- #define T2C_OP (inst , code ) \
53
- static void t2c_##inst( \
54
- LLVMBuilderRef *builder UNUSED, LLVMTypeRef *param_types UNUSED, \
55
- LLVMValueRef start UNUSED, LLVMBasicBlockRef *entry UNUSED, \
56
- LLVMBuilderRef *taken_builder UNUSED, \
57
- LLVMBuilderRef *untaken_builder UNUSED, uint64_t mem_base UNUSED, \
58
- rv_insn_t *ir UNUSED) \
59
- { \
60
- code; \
53
+ #define T2C_OP (inst , code ) \
54
+ static void t2c_##inst( \
55
+ LLVMBuilderRef *builder UNUSED, LLVMTypeRef *param_types UNUSED, \
56
+ LLVMValueRef start UNUSED, LLVMBasicBlockRef *entry UNUSED, \
57
+ LLVMBuilderRef *taken_builder UNUSED, \
58
+ LLVMBuilderRef *untaken_builder UNUSED, riscv_t *rv UNUSED, \
59
+ uint64_t mem_base UNUSED, rv_insn_t *ir UNUSED) \
60
+ { \
61
+ code; \
61
62
}
62
63
63
64
#define T2C_LLVM_GEN_ADDR (reg , rv_member , ir_member ) \
@@ -135,6 +136,12 @@ FORCE_INLINE void t2c_gen_call_io_func(LLVMValueRef start,
135
136
& io_param , 1 , "" );
136
137
}
137
138
139
+ static bool t2c_jit_cache_triggered ;
140
+ static LLVMTypeRef t2c_t1c_cache_func_proto ;
141
+ static LLVMValueRef t2c_t1c_cache_func ;
142
+ static LLVMTypeRef t2c_t2c_cache_func_proto ;
143
+ static LLVMTypeRef jit_cache_ty ;
144
+
138
145
#include "t2c_template.c"
139
146
#undef T2C_OP
140
147
@@ -174,14 +181,15 @@ typedef void (*t2c_codegen_block_func_t)(LLVMBuilderRef *builder UNUSED,
174
181
LLVMBasicBlockRef * entry UNUSED ,
175
182
LLVMBuilderRef * taken_builder UNUSED ,
176
183
LLVMBuilderRef * untaken_builder UNUSED ,
184
+ riscv_t * rv UNUSED ,
177
185
uint64_t mem_base UNUSED ,
178
186
rv_insn_t * ir UNUSED );
179
187
180
188
static void t2c_trace_ebb (LLVMBuilderRef * builder ,
181
189
LLVMTypeRef * param_types UNUSED ,
182
190
LLVMValueRef start ,
183
191
LLVMBasicBlockRef * entry ,
184
- uint64_t mem_base ,
192
+ riscv_t * rv ,
185
193
rv_insn_t * ir ,
186
194
set_t * set ,
187
195
struct LLVM_block_map * map )
@@ -194,7 +202,8 @@ static void t2c_trace_ebb(LLVMBuilderRef *builder,
194
202
195
203
while (1 ) {
196
204
((t2c_codegen_block_func_t ) dispatch_table [ir -> opcode ])(
197
- builder , param_types , start , entry , & tk , & utk , mem_base , ir );
205
+ builder , param_types , start , entry , & tk , & utk , rv ,
206
+ (uint64_t ) ((memory_t * ) PRIV (rv )-> mem )-> mem_base , ir );
198
207
if (!ir -> next )
199
208
break ;
200
209
ir = ir -> next ;
@@ -214,8 +223,7 @@ static void t2c_trace_ebb(LLVMBuilderRef *builder,
214
223
LLVMPositionBuilderAtEnd (untaken_builder , untaken_entry );
215
224
LLVMBuildBr (utk , untaken_entry );
216
225
t2c_trace_ebb (& untaken_builder , param_types , start ,
217
- & untaken_entry , mem_base , ir -> branch_untaken , set ,
218
- map );
226
+ & untaken_entry , rv , ir -> branch_untaken , set , map );
219
227
}
220
228
}
221
229
if (ir -> branch_taken ) {
@@ -230,14 +238,16 @@ static void t2c_trace_ebb(LLVMBuilderRef *builder,
230
238
LLVMPositionBuilderAtEnd (taken_builder , taken_entry );
231
239
LLVMBuildBr (tk , taken_entry );
232
240
t2c_trace_ebb (& taken_builder , param_types , start , & taken_entry ,
233
- mem_base , ir -> branch_taken , set , map );
241
+ rv , ir -> branch_taken , set , map );
234
242
}
235
243
}
236
244
}
237
245
}
238
246
239
- void t2c_compile (block_t * block , uint64_t mem_base )
247
+ void t2c_compile (riscv_t * rv , block_t * block )
240
248
{
249
+ t2c_jit_cache_triggered = false;
250
+
241
251
LLVMModuleRef module = LLVMModuleCreateWithName ("my_module" );
242
252
LLVMTypeRef io_members [] = {
243
253
LLVMPointerType (LLVMVoidType (), 0 ), LLVMPointerType (LLVMVoidType (), 0 ),
@@ -254,6 +264,22 @@ void t2c_compile(block_t *block, uint64_t mem_base)
254
264
LLVMTypeRef param_types [] = {LLVMPointerType (struct_rv , 0 )};
255
265
LLVMValueRef start = LLVMAddFunction (
256
266
module , "start" , LLVMFunctionType (LLVMVoidType (), param_types , 1 , 0 ));
267
+
268
+ LLVMTypeRef t1c_args [2 ] = {LLVMInt64Type (), LLVMInt64Type ()};
269
+ t2c_t1c_cache_func_proto =
270
+ LLVMFunctionType (LLVMVoidType (), t1c_args , 2 , false);
271
+ t2c_t1c_cache_func =
272
+ LLVMAddFunction (module , "t2c_invoke_cache" , t2c_t1c_cache_func_proto );
273
+
274
+ LLVMTypeRef t2c_args [1 ] = {LLVMInt64Type ()};
275
+ t2c_t2c_cache_func_proto =
276
+ LLVMFunctionType (LLVMVoidType (), t2c_args , 1 , false);
277
+
278
+ /* Notice to the alignment */
279
+ LLVMTypeRef jit_cache_memb [3 ] = {LLVMInt32Type (), LLVMInt32Type (),
280
+ LLVMPointerType (LLVMVoidType (), 0 )};
281
+ jit_cache_ty = LLVMStructType (jit_cache_memb , 3 , false);
282
+
257
283
LLVMBasicBlockRef first_block = LLVMAppendBasicBlock (start , "first_block" );
258
284
LLVMBuilderRef first_builder = LLVMCreateBuilder ();
259
285
LLVMPositionBuilderAtEnd (first_builder , first_block );
@@ -266,8 +292,8 @@ void t2c_compile(block_t *block, uint64_t mem_base)
266
292
struct LLVM_block_map map ;
267
293
map .count = 0 ;
268
294
/* Translate custon IR into LLVM IR */
269
- t2c_trace_ebb (& builder , param_types , start , & entry , mem_base ,
270
- block -> ir_head , & set , & map );
295
+ t2c_trace_ebb (& builder , param_types , start , & entry , rv , block -> ir_head ,
296
+ & set , & map );
271
297
/* Offload LLVM IR to LLVM backend */
272
298
char * error = NULL , * triple = LLVMGetDefaultTargetTriple ();
273
299
LLVMExecutionEngineRef engine ;
@@ -296,7 +322,13 @@ void t2c_compile(block_t *block, uint64_t mem_base)
296
322
abort ();
297
323
}
298
324
325
+ if (t2c_jit_cache_triggered ) {
326
+ LLVMAddGlobalMapping (engine , t2c_t1c_cache_func ,
327
+ ((struct jit_state * ) rv -> jit_state )-> buf );
328
+ }
329
+
299
330
/* Return the function pointer of T2C generated machine code */
300
331
block -> func = (exec_t2c_func_t ) LLVMGetPointerToGlobal (engine , start );
332
+ jit_cache_update (rv -> jit_cache , block -> pc_start , 2 , block -> func );
301
333
block -> hot2 = true;
302
334
}
0 commit comments