@@ -448,14 +448,19 @@ pub(crate) fn gen_define_handling<'ll>(
448448 transfer. iter ( ) . map ( |m| m. intersection ( valid_begin_mappings) . bits ( ) ) . collect ( ) ;
449449 let transfer_from: Vec < u64 > =
450450 transfer. iter ( ) . map ( |m| m. intersection ( MappingFlags :: FROM ) . bits ( ) ) . collect ( ) ;
451+ let valid_kernel_mappings = MappingFlags :: LITERAL | MappingFlags :: IMPLICIT ;
451452 // FIXME(offload): add `OMP_MAP_TARGET_PARAM = 0x20` only if necessary
452- let transfer_kernel = vec ! [ MappingFlags :: TARGET_PARAM . bits( ) ; transfer_to. len( ) ] ;
453+ let transfer_kernel: Vec < u64 > = transfer
454+ . iter ( )
455+ . map ( |m| ( m. intersection ( valid_kernel_mappings) | MappingFlags :: TARGET_PARAM ) . bits ( ) )
456+ . collect ( ) ;
453457
454458 let actual_sizes = sizes
455459 . iter ( )
456460 . map ( |s| match s {
457461 OffloadSize :: Static ( sz) => * sz,
458- OffloadSize :: Dynamic => 0 ,
462+ // NOTE(Sa4dUs): set `.offload_sizes` entry to 0 for sizes that we determine at runtime, just like clang
463+ _ => 0 ,
459464 } )
460465 . collect :: < Vec < _ > > ( ) ;
461466 let offload_sizes =
@@ -542,12 +547,20 @@ pub(crate) fn scalar_width<'ll>(cx: &'ll SimpleCx<'_>, ty: &'ll Type) -> u64 {
542547}
543548
544549fn get_runtime_size < ' ll , ' tcx > (
545- _cx : & CodegenCx < ' ll , ' tcx > ,
546- _val : & ' ll Value ,
547- _meta : & OffloadMetadata ,
550+ builder : & mut Builder < ' _ , ' ll , ' tcx > ,
551+ args : & [ & ' ll Value ] ,
552+ index : usize ,
553+ meta : & OffloadMetadata ,
548554) -> & ' ll Value {
549- // FIXME(Sa4dUs): handle dynamic-size data (e.g. slices)
550- bug ! ( "offload does not support dynamic sizes yet" ) ;
555+ match meta. payload_size {
556+ OffloadSize :: Slice { element_size } => {
557+ let length_idx = index + 1 ;
558+ let length = args[ length_idx] ;
559+ let length_i64 = builder. intcast ( length, builder. cx . type_i64 ( ) , false ) ;
560+ builder. mul ( length_i64, builder. cx . get_const_i64 ( element_size) )
561+ }
562+ _ => bug ! ( "unexpected offload size {:?}" , meta. payload_size) ,
563+ }
551564}
552565
553566// For each kernel *call*, we now use some of our previous declared globals to move data to and from
@@ -588,7 +601,7 @@ pub(crate) fn gen_call_handling<'ll, 'tcx>(
588601 let OffloadKernelDims { num_workgroups, threads_per_block, workgroup_dims, thread_dims } =
589602 offload_dims;
590603
591- let has_dynamic = metadata. iter ( ) . any ( |m| matches ! ( m. payload_size, OffloadSize :: Dynamic ) ) ;
604+ let has_dynamic = metadata. iter ( ) . any ( |m| ! matches ! ( m. payload_size, OffloadSize :: Static ( _ ) ) ) ;
592605
593606 let tgt_decl = offload_globals. launcher_fn ;
594607 let tgt_target_kernel_ty = offload_globals. launcher_ty ;
@@ -683,9 +696,9 @@ pub(crate) fn gen_call_handling<'ll, 'tcx>(
683696 let gep2 = builder. inbounds_gep ( ty, a2, & [ i32_0, idx] ) ;
684697 builder. store ( geps[ i as usize ] , gep2, Align :: EIGHT ) ;
685698
686- if matches ! ( metadata[ i as usize ] . payload_size, OffloadSize :: Dynamic ) {
699+ if ! matches ! ( metadata[ i as usize ] . payload_size, OffloadSize :: Static ( _ ) ) {
687700 let gep3 = builder. inbounds_gep ( ty2, a4, & [ i32_0, idx] ) ;
688- let size_val = get_runtime_size ( cx , args[ i as usize ] , & metadata[ i as usize ] ) ;
701+ let size_val = get_runtime_size ( builder , args, i as usize , & metadata[ i as usize ] ) ;
689702 builder. store ( size_val, gep3, Align :: EIGHT ) ;
690703 }
691704 }
0 commit comments