brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · bc92f4a Raw
122 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// Implement subset of hsa api by calling into hsa library via dlopen10// Does the dlopen/dlsym calls as part of the call to hsa_init11//12//===----------------------------------------------------------------------===//13 14#include "llvm/Support/DynamicLibrary.h"15 16#include "Shared/Debug.h"17 18#include "DLWrap.h"19#include "hsa.h"20#include "hsa_ext_amd.h"21#include <memory>22 23DLWRAP_INITIALIZE()24 25DLWRAP_INTERNAL(hsa_init, 0)26 27DLWRAP(hsa_status_string, 2)28DLWRAP(hsa_shut_down, 0)29DLWRAP(hsa_system_get_info, 2)30DLWRAP(hsa_agent_get_info, 3)31DLWRAP(hsa_isa_get_info_alt, 3)32DLWRAP(hsa_iterate_agents, 2)33DLWRAP(hsa_agent_iterate_isas, 3)34DLWRAP(hsa_signal_create, 4)35DLWRAP(hsa_signal_destroy, 1)36DLWRAP(hsa_signal_store_relaxed, 2)37DLWRAP(hsa_signal_store_screlease, 2)38DLWRAP(hsa_signal_wait_scacquire, 5)39DLWRAP(hsa_signal_load_scacquire, 1)40DLWRAP(hsa_signal_subtract_screlease, 2)41DLWRAP(hsa_queue_create, 8)42DLWRAP(hsa_queue_destroy, 1)43DLWRAP(hsa_queue_load_read_index_scacquire, 1)44DLWRAP(hsa_queue_add_write_index_relaxed, 2)45DLWRAP(hsa_memory_copy, 3)46DLWRAP(hsa_executable_create, 4)47DLWRAP(hsa_executable_create_alt, 4)48DLWRAP(hsa_executable_destroy, 1)49DLWRAP(hsa_executable_freeze, 2)50DLWRAP(hsa_executable_validate, 2)51DLWRAP(hsa_executable_symbol_get_info, 3)52DLWRAP(hsa_executable_get_symbol_by_name, 4)53DLWRAP(hsa_executable_iterate_symbols, 3)54DLWRAP(hsa_code_object_deserialize, 4)55DLWRAP(hsa_executable_load_code_object, 4)56DLWRAP(hsa_code_object_destroy, 1)57DLWRAP(hsa_amd_agent_memory_pool_get_info, 4)58DLWRAP(hsa_amd_agent_iterate_memory_pools, 3)59DLWRAP(hsa_amd_memory_pool_allocate, 4)60DLWRAP(hsa_amd_memory_pool_free, 1)61DLWRAP(hsa_amd_memory_async_copy, 8)62DLWRAP(hsa_amd_memory_pool_get_info, 3)63DLWRAP(hsa_amd_agents_allow_access, 4)64DLWRAP(hsa_amd_memory_lock, 5)65DLWRAP(hsa_amd_memory_unlock, 1)66DLWRAP(hsa_amd_memory_fill, 3)67DLWRAP(hsa_amd_register_system_event_handler, 2)68DLWRAP(hsa_amd_signal_create, 5)69DLWRAP(hsa_amd_signal_async_handler, 5)70DLWRAP(hsa_amd_pointer_info, 5)71DLWRAP(hsa_code_object_reader_create_from_memory, 3)72DLWRAP(hsa_code_object_reader_destroy, 1)73DLWRAP(hsa_executable_load_agent_code_object, 5)74 75DLWRAP_FINALIZE()76 77#ifndef DYNAMIC_HSA_PATH78#define DYNAMIC_HSA_PATH "libhsa-runtime64.so"79#endif80 81#ifndef TARGET_NAME82#error "Missing TARGET_NAME macro"83#endif84#ifndef DEBUG_PREFIX85#define DEBUG_PREFIX "Target " GETNAME(TARGET_NAME) " RTL"86#endif87 88static bool checkForHSA() {89  // return true if dlopen succeeded and all functions found90 91  const char *HsaLib = DYNAMIC_HSA_PATH;92  std::string ErrMsg;93  auto DynlibHandle = std::make_unique<llvm::sys::DynamicLibrary>(94      llvm::sys::DynamicLibrary::getPermanentLibrary(HsaLib, &ErrMsg));95  if (!DynlibHandle->isValid()) {96    DP("Unable to load library '%s': %s!\n", HsaLib, ErrMsg.c_str());97    return false;98  }99 100  for (size_t I = 0; I < dlwrap::size(); I++) {101    const char *Sym = dlwrap::symbol(I);102 103    void *P = DynlibHandle->getAddressOfSymbol(Sym);104    if (P == nullptr) {105      DP("Unable to find '%s' in '%s'!\n", Sym, HsaLib);106      return false;107    }108    DP("Implementing %s with dlsym(%s) -> %p\n", Sym, Sym, P);109 110    *dlwrap::pointer(I) = P;111  }112 113  return true;114}115 116hsa_status_t hsa_init() {117  if (!checkForHSA()) {118    return HSA_STATUS_ERROR;119  }120  return dlwrap_hsa_init();121}122