blob: ad7ca6db27c9a3bcff515becb5dddc2c4942a54f [file] [log] [blame]
// Copyright 2021 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "experimental/rocm/dynamic_symbols.h"
#include <string.h>
#include "iree/base/internal/dynamic_library.h"
#include "iree/base/target_platform.h"
#include "iree/base/tracing.h"
static const char* kROCMLoaderSearchNames[] = {
#if defined(IREE_PLATFORM_WINDOWS)
"amdhip64.dll",
#else
"libamdhip64.so",
#endif
};
static iree_status_t iree_hal_rocm_dynamic_symbols_resolve_all(
iree_hal_rocm_dynamic_symbols_t* syms) {
#define RC_PFN_DECL(rocmSymbolName, ...) \
{ \
static const char* kName = #rocmSymbolName; \
IREE_RETURN_IF_ERROR(iree_dynamic_library_lookup_symbol( \
syms->loader_library, kName, (void**)&syms->rocmSymbolName)); \
}
#define RC_PFN_STR_DECL(rocmSymbolName, ...) RC_PFN_DECL(rocmSymbolName, ...)
#include "experimental/rocm/dynamic_symbol_tables.h" // IWYU pragma: keep
#undef RC_PFN_DECL
#undef RC_PFN_STR_DECL
return iree_ok_status();
}
iree_status_t iree_hal_rocm_dynamic_symbols_initialize(
iree_allocator_t allocator, iree_hal_rocm_dynamic_symbols_t* out_syms) {
IREE_TRACE_ZONE_BEGIN(z0);
memset(out_syms, 0, sizeof(*out_syms));
iree_status_t status = iree_dynamic_library_load_from_files(
IREE_ARRAYSIZE(kROCMLoaderSearchNames), kROCMLoaderSearchNames,
IREE_DYNAMIC_LIBRARY_FLAG_NONE, allocator, &out_syms->loader_library);
if (iree_status_is_not_found(status)) {
iree_status_ignore(status);
return iree_make_status(
IREE_STATUS_UNAVAILABLE,
"ROCM/HIP runtime library not available; ensure installed and on path");
}
if (iree_status_is_ok(status)) {
status = iree_hal_rocm_dynamic_symbols_resolve_all(out_syms);
}
if (!iree_status_is_ok(status)) {
iree_hal_rocm_dynamic_symbols_deinitialize(out_syms);
}
IREE_TRACE_ZONE_END(z0);
return status;
}
void iree_hal_rocm_dynamic_symbols_deinitialize(
iree_hal_rocm_dynamic_symbols_t* syms) {
IREE_TRACE_ZONE_BEGIN(z0);
iree_dynamic_library_release(syms->loader_library);
memset(syms, 0, sizeof(*syms));
IREE_TRACE_ZONE_END(z0);
}