@@ -8,7 +8,7 @@ use rustc_codegen_ssa::common::TypeKind;
88use rustc_codegen_ssa:: mir:: operand:: { OperandRef , OperandValue } ;
99use rustc_codegen_ssa:: traits:: { BaseTypeCodegenMethods , BuilderMethods } ;
1010use rustc_middle:: bug;
11- use rustc_middle:: ty:: offload_meta:: { MappingFlags , OffloadMetadata , OffloadSize } ;
11+ use rustc_middle:: ty:: offload_meta:: { DynamicSize , MappingFlags , OffloadMetadata , OffloadSize } ;
1212
1313use crate :: builder:: Builder ;
1414use crate :: common:: CodegenCx ;
@@ -448,14 +448,18 @@ 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+ OffloadSize :: Dynamic ( _ ) => 0 ,
459463 } )
460464 . collect :: < Vec < _ > > ( ) ;
461465 let offload_sizes =
@@ -542,12 +546,20 @@ pub(crate) fn scalar_width<'ll>(cx: &'ll SimpleCx<'_>, ty: &'ll Type) -> u64 {
542546}
543547
544548fn get_runtime_size < ' ll , ' tcx > (
545- _cx : & CodegenCx < ' ll , ' tcx > ,
546- _val : & ' ll Value ,
547- _meta : & OffloadMetadata ,
549+ builder : & mut Builder < ' _ , ' ll , ' tcx > ,
550+ args : & [ & ' ll Value ] ,
551+ index : usize ,
552+ meta : & OffloadMetadata ,
548553) -> & ' ll Value {
549- // FIXME(Sa4dUs): handle dynamic-size data (e.g. slices)
550- bug ! ( "offload does not support dynamic sizes yet" ) ;
554+ match meta. payload_size {
555+ OffloadSize :: Dynamic ( DynamicSize :: Slice { element_size } ) => {
556+ let length_idx = index + 1 ;
557+ let length = args[ length_idx] ;
558+ let length_i64 = builder. intcast ( length, builder. cx . type_i64 ( ) , false ) ;
559+ builder. mul ( length_i64, builder. cx . get_const_i64 ( element_size) )
560+ }
561+ OffloadSize :: Static ( _) => bug ! ( "expected dynamic size" ) ,
562+ }
551563}
552564
553565// For each kernel *call*, we now use some of our previous declared globals to move data to and from
@@ -588,7 +600,7 @@ pub(crate) fn gen_call_handling<'ll, 'tcx>(
588600 let OffloadKernelDims { num_workgroups, threads_per_block, workgroup_dims, thread_dims } =
589601 offload_dims;
590602
591- let has_dynamic = metadata. iter ( ) . any ( |m| matches ! ( m. payload_size, OffloadSize :: Dynamic ) ) ;
603+ let has_dynamic = metadata. iter ( ) . any ( |m| matches ! ( m. payload_size, OffloadSize :: Dynamic ( _ ) ) ) ;
592604
593605 let tgt_decl = offload_globals. launcher_fn ;
594606 let tgt_target_kernel_ty = offload_globals. launcher_ty ;
@@ -683,9 +695,9 @@ pub(crate) fn gen_call_handling<'ll, 'tcx>(
683695 let gep2 = builder. inbounds_gep ( ty, a2, & [ i32_0, idx] ) ;
684696 builder. store ( geps[ i as usize ] , gep2, Align :: EIGHT ) ;
685697
686- if matches ! ( metadata[ i as usize ] . payload_size, OffloadSize :: Dynamic ) {
698+ if matches ! ( metadata[ i as usize ] . payload_size, OffloadSize :: Dynamic ( _ ) ) {
687699 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 ] ) ;
700+ let size_val = get_runtime_size ( builder , args, i as usize , & metadata[ i as usize ] ) ;
689701 builder. store ( size_val, gep3, Align :: EIGHT ) ;
690702 }
691703 }
0 commit comments