//===-- DynamicLibrary.cpp - Runtime link/load libraries --------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This header file implements the operating system DynamicLibrary concept. // //===----------------------------------------------------------------------===// #include "llvm/System/DynamicLibrary.h" #include "llvm/Config/dlfcn.h" #include //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system //=== independent code. //===----------------------------------------------------------------------===// #ifdef HAVE_LTDL_H namespace llvm { using namespace sys; #ifdef HAVE_LT_DLOPEN DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) { if (0 != lt_dlinit()) throw std::string(lt_dlerror()); handle = lt_dlopen(filename); if (handle == 0) handle = lt_dlopenext(filename); if (handle == 0) throw std::string("Can't open dynamic library:") + filename; } DynamicLibrary::~DynamicLibrary() { if (handle) lt_dlclose((lt_dlhandle)handle); lt_dlexit(); } void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) { assert(handle != 0 && "Invalid DynamicLibrary handle"); return lt_dlsym((lt_dlhandle) handle,symbolName); } #else DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) { assert(!"Have ltdl.h but not libltdl.a!"); } DynamicLibrary::~DynamicLibrary() { assert(!"Have ltdl.h but not libltdl.a!"); } void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) { assert(!"Have ltdl.h but not libltdl.a!"); return 0; } #endif // HAVE_DLOPEN } // namespace llvm #else // HAVE_LTDL_H #include "platform/DynamicLibrary.cpp" #endif