diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp --- a/openmp/libomptarget/src/omptarget.cpp +++ b/openmp/libomptarget/src/omptarget.cpp @@ -72,6 +72,11 @@ ii = HostEntriesBeginToTransTable.begin(); ii != HostEntriesBeginToTransTable.end(); ++ii) { TranslationTable *TransTable = &ii->second; + if (TransTable->HostTable.EntriesBegin == + TransTable->HostTable.EntriesEnd) { + // No host entry so no need to proceed + continue; + } if (TransTable->TargetsTable[device_id] != 0) { // Library entries have already been processed continue; diff --git a/openmp/libomptarget/src/rtl.cpp b/openmp/libomptarget/src/rtl.cpp --- a/openmp/libomptarget/src/rtl.cpp +++ b/openmp/libomptarget/src/rtl.cpp @@ -234,8 +234,6 @@ // Attempt to load all plugins available in the system. std::call_once(initFlag, &RTLsTy::LoadRTLs, this); - if (desc->HostEntriesBegin == desc->HostEntriesEnd) - return; RTLsMtx.lock(); // Register the images with the RTLs that understand them, if any. for (int32_t i = 0; i < desc->NumDeviceImages; ++i) { @@ -322,8 +320,6 @@ void RTLsTy::UnregisterLib(__tgt_bin_desc *desc) { DP("Unloading target library!\n"); - if (desc->HostEntriesBegin == desc->HostEntriesEnd) - return; RTLsMtx.lock(); // Find which RTL understands each image, if any. for (int32_t i = 0; i < desc->NumDeviceImages; ++i) { diff --git a/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c b/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c new file mode 100644 --- /dev/null +++ b/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c @@ -0,0 +1,30 @@ +// 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 + +static int test_omp_get_num_devices_with_empty_target() { + /* checks that omp_get_num_devices() > 0 */ + return omp_get_num_devices() > 0; +} + +int main() { + int failed = 0; + + if (!test_omp_get_num_devices_with_empty_target()) { + ++failed; + } + + if (failed) { + printf("FAIL\n"); + } else { + printf("PASS\n"); + } + + return failed; +} + +// CHECK: PASS