Index: openmp/trunk/libomptarget/src/exports =================================================================== --- openmp/trunk/libomptarget/src/exports +++ openmp/trunk/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: openmp/trunk/libomptarget/src/interface.cpp =================================================================== --- openmp/trunk/libomptarget/src/interface.cpp +++ openmp/trunk/libomptarget/src/interface.cpp @@ -304,6 +304,28 @@ 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)); +} + EXTERN void __kmpc_push_target_tripcount(int64_t device_id, uint64_t loop_tripcount) { if (IsOffloadDisabled()) Index: openmp/trunk/libomptarget/src/private.h =================================================================== --- openmp/trunk/libomptarget/src/private.h +++ openmp/trunk/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 //////////////////////////////////////////////////////////////////////////////// Index: openmp/trunk/libomptarget/test/mapping/declare_mapper_api.cpp =================================================================== --- openmp/trunk/libomptarget/test/mapping/declare_mapper_api.cpp +++ openmp/trunk/libomptarget/test/mapping/declare_mapper_api.cpp @@ -0,0 +1,46 @@ +// RUN: %libomptarget-compile-run-and-check-aarch64-unknown-linux-gnu +// RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu +// RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu +// RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu + +#include +#include + +// Data structure definitions copied from OpenMP RTL. +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) {} +}; + +struct MapperComponentsTy { + std::vector Components; +}; + +// OpenMP RTL interfaces +#ifdef __cplusplus +extern "C" { +#endif +int64_t __tgt_mapper_num_components(void *rt_mapper_handle); +void __tgt_push_mapper_component(void *rt_mapper_handle, void *base, + void *begin, int64_t size, int64_t type); +#ifdef __cplusplus +} +#endif + +int main(int argc, char *argv[]) { + MapperComponentsTy MC; + void *base, *begin; + int64_t size, type; + // Push 2 elements into MC. + __tgt_push_mapper_component((void *)&MC, base, begin, size, type); + __tgt_push_mapper_component((void *)&MC, base, begin, size, type); + int64_t num = __tgt_mapper_num_components((void *)&MC); + // CHECK: num=2 + printf("num=%lld\n", num); + return 0; +}