Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / openmp / libomptarget / plugins-nextgen / amdgpu / dynamic_hsa / hsa.cpp
blob8f73a03cfeebba29eeb3be9103fa7d5f910e2fb2
1 //===--- amdgpu/dynamic_hsa/hsa.cpp ------------------------------- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Implement subset of hsa api by calling into hsa library via dlopen
10 // Does the dlopen/dlsym calls as part of the call to hsa_init
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Support/DynamicLibrary.h"
16 #include "Debug.h"
17 #include "dlwrap.h"
18 #include "hsa.h"
19 #include "hsa_ext_amd.h"
20 #include <memory>
22 DLWRAP_INITIALIZE()
24 DLWRAP_INTERNAL(hsa_init, 0)
26 DLWRAP(hsa_status_string, 2)
27 DLWRAP(hsa_shut_down, 0)
28 DLWRAP(hsa_system_get_info, 2)
29 DLWRAP(hsa_agent_get_info, 3)
30 DLWRAP(hsa_isa_get_info_alt, 3)
31 DLWRAP(hsa_iterate_agents, 2)
32 DLWRAP(hsa_agent_iterate_isas, 3)
33 DLWRAP(hsa_signal_create, 4)
34 DLWRAP(hsa_signal_destroy, 1)
35 DLWRAP(hsa_signal_store_relaxed, 2)
36 DLWRAP(hsa_signal_store_screlease, 2)
37 DLWRAP(hsa_signal_wait_scacquire, 5)
38 DLWRAP(hsa_signal_load_scacquire, 1)
39 DLWRAP(hsa_signal_subtract_screlease, 2)
40 DLWRAP(hsa_queue_create, 8)
41 DLWRAP(hsa_queue_destroy, 1)
42 DLWRAP(hsa_queue_load_read_index_scacquire, 1)
43 DLWRAP(hsa_queue_add_write_index_relaxed, 2)
44 DLWRAP(hsa_memory_copy, 3)
45 DLWRAP(hsa_executable_create, 4)
46 DLWRAP(hsa_executable_create_alt, 4)
47 DLWRAP(hsa_executable_destroy, 1)
48 DLWRAP(hsa_executable_freeze, 2)
49 DLWRAP(hsa_executable_validate, 2)
50 DLWRAP(hsa_executable_symbol_get_info, 3)
51 DLWRAP(hsa_executable_get_symbol_by_name, 4)
52 DLWRAP(hsa_executable_iterate_symbols, 3)
53 DLWRAP(hsa_code_object_deserialize, 4)
54 DLWRAP(hsa_executable_load_code_object, 4)
55 DLWRAP(hsa_code_object_destroy, 1)
56 DLWRAP(hsa_amd_agent_memory_pool_get_info, 4)
57 DLWRAP(hsa_amd_agent_iterate_memory_pools, 3)
58 DLWRAP(hsa_amd_memory_pool_allocate, 4)
59 DLWRAP(hsa_amd_memory_pool_free, 1)
60 DLWRAP(hsa_amd_memory_async_copy, 8)
61 DLWRAP(hsa_amd_memory_pool_get_info, 3)
62 DLWRAP(hsa_amd_agents_allow_access, 4)
63 DLWRAP(hsa_amd_memory_lock, 5)
64 DLWRAP(hsa_amd_memory_unlock, 1)
65 DLWRAP(hsa_amd_memory_fill, 3)
66 DLWRAP(hsa_amd_register_system_event_handler, 2)
67 DLWRAP(hsa_amd_signal_create, 5)
68 DLWRAP(hsa_amd_signal_async_handler, 5)
69 DLWRAP(hsa_amd_pointer_info, 5)
71 DLWRAP_FINALIZE()
73 #ifndef DYNAMIC_HSA_PATH
74 #define DYNAMIC_HSA_PATH "libhsa-runtime64.so"
75 #endif
77 #ifndef TARGET_NAME
78 #error "Missing TARGET_NAME macro"
79 #endif
80 #ifndef DEBUG_PREFIX
81 #define DEBUG_PREFIX "Target " GETNAME(TARGET_NAME) " RTL"
82 #endif
84 static bool checkForHSA() {
85 // return true if dlopen succeeded and all functions found
87 const char *HsaLib = DYNAMIC_HSA_PATH;
88 std::string ErrMsg;
89 auto DynlibHandle = std::make_unique<llvm::sys::DynamicLibrary>(
90 llvm::sys::DynamicLibrary::getPermanentLibrary(HsaLib, &ErrMsg));
91 if (!DynlibHandle->isValid()) {
92 DP("Unable to load library '%s': %s!\n", HsaLib, ErrMsg.c_str());
93 return false;
96 for (size_t I = 0; I < dlwrap::size(); I++) {
97 const char *Sym = dlwrap::symbol(I);
99 void *P = DynlibHandle->getAddressOfSymbol(Sym);
100 if (P == nullptr) {
101 DP("Unable to find '%s' in '%s'!\n", Sym, HsaLib);
102 return false;
104 DP("Implementing %s with dlsym(%s) -> %p\n", Sym, Sym, P);
106 *dlwrap::pointer(I) = P;
109 return true;
112 hsa_status_t hsa_init() {
113 if (!checkForHSA()) {
114 return HSA_STATUS_ERROR;
116 return dlwrap_hsa_init();