[OpenMP] Add support for mapping names in mapper API
Summary:
The custom mapper API did not previously support the mapping names added previously. This means they were not present if a user requested debugging information while using the mapper functions. This adds basic support for passing the mapped names to the runtime library.
Reviewers: jdoerfert
Differential Revision: https://reviews.llvm.org/D94806
GitOrigin-RevId: e4eaf9d82064901ff028332d1644eddafac73f69
diff --git a/libomptarget/src/interface.cpp b/libomptarget/src/interface.cpp
index b5af0b1..c773e1f 100644
--- a/libomptarget/src/interface.cpp
+++ b/libomptarget/src/interface.cpp
@@ -487,16 +487,17 @@
// 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) {
+ void *begin, int64_t size, int64_t type,
+ void *name) {
TIMESCOPE();
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);
+ ", Type=0x%" PRIx64 ", Name=%s).\n",
+ DPxPTR(rt_mapper_handle), DPxPTR(base), DPxPTR(begin), size, type,
+ (name) ? getNameFromMapping(name).c_str() : "unknown");
auto *MapperComponentsPtr = (struct MapperComponentsTy *)rt_mapper_handle;
MapperComponentsPtr->Components.push_back(
- MapComponentInfoTy(base, begin, size, type));
+ MapComponentInfoTy(base, begin, size, type, name));
}
EXTERN void __kmpc_push_target_tripcount(ident_t *loc, int64_t device_id,
diff --git a/libomptarget/src/omptarget.cpp b/libomptarget/src/omptarget.cpp
index 0846e99..8cb16a4 100644
--- a/libomptarget/src/omptarget.cpp
+++ b/libomptarget/src/omptarget.cpp
@@ -209,15 +209,16 @@
/// Call the user-defined mapper function followed by the appropriate
// target_data_* function (target_data_{begin,end,update}).
int targetDataMapper(DeviceTy &Device, void *arg_base, void *arg,
- int64_t arg_size, int64_t arg_type, void *arg_mapper,
+ int64_t arg_size, int64_t arg_type,
+ map_var_info_t arg_names, void *arg_mapper,
TargetDataFuncPtrTy target_data_function) {
DP("Calling the mapper function " DPxMOD "\n", DPxPTR(arg_mapper));
// The mapper function fills up Components.
MapperComponentsTy MapperComponents;
MapperFuncPtrTy MapperFuncPtr = (MapperFuncPtrTy)(arg_mapper);
- (*MapperFuncPtr)((void *)&MapperComponents, arg_base, arg, arg_size,
- arg_type);
+ (*MapperFuncPtr)((void *)&MapperComponents, arg_base, arg, arg_size, arg_type,
+ arg_names);
// Construct new arrays for args_base, args, arg_sizes and arg_types
// using the information in MapperComponents and call the corresponding
@@ -226,6 +227,7 @@
std::vector<void *> MapperArgs(MapperComponents.Components.size());
std::vector<int64_t> MapperArgSizes(MapperComponents.Components.size());
std::vector<int64_t> MapperArgTypes(MapperComponents.Components.size());
+ std::vector<void *> MapperArgNames(MapperComponents.Components.size());
for (unsigned I = 0, E = MapperComponents.Components.size(); I < E; ++I) {
auto &C =
@@ -235,12 +237,13 @@
MapperArgs[I] = C.Begin;
MapperArgSizes[I] = C.Size;
MapperArgTypes[I] = C.Type;
+ MapperArgNames[I] = C.Name;
}
int rc = target_data_function(Device, MapperComponents.Components.size(),
MapperArgsBase.data(), MapperArgs.data(),
MapperArgSizes.data(), MapperArgTypes.data(),
- /*arg_names*/ nullptr, /*arg_mappers*/ nullptr,
+ MapperArgNames.data(), /*arg_mappers*/ nullptr,
/*__tgt_async_info*/ nullptr);
return rc;
@@ -264,8 +267,10 @@
// with new arguments.
DP("Calling targetDataMapper for the %dth argument\n", i);
+ map_var_info_t arg_name = (!arg_names) ? nullptr : arg_names[i];
int rc = targetDataMapper(Device, args_base[i], args[i], arg_sizes[i],
- arg_types[i], arg_mappers[i], targetDataBegin);
+ arg_types[i], arg_name, arg_mappers[i],
+ targetDataBegin);
if (rc != OFFLOAD_SUCCESS) {
REPORT("Call to targetDataBegin via targetDataMapper for custom mapper"
@@ -329,7 +334,7 @@
// PTR_AND_OBJ entry is handled below, and so the allocation might fail
// when HasPresentModifier.
PointerTgtPtrBegin = Device.getOrAllocTgtPtr(
- HstPtrBase, HstPtrBase, sizeof(void *), HstPtrName, Pointer_IsNew,
+ HstPtrBase, HstPtrBase, sizeof(void *), nullptr, Pointer_IsNew,
IsHostPtr, IsImplicit, UpdateRef, HasCloseModifier,
HasPresentModifier);
if (!PointerTgtPtrBegin) {
@@ -464,8 +469,10 @@
// with new arguments.
DP("Calling targetDataMapper for the %dth argument\n", I);
- Ret = targetDataMapper(Device, ArgBases[I], Args[I], ArgSizes[I],
- ArgTypes[I], ArgMappers[I], targetDataEnd);
+ map_var_info_t ArgName = (!ArgNames) ? nullptr : ArgNames[I];
+ Ret =
+ targetDataMapper(Device, ArgBases[I], Args[I], ArgSizes[I],
+ ArgTypes[I], ArgName, ArgMappers[I], targetDataEnd);
if (Ret != OFFLOAD_SUCCESS) {
REPORT("Call to targetDataEnd via targetDataMapper for custom mapper"
@@ -785,8 +792,10 @@
// with new arguments.
DP("Calling targetDataMapper for the %dth argument\n", I);
+ map_var_info_t ArgName = (!ArgNames) ? nullptr : ArgNames[I];
int Ret = targetDataMapper(Device, ArgsBase[I], Args[I], ArgSizes[I],
- ArgTypes[I], ArgMappers[I], targetDataUpdate);
+ ArgTypes[I], ArgName, ArgMappers[I],
+ targetDataUpdate);
if (Ret != OFFLOAD_SUCCESS) {
REPORT("Call to targetDataUpdate via targetDataMapper for custom mapper"
diff --git a/libomptarget/src/private.h b/libomptarget/src/private.h
index 00826ae..2267298 100644
--- a/libomptarget/src/private.h
+++ b/libomptarget/src/private.h
@@ -48,9 +48,11 @@
void *Begin;
int64_t Size;
int64_t Type;
+ void *Name;
MapComponentInfoTy() = default;
- MapComponentInfoTy(void *Base, void *Begin, int64_t Size, int64_t Type)
- : Base(Base), Begin(Begin), Size(Size), Type(Type) {}
+ MapComponentInfoTy(void *Base, void *Begin, int64_t Size, int64_t Type,
+ void *Name)
+ : Base(Base), Begin(Begin), Size(Size), Type(Type), Name(Name) {}
};
// This structure stores all components of a user-defined mapper. The number of
@@ -64,8 +66,10 @@
// The mapper function pointer type. It follows the signature below:
// void .omp_mapper.<type_name>.<mapper_id>.(void *rt_mapper_handle,
// void *base, void *begin,
-// size_t size, int64_t type);
-typedef void (*MapperFuncPtrTy)(void *, void *, void *, int64_t, int64_t);
+// size_t size, int64_t type,
+// void * name);
+typedef void (*MapperFuncPtrTy)(void *, void *, void *, int64_t, int64_t,
+ void *);
// Function pointer type for target_data_* functions (targetDataBegin,
// targetDataEnd and targetDataUpdate).
diff --git a/libomptarget/test/mapping/declare_mapper_api.cpp b/libomptarget/test/mapping/declare_mapper_api.cpp
index 54a5ad6..eda0c86 100644
--- a/libomptarget/test/mapping/declare_mapper_api.cpp
+++ b/libomptarget/test/mapping/declare_mapper_api.cpp
@@ -15,9 +15,10 @@
void *Begin;
int64_t Size;
int64_t Type;
+ void *Name;
MapComponentInfoTy() = default;
- MapComponentInfoTy(void *Base, void *Begin, int64_t Size, int64_t Type)
- : Base(Base), Begin(Begin), Size(Size), Type(Type) {}
+ MapComponentInfoTy(void *Base, void *Begin, int64_t Size, int64_t Type, void *Name)
+ : Base(Base), Begin(Begin), Size(Size), Type(Type), Name(Name) {}
};
struct MapperComponentsTy {
@@ -30,7 +31,8 @@
#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);
+ void *begin, int64_t size, int64_t type,
+ void *name);
#ifdef __cplusplus
}
#endif
@@ -40,8 +42,8 @@
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);
+ __tgt_push_mapper_component((void *)&MC, base, begin, size, type, nullptr);
+ __tgt_push_mapper_component((void *)&MC, base, begin, size, type, nullptr);
int64_t num = __tgt_mapper_num_components((void *)&MC);
// CHECK: num=2
printf("num=%" PRId64 "\n", num);