[libomptarget][cuda] Gracefully handle missing cuda library

[libomptarget][cuda] Gracefully handle missing cuda library

If using dynamic cuda, and it failed to load, it is not safe to call
cuGetErrorString.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D95412

GitOrigin-RevId: fafd45c01f3a49a40b09a31e9ea82efc87f3ab35
diff --git a/libomptarget/plugins/cuda/dynamic_cuda/cuda.cpp b/libomptarget/plugins/cuda/dynamic_cuda/cuda.cpp
index cc7bc42..e3bd90e 100644
--- a/libomptarget/plugins/cuda/dynamic_cuda/cuda.cpp
+++ b/libomptarget/plugins/cuda/dynamic_cuda/cuda.cpp
@@ -93,7 +93,7 @@
   // Note: Called exactly once from cuda rtl.cpp in a global constructor so
   // does not need to handle being called repeatedly or concurrently
   if (!checkForCUDA()) {
-    return CUDA_ERROR_INVALID_VALUE;
+    return CUDA_ERROR_INVALID_HANDLE;
   }
   return dlwrap_cuInit(X);
 }
diff --git a/libomptarget/plugins/cuda/dynamic_cuda/cuda.h b/libomptarget/plugins/cuda/dynamic_cuda/cuda.h
index 832c269..a65f2ac 100644
--- a/libomptarget/plugins/cuda/dynamic_cuda/cuda.h
+++ b/libomptarget/plugins/cuda/dynamic_cuda/cuda.h
@@ -26,6 +26,7 @@
 typedef enum cudaError_enum {
   CUDA_SUCCESS = 0,
   CUDA_ERROR_INVALID_VALUE = 1,
+  CUDA_ERROR_INVALID_HANDLE = 400,
 } CUresult;
 
 typedef enum CUstream_flags_enum {
diff --git a/libomptarget/plugins/cuda/src/rtl.cpp b/libomptarget/plugins/cuda/src/rtl.cpp
index e4ac1e0..732824a 100644
--- a/libomptarget/plugins/cuda/src/rtl.cpp
+++ b/libomptarget/plugins/cuda/src/rtl.cpp
@@ -401,6 +401,11 @@
     DP("Start initializing CUDA\n");
 
     CUresult Err = cuInit(0);
+    if (Err == CUDA_ERROR_INVALID_HANDLE) {
+      // Can't call cuGetErrorString if dlsym failed
+      DP("Failed to load CUDA shared library\n");
+      return;
+    }
     if (!checkResult(Err, "Error returned from cuInit\n")) {
       return;
     }