diff --git a/openmp/libomptarget/plugins/amdgpu/impl/system.cpp b/openmp/libomptarget/plugins/amdgpu/impl/system.cpp --- a/openmp/libomptarget/plugins/amdgpu/impl/system.cpp +++ b/openmp/libomptarget/plugins/amdgpu/impl/system.cpp @@ -20,6 +20,20 @@ #include "msgpack.h" +namespace hsa { +// Wrap HSA iterate API in a shim that allows passing general callables +template +hsa_status_t executable_iterate_symbols(hsa_executable_t executable, C cb) { + auto L = [](hsa_executable_t executable, hsa_executable_symbol_t symbol, + void *data) -> hsa_status_t { + C *unwrapped = static_cast(data); + return (*unwrapped)(executable, symbol); + }; + return hsa_executable_iterate_symbols(executable, L, + static_cast(&cb)); +} +} // namespace hsa + typedef unsigned char *address; /* * Note descriptors. @@ -998,8 +1012,7 @@ static hsa_status_t populate_InfoTables(hsa_executable_t executable, hsa_executable_symbol_t symbol, - void *data) { - int gpu = *static_cast(data); + int gpu) { hsa_symbol_kind_t type; uint32_t name_length; @@ -1228,8 +1241,11 @@ return ATMI_STATUS_ERROR; } - err = hsa_executable_iterate_symbols(executable, populate_InfoTables, - static_cast(&gpu)); + err = hsa::executable_iterate_symbols( + executable, + [&](hsa_executable_t ex, hsa_executable_symbol_t symbol) + -> hsa_status_t { return populate_InfoTables(ex, symbol, gpu); }); + if (err != HSA_STATUS_SUCCESS) { printf("[%s:%d] %s failed: %s\n", __FILE__, __LINE__, "Iterating over symbols for execuatable", get_error_string(err));