| /* |
| * ompdDLService.cpp -- Load libompd and look up OMPD API symbols. |
| */ |
| |
| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, 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 "ompdDLService.h" |
| |
| #include "llvm/Support/DynamicLibrary.h" |
| |
| #include <cstdio> |
| #include <cstring> |
| #include <string> |
| |
| void *ompd_library = NULL; |
| |
| static llvm::sys::DynamicLibrary LoadedLib; |
| static char last_error[256]; |
| |
| static void set_error(const char *msg) { |
| if (!msg || !msg[0]) { |
| last_error[0] = '\0'; |
| return; |
| } |
| strncpy(last_error, msg, sizeof(last_error) - 1); |
| last_error[sizeof(last_error) - 1] = '\0'; |
| } |
| |
| static void clear_error(void) { last_error[0] = '\0'; } |
| |
| int ompd_load_library(const char *name) { |
| clear_error(); |
| if (!name || !name[0]) { |
| set_error("OMPD library path is empty"); |
| return -1; |
| } |
| |
| std::string ErrMsg; |
| llvm::sys::DynamicLibrary NewLib = |
| llvm::sys::DynamicLibrary::getLibrary(name, &ErrMsg); |
| if (!NewLib.isValid()) { |
| set_error(ErrMsg.empty() ? "failed to load OMPD library" : ErrMsg.c_str()); |
| return -1; |
| } |
| |
| if (LoadedLib.isValid()) |
| llvm::sys::DynamicLibrary::closeLibrary(LoadedLib); |
| LoadedLib = NewLib; |
| ompd_library = LoadedLib.getOSSpecificHandle(); |
| return 0; |
| } |
| |
| void *ompd_get_symbol(const char *name) { |
| void *sym; |
| |
| clear_error(); |
| if (!LoadedLib.isValid()) { |
| set_error("OMPD library is not loaded"); |
| return NULL; |
| } |
| if (!name || !name[0]) { |
| set_error("OMPD symbol name is empty"); |
| return NULL; |
| } |
| |
| sym = LoadedLib.getAddressOfSymbol(name); |
| if (!sym) { |
| snprintf(last_error, sizeof(last_error), "could not find symbol '%s'", |
| name); |
| return NULL; |
| } |
| return sym; |
| } |
| |
| const char *ompd_get_dl_error(void) { |
| if (!last_error[0]) |
| return NULL; |
| return last_error; |
| } |