blob: 75f975f8a53dcf64ba6b8eab44a470e5ae79b204 [file] [edit]
/*
* 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;
}