@@ -95,34 +95,25 @@ impl<'a> TrampolineCompiler<'a> {
95
95
self . translate_always_trap ( ) ;
96
96
}
97
97
Trampoline :: TaskBackpressure { instance } => {
98
- _ = instance;
99
- todo ! ( )
98
+ self . translate_task_backpressure_call ( * instance)
100
99
}
101
100
Trampoline :: TaskReturn { results } => self . translate_task_return_call ( * results) ,
102
101
Trampoline :: TaskWait {
103
102
instance,
104
103
async_,
105
104
memory,
106
105
} => {
107
- _ = ( instance, async_, memory) ;
108
- todo ! ( )
106
+ self . translate_task_wait_or_poll_call ( * instance, * async_, * memory, host:: task_wait)
109
107
}
110
108
Trampoline :: TaskPoll {
111
109
instance,
112
110
async_,
113
111
memory,
114
112
} => {
115
- _ = ( instance, async_, memory) ;
116
- todo ! ( )
117
- }
118
- Trampoline :: TaskYield { async_ } => {
119
- _ = async_;
120
- todo ! ( )
121
- }
122
- Trampoline :: SubtaskDrop { instance } => {
123
- _ = instance;
124
- todo ! ( )
113
+ self . translate_task_wait_or_poll_call ( * instance, * async_, * memory, host:: task_poll)
125
114
}
115
+ Trampoline :: TaskYield { async_ } => self . translate_task_yield_call ( * async_) ,
116
+ Trampoline :: SubtaskDrop { instance } => self . translate_subtask_drop_call ( * instance) ,
126
117
Trampoline :: StreamNew { ty } => {
127
118
_ = ty;
128
119
todo ! ( )
@@ -261,7 +252,16 @@ impl<'a> TrampolineCompiler<'a> {
261
252
}
262
253
}
263
254
264
- fn translate_task_return_call ( & mut self , results : TypeTupleIndex ) {
255
+ fn translate_intrinsic_libcall (
256
+ & mut self ,
257
+ vmctx : ir:: Value ,
258
+ get_libcall : fn (
259
+ & dyn TargetIsa ,
260
+ & mut ir:: Function ,
261
+ ) -> ( ir:: SigRef , ComponentBuiltinFunctionIndex ) ,
262
+ args : & [ ir:: Value ] ,
263
+ result : ir:: types:: Type ,
264
+ ) {
265
265
match self . abi {
266
266
Abi :: Wasm => { }
267
267
@@ -274,29 +274,39 @@ impl<'a> TrampolineCompiler<'a> {
274
274
}
275
275
}
276
276
277
+ let call = self . call_libcall ( vmctx, get_libcall, args) ;
278
+
279
+ if result == ir:: types:: I64 {
280
+ let result = self . builder . func . dfg . inst_results ( call) [ 0 ] ;
281
+ let result = self . raise_if_negative_one ( result) ;
282
+ self . abi_store_results ( & [ result] ) ;
283
+ } else {
284
+ if result != ir:: types:: I8 {
285
+ todo ! ( "support additional intrinsic return types" )
286
+ }
287
+ let succeeded = self . builder . func . dfg . inst_results ( call) [ 0 ] ;
288
+ self . raise_if_host_trapped ( succeeded) ;
289
+ self . builder . ins ( ) . return_ ( & [ ] ) ;
290
+ }
291
+ }
292
+
293
+ fn translate_task_return_call ( & mut self , results : TypeTupleIndex ) {
277
294
let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
278
295
let vmctx = args[ 0 ] ;
279
296
280
297
let ( values_vec_ptr, values_vec_len) = self . store_wasm_arguments ( & args[ 2 ..] ) ;
281
298
282
- let ( host_sig, index) = host:: task_return ( self . isa , & mut self . builder . func ) ;
283
- let host_fn = self . load_libcall ( vmctx, index) ;
284
-
285
299
let ty = self
286
300
. builder
287
301
. ins ( )
288
302
. iconst ( ir:: types:: I32 , i64:: from ( results. as_u32 ( ) ) ) ;
289
303
290
- let call = self . compiler . call_indirect_host (
291
- & mut self . builder ,
292
- index,
293
- host_sig,
294
- host_fn,
304
+ self . translate_intrinsic_libcall (
305
+ vmctx,
306
+ host:: task_return,
295
307
& [ vmctx, ty, values_vec_ptr, values_vec_len] ,
308
+ ir:: types:: I8 ,
296
309
) ;
297
- let succeeded = self . builder . func . dfg . inst_results ( call) [ 0 ] ;
298
- self . raise_if_host_trapped ( succeeded) ;
299
- self . builder . ins ( ) . return_ ( & [ ] ) ;
300
310
}
301
311
302
312
fn translate_async_enter_or_exit (
@@ -311,23 +321,9 @@ impl<'a> TrampolineCompiler<'a> {
311
321
) > ,
312
322
result : ir:: types:: Type ,
313
323
) {
314
- match self . abi {
315
- Abi :: Wasm => { }
316
-
317
- // These trampolines can only actually be called by Wasm, so
318
- // let's assert that here.
319
- Abi :: Array => {
320
- self . builder . ins ( ) . trap ( TRAP_INTERNAL_ASSERT ) ;
321
- return ;
322
- }
323
- }
324
-
325
324
let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
326
325
let vmctx = args[ 0 ] ;
327
326
328
- let ( host_sig, index) = get_libcall ( self . isa , & mut self . builder . func ) ;
329
- let host_fn = self . load_libcall ( vmctx, index) ;
330
-
331
327
let mut callee_args = vec ! [ vmctx] ;
332
328
333
329
if let Some ( ( callback, post_return) ) = callback_and_post_return {
@@ -361,24 +357,93 @@ impl<'a> TrampolineCompiler<'a> {
361
357
// remaining parameters
362
358
callee_args. extend ( args[ 2 ..] . iter ( ) . copied ( ) ) ;
363
359
364
- let call = self . compiler . call_indirect_host (
365
- & mut self . builder ,
366
- index,
367
- host_sig,
368
- host_fn,
360
+ self . translate_intrinsic_libcall ( vmctx, get_libcall, & callee_args, result) ;
361
+ }
362
+
363
+ fn translate_task_backpressure_call ( & mut self , caller_instance : RuntimeComponentInstanceIndex ) {
364
+ let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
365
+ let vmctx = args[ 0 ] ;
366
+
367
+ let mut callee_args = vec ! [
368
+ vmctx,
369
+ self . builder
370
+ . ins( )
371
+ . iconst( ir:: types:: I32 , i64 :: from( caller_instance. as_u32( ) ) ) ,
372
+ ] ;
373
+
374
+ callee_args. extend ( args[ 2 ..] . iter ( ) . copied ( ) ) ;
375
+
376
+ self . translate_intrinsic_libcall (
377
+ vmctx,
378
+ host:: task_backpressure,
369
379
& callee_args,
380
+ ir:: types:: I8 ,
370
381
) ;
382
+ }
371
383
372
- if result == ir:: types:: I64 {
373
- let result = self . builder . func . dfg . inst_results ( call) [ 0 ] ;
374
- let result = self . raise_if_negative_one ( result) ;
375
- self . abi_store_results ( & [ result] ) ;
376
- } else {
377
- assert ! ( result == ir:: types:: I8 ) ;
378
- let succeeded = self . builder . func . dfg . inst_results ( call) [ 0 ] ;
379
- self . raise_if_host_trapped ( succeeded) ;
380
- self . builder . ins ( ) . return_ ( & [ ] ) ;
381
- }
384
+ fn translate_task_wait_or_poll_call (
385
+ & mut self ,
386
+ caller_instance : RuntimeComponentInstanceIndex ,
387
+ async_ : bool ,
388
+ memory : RuntimeMemoryIndex ,
389
+ get_libcall : fn (
390
+ & dyn TargetIsa ,
391
+ & mut ir:: Function ,
392
+ ) -> ( ir:: SigRef , ComponentBuiltinFunctionIndex ) ,
393
+ ) {
394
+ let pointer_type = self . isa . pointer_type ( ) ;
395
+ let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
396
+ let vmctx = args[ 0 ] ;
397
+
398
+ let mut callee_args = vec ! [
399
+ vmctx,
400
+ self . builder
401
+ . ins( )
402
+ . iconst( ir:: types:: I32 , i64 :: from( caller_instance. as_u32( ) ) ) ,
403
+ self . builder
404
+ . ins( )
405
+ . iconst( ir:: types:: I8 , if async_ { 1 } else { 0 } ) ,
406
+ self . builder. ins( ) . load(
407
+ pointer_type,
408
+ MemFlags :: trusted( ) ,
409
+ vmctx,
410
+ i32 :: try_from( self . offsets. runtime_memory( memory) ) . unwrap( ) ,
411
+ ) ,
412
+ ] ;
413
+
414
+ callee_args. extend ( args[ 2 ..] . iter ( ) . copied ( ) ) ;
415
+
416
+ self . translate_intrinsic_libcall ( vmctx, get_libcall, & callee_args, ir:: types:: I64 ) ;
417
+ }
418
+
419
+ fn translate_task_yield_call ( & mut self , async_ : bool ) {
420
+ let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
421
+ let vmctx = args[ 0 ] ;
422
+
423
+ let callee_args = [
424
+ vmctx,
425
+ self . builder
426
+ . ins ( )
427
+ . iconst ( ir:: types:: I8 , if async_ { 1 } else { 0 } ) ,
428
+ ] ;
429
+
430
+ self . translate_intrinsic_libcall ( vmctx, host:: task_yield, & callee_args, ir:: types:: I8 ) ;
431
+ }
432
+
433
+ fn translate_subtask_drop_call ( & mut self , caller_instance : RuntimeComponentInstanceIndex ) {
434
+ let args = self . builder . func . dfg . block_params ( self . block0 ) . to_vec ( ) ;
435
+ let vmctx = args[ 0 ] ;
436
+
437
+ let mut callee_args = vec ! [
438
+ vmctx,
439
+ self . builder
440
+ . ins( )
441
+ . iconst( ir:: types:: I32 , i64 :: from( caller_instance. as_u32( ) ) ) ,
442
+ ] ;
443
+
444
+ callee_args. extend ( args[ 2 ..] . iter ( ) . copied ( ) ) ;
445
+
446
+ self . translate_intrinsic_libcall ( vmctx, host:: subtask_drop, & callee_args, ir:: types:: I8 ) ;
382
447
}
383
448
384
449
fn translate_lower_import (
0 commit comments