Index: libomptarget/src/exports =================================================================== --- libomptarget/src/exports +++ libomptarget/src/exports @@ -13,6 +13,8 @@ __tgt_target_data_update_nowait; __tgt_target_nowait; __tgt_target_teams_nowait; + __tgt_mapper_num_components; + __tgt_push_mapper_component; omp_get_num_devices; omp_get_initial_device; omp_target_alloc; Index: libomptarget/src/interface.cpp =================================================================== --- libomptarget/src/interface.cpp +++ libomptarget/src/interface.cpp @@ -304,6 +304,27 @@ arg_sizes, arg_types, team_num, thread_limit); } +// Get the current number of components for a user-defined mapper. +EXTERN int64_t __tgt_mapper_num_components(void *rt_mapper_handle) { + auto *MapperComponentsPtr = (struct MapperComponentsTy *)rt_mapper_handle; + int64_t size = MapperComponentsPtr->Components.size(); + DP("__tgt_mapper_num_components(Handle=" DPxMOD ") returns %" PRId64 "\n", + DPxPTR(rt_mapper_handle), size); + return size; +} + +// Push back one component for a user-defined mapper. +EXTERN void __tgt_push_mapper_component(void *rt_mapper_handle, void *base, + void *begin, int64_t size, + int64_t type) { + DP("__tgt_push_mapper_component(Handle=" DPxMOD + ") adds an entry (Base=" DPxMOD ", Begin=" DPxMOD ", Size=%" PRId64 + ", Type=0x%" PRIx64 ").\n", + DPxPTR(rt_mapper_handle), DPxPTR(base), DPxPTR(begin), size, type); + auto *MapperComponentsPtr = (struct MapperComponentsTy *)rt_mapper_handle; + MapperComponentsPtr->Components.push_back( + MapComponentInfoTy(base, begin, size, type)); +} // The trip count mechanism will be revised - this scheme is not thread-safe. EXTERN void __kmpc_push_target_tripcount(int64_t device_id, Index: libomptarget/src/private.h =================================================================== --- libomptarget/src/private.h +++ libomptarget/src/private.h @@ -41,6 +41,24 @@ typedef enum kmp_target_offload_kind kmp_target_offload_kind_t; extern kmp_target_offload_kind_t TargetOffloadPolicy; +// This structure stores information of a mapped memory region. +struct MapComponentInfoTy { + void *Base; + void *Begin; + int64_t Size; + int64_t Type; + MapComponentInfoTy() = default; + MapComponentInfoTy(void *Base, void *Begin, int64_t Size, int64_t Type) + : Base(Base), Begin(Begin), Size(Size), Type(Type) {} +}; + +// This structure stores all components of a user-defined mapper. The number of +// components are dynamically decided, so we utilize C++ STL vector +// implementation here. +struct MapperComponentsTy { + std::vector Components; +}; + //////////////////////////////////////////////////////////////////////////////// // implemtation for fatal messages ////////////////////////////////////////////////////////////////////////////////