mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22520 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			367 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ltdl.h -- generic dlopen functions
 | 
						||
   Copyright (C) 1998-2000 Free Software Foundation, Inc.
 | 
						||
   Originally by Thomas Tanner <tanner@ffii.org>
 | 
						||
   This file is part of GNU Libtool.
 | 
						||
 | 
						||
This library is free software; you can redistribute it and/or
 | 
						||
modify it under the terms of the GNU Lesser General Public
 | 
						||
License as published by the Free Software Foundation; either
 | 
						||
version 2 of the License, or (at your option) any later version.
 | 
						||
 | 
						||
As a special exception to the GNU Lesser General Public License,
 | 
						||
if you distribute this file as part of a program or library that
 | 
						||
is built using GNU libtool, you may include it under the same
 | 
						||
distribution terms that you use for the rest of that program.
 | 
						||
 | 
						||
This library is distributed in the hope that it will be useful,
 | 
						||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						||
Lesser General Public License for more details.
 | 
						||
 | 
						||
You should have received a copy of the GNU Lesser General Public
 | 
						||
License along with this library; if not, write to the Free
 | 
						||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | 
						||
02111-1307  USA
 | 
						||
*/
 | 
						||
 | 
						||
/* Only include this header file once. */
 | 
						||
#ifndef LTDL_H
 | 
						||
#define LTDL_H 1
 | 
						||
 | 
						||
#include <sys/types.h>          /* for size_t declaration */
 | 
						||
 | 
						||
 | 
						||
/* --- MACROS FOR PORTABILITY --- */
 | 
						||
 | 
						||
 | 
						||
/* Saves on those hard to debug '\0' typos....  */
 | 
						||
#define LT_EOS_CHAR     '\0'
 | 
						||
 | 
						||
/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations,
 | 
						||
   so that C++ compilers don't mangle their names.  Use LTDL_END_C_DECLS at
 | 
						||
   the end of C declarations. */
 | 
						||
#ifdef __cplusplus
 | 
						||
# define LT_BEGIN_C_DECLS       extern "C" {
 | 
						||
# define LT_END_C_DECLS         }
 | 
						||
#else
 | 
						||
# define LT_BEGIN_C_DECLS       /* empty */
 | 
						||
# define LT_END_C_DECLS         /* empty */
 | 
						||
#endif
 | 
						||
 | 
						||
LT_BEGIN_C_DECLS
 | 
						||
 | 
						||
 | 
						||
/* LT_PARAMS is a macro used to wrap function prototypes, so that compilers
 | 
						||
   that don't understand ANSI C prototypes still work, and ANSI C
 | 
						||
   compilers can issue warnings about type mismatches.  */
 | 
						||
#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
 | 
						||
# define LT_PARAMS(protos)      protos
 | 
						||
# define lt_ptr         void*
 | 
						||
#else
 | 
						||
# define LT_PARAMS(protos)      ()
 | 
						||
# define lt_ptr         char*
 | 
						||
#endif
 | 
						||
 | 
						||
/* LT_STMT_START/END are used to create macros which expand to a
 | 
						||
   a single compound statement in a portable way.  */
 | 
						||
#if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
 | 
						||
#  define LT_STMT_START        (void)(
 | 
						||
#  define LT_STMT_END          )
 | 
						||
#else
 | 
						||
#  if (defined (sun) || defined (__sun__))
 | 
						||
#    define LT_STMT_START      if (1)
 | 
						||
#    define LT_STMT_END        else (void)0
 | 
						||
#  else
 | 
						||
#    define LT_STMT_START      do
 | 
						||
#    define LT_STMT_END        while (0)
 | 
						||
#  endif
 | 
						||
#endif
 | 
						||
 | 
						||
/* LT_CONC creates a new concatenated symbol for the compiler
 | 
						||
   in a portable way.  */
 | 
						||
#if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER)
 | 
						||
#  define LT_CONC(s,t)  s##t
 | 
						||
#else
 | 
						||
#  define LT_CONC(s,t)  s/**/t
 | 
						||
#endif
 | 
						||
 | 
						||
/* LT_STRLEN can be used safely on NULL pointers.  */
 | 
						||
#define LT_STRLEN(s)    (((s) && (s)[0]) ? strlen (s) : 0)
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- WINDOWS SUPPORT --- */
 | 
						||
 | 
						||
 | 
						||
/* Canonicalise Windows and Cygwin recognition macros.  */
 | 
						||
#ifdef __CYGWIN32__
 | 
						||
#  ifndef __CYGWIN__
 | 
						||
#    define __CYGWIN__ __CYGWIN32__
 | 
						||
#  endif
 | 
						||
#endif
 | 
						||
#if defined(_WIN32) || defined(WIN32)
 | 
						||
#  ifndef __WINDOWS__
 | 
						||
#    ifdef _WIN32
 | 
						||
#      define __WINDOWS__ _WIN32
 | 
						||
#    else
 | 
						||
#      ifdef WIN32
 | 
						||
#        define __WINDOWS__ WIN32
 | 
						||
#      endif
 | 
						||
#    endif
 | 
						||
#  endif
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
#ifdef __WINDOWS__
 | 
						||
#  ifndef __CYGWIN__
 | 
						||
/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
 | 
						||
   separator when it is set. */
 | 
						||
#    define LT_DIRSEP_CHAR      '\\'
 | 
						||
#    define LT_PATHSEP_CHAR     ';'
 | 
						||
#  endif
 | 
						||
#endif
 | 
						||
#ifndef LT_PATHSEP_CHAR
 | 
						||
#  define LT_PATHSEP_CHAR       ':'
 | 
						||
#endif
 | 
						||
 | 
						||
/* DLL building support on win32 hosts;  mostly to workaround their
 | 
						||
   ridiculous implementation of data symbol exporting. */
 | 
						||
#ifndef LT_SCOPE
 | 
						||
#  ifdef __WINDOWS__
 | 
						||
#    ifdef DLL_EXPORT           /* defined by libtool (if required) */
 | 
						||
#      define LT_SCOPE  __declspec(dllexport)
 | 
						||
#    endif
 | 
						||
#    ifdef LIBLTDL_DLL_IMPORT   /* define if linking with this dll */
 | 
						||
#      define LT_SCOPE  extern __declspec(dllimport)
 | 
						||
#    endif
 | 
						||
#  endif
 | 
						||
#  ifndef LT_SCOPE              /* static linking or !__WINDOWS__ */
 | 
						||
#    define LT_SCOPE    extern
 | 
						||
#  endif
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
#if defined(_MSC_VER) /* Visual Studio */
 | 
						||
#  define R_OK 4
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- DYNAMIC MODULE LOADING API --- */
 | 
						||
 | 
						||
 | 
						||
typedef struct lt_dlhandle_struct *lt_dlhandle; /* A loaded module.  */
 | 
						||
 | 
						||
/* Initialisation and finalisation functions for libltdl. */
 | 
						||
LT_SCOPE        int         lt_dlinit           LT_PARAMS((void));
 | 
						||
LT_SCOPE        int         lt_dlexit           LT_PARAMS((void));
 | 
						||
 | 
						||
/* Module search path manipulation.  */
 | 
						||
LT_SCOPE        int         lt_dladdsearchdir    LT_PARAMS((const char *search_dir));
 | 
						||
LT_SCOPE        int         lt_dlinsertsearchdir LT_PARAMS((const char *before,
 | 
						||
                                                    const char *search_dir));
 | 
						||
LT_SCOPE        int         lt_dlsetsearchpath   LT_PARAMS((const char *search_path));
 | 
						||
LT_SCOPE        const char *lt_dlgetsearchpath   LT_PARAMS((void));
 | 
						||
LT_SCOPE        int         lt_dlforeachfile     LT_PARAMS((
 | 
						||
                        const char *search_path,
 | 
						||
                        int (*func) (const char *filename, lt_ptr data),
 | 
						||
                        lt_ptr data));
 | 
						||
 | 
						||
/* Portable libltdl versions of the system dlopen() API. */
 | 
						||
LT_SCOPE        lt_dlhandle lt_dlopen           LT_PARAMS((const char *filename));
 | 
						||
LT_SCOPE        lt_dlhandle lt_dlopenext        LT_PARAMS((const char *filename));
 | 
						||
LT_SCOPE        lt_ptr      lt_dlsym            LT_PARAMS((lt_dlhandle handle,
 | 
						||
                                                     const char *name));
 | 
						||
LT_SCOPE        const char *lt_dlerror          LT_PARAMS((void));
 | 
						||
LT_SCOPE        int         lt_dlclose          LT_PARAMS((lt_dlhandle handle));
 | 
						||
 | 
						||
/* Module residency management. */
 | 
						||
LT_SCOPE        int         lt_dlmakeresident   LT_PARAMS((lt_dlhandle handle));
 | 
						||
LT_SCOPE        int         lt_dlisresident     LT_PARAMS((lt_dlhandle handle));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- MUTEX LOCKING --- */
 | 
						||
 | 
						||
 | 
						||
typedef void    lt_dlmutex_lock         LT_PARAMS((void));
 | 
						||
typedef void    lt_dlmutex_unlock       LT_PARAMS((void));
 | 
						||
typedef void    lt_dlmutex_seterror     LT_PARAMS((const char *errmsg));
 | 
						||
typedef const char *lt_dlmutex_geterror LT_PARAMS((void));
 | 
						||
 | 
						||
LT_SCOPE        int     lt_dlmutex_register     LT_PARAMS((lt_dlmutex_lock *lock,
 | 
						||
                                            lt_dlmutex_unlock *unlock,
 | 
						||
                                            lt_dlmutex_seterror *seterror,
 | 
						||
                                            lt_dlmutex_geterror *geterror));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- MEMORY HANDLING --- */
 | 
						||
 | 
						||
 | 
						||
/* By default, the realloc function pointer is set to our internal
 | 
						||
   realloc implementation which iself uses lt_dlmalloc and lt_dlfree.
 | 
						||
   libltdl relies on a featureful realloc, but if you are sure yours
 | 
						||
   has the right semantics then you can assign it directly.  Generally,
 | 
						||
   it is safe to assign just a malloc() and a free() function.  */
 | 
						||
LT_SCOPE  lt_ptr   (*lt_dlmalloc)       LT_PARAMS((size_t size));
 | 
						||
LT_SCOPE  lt_ptr   (*lt_dlrealloc)      LT_PARAMS((lt_ptr ptr, size_t size));
 | 
						||
LT_SCOPE  void     (*lt_dlfree)         LT_PARAMS((lt_ptr ptr));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- PRELOADED MODULE SUPPORT --- */
 | 
						||
 | 
						||
 | 
						||
/* A preopened symbol. Arrays of this type comprise the exported
 | 
						||
   symbols for a dlpreopened module. */
 | 
						||
typedef struct {
 | 
						||
  const char *name;
 | 
						||
  lt_ptr      address;
 | 
						||
} lt_dlsymlist;
 | 
						||
 | 
						||
LT_SCOPE        int     lt_dlpreload    LT_PARAMS((const lt_dlsymlist *preloaded));
 | 
						||
LT_SCOPE        int     lt_dlpreload_default
 | 
						||
                                LT_PARAMS((const lt_dlsymlist *preloaded));
 | 
						||
 | 
						||
#define LTDL_SET_PRELOADED_SYMBOLS()            LT_STMT_START{  \
 | 
						||
        extern const lt_dlsymlist lt_preloaded_symbols[];               \
 | 
						||
        lt_dlpreload_default(lt_preloaded_symbols);                     \
 | 
						||
                                                }LT_STMT_END
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- MODULE INFORMATION --- */
 | 
						||
 | 
						||
 | 
						||
/* Read only information pertaining to a loaded module. */
 | 
						||
typedef struct {
 | 
						||
  char  *filename;              /* file name */
 | 
						||
  char  *name;                  /* module name */
 | 
						||
  int   ref_count;              /* number of times lt_dlopened minus
 | 
						||
                                   number of times lt_dlclosed. */
 | 
						||
} lt_dlinfo;
 | 
						||
 | 
						||
LT_SCOPE        const lt_dlinfo *lt_dlgetinfo       LT_PARAMS((lt_dlhandle handle));
 | 
						||
LT_SCOPE        lt_dlhandle     lt_dlhandle_next    LT_PARAMS((lt_dlhandle place));
 | 
						||
LT_SCOPE        int             lt_dlforeach        LT_PARAMS((
 | 
						||
                                int (*func) (lt_dlhandle handle, lt_ptr data),
 | 
						||
                                lt_ptr data));
 | 
						||
 | 
						||
/* Associating user data with loaded modules. */
 | 
						||
typedef unsigned lt_dlcaller_id;
 | 
						||
 | 
						||
LT_SCOPE        lt_dlcaller_id  lt_dlcaller_register  LT_PARAMS((void));
 | 
						||
LT_SCOPE        lt_ptr          lt_dlcaller_set_data  LT_PARAMS((lt_dlcaller_id key,
 | 
						||
                                                lt_dlhandle handle,
 | 
						||
                                                lt_ptr data));
 | 
						||
LT_SCOPE        lt_ptr          lt_dlcaller_get_data  LT_PARAMS((lt_dlcaller_id key,
 | 
						||
                                                lt_dlhandle handle));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- USER MODULE LOADER API --- */
 | 
						||
 | 
						||
 | 
						||
typedef struct lt_dlloader      lt_dlloader;
 | 
						||
typedef lt_ptr                  lt_user_data;
 | 
						||
typedef lt_ptr                  lt_module;
 | 
						||
 | 
						||
/* Function pointer types for creating user defined module loaders. */
 | 
						||
typedef lt_module   lt_module_open      LT_PARAMS((lt_user_data loader_data,
 | 
						||
                                            const char *filename));
 | 
						||
typedef int         lt_module_close     LT_PARAMS((lt_user_data loader_data,
 | 
						||
                                            lt_module handle));
 | 
						||
typedef lt_ptr      lt_find_sym         LT_PARAMS((lt_user_data loader_data,
 | 
						||
                                            lt_module handle,
 | 
						||
                                            const char *symbol));
 | 
						||
typedef int         lt_dlloader_exit    LT_PARAMS((lt_user_data loader_data));
 | 
						||
 | 
						||
struct lt_user_dlloader {
 | 
						||
  const char           *sym_prefix;
 | 
						||
  lt_module_open       *module_open;
 | 
						||
  lt_module_close      *module_close;
 | 
						||
  lt_find_sym          *find_sym;
 | 
						||
  lt_dlloader_exit     *dlloader_exit;
 | 
						||
  lt_user_data          dlloader_data;
 | 
						||
};
 | 
						||
 | 
						||
LT_SCOPE        lt_dlloader    *lt_dlloader_next    LT_PARAMS((lt_dlloader *place));
 | 
						||
LT_SCOPE        lt_dlloader    *lt_dlloader_find    LT_PARAMS((
 | 
						||
                                                const char *loader_name));
 | 
						||
LT_SCOPE        const char     *lt_dlloader_name    LT_PARAMS((lt_dlloader *place));
 | 
						||
LT_SCOPE        lt_user_data   *lt_dlloader_data    LT_PARAMS((lt_dlloader *place));
 | 
						||
LT_SCOPE        int             lt_dlloader_add     LT_PARAMS((lt_dlloader *place,
 | 
						||
                                const struct lt_user_dlloader *dlloader,
 | 
						||
                                const char *loader_name));
 | 
						||
LT_SCOPE        int             lt_dlloader_remove  LT_PARAMS((
 | 
						||
                                                const char *loader_name));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- ERROR MESSAGE HANDLING --- */
 | 
						||
 | 
						||
 | 
						||
/* Defining error strings alongside their symbolic names in a macro in
 | 
						||
   this way allows us to expand the macro in different contexts with
 | 
						||
   confidence that the enumeration of symbolic names will map correctly
 | 
						||
   onto the table of error strings.  */
 | 
						||
#define lt_dlerror_table                                                \
 | 
						||
    LT_ERROR(UNKNOWN,               "unknown error")                    \
 | 
						||
    LT_ERROR(DLOPEN_NOT_SUPPORTED,  "dlopen support not available")     \
 | 
						||
    LT_ERROR(INVALID_LOADER,        "invalid loader")                   \
 | 
						||
    LT_ERROR(INIT_LOADER,           "loader initialization failed")     \
 | 
						||
    LT_ERROR(REMOVE_LOADER,         "loader removal failed")            \
 | 
						||
    LT_ERROR(FILE_NOT_FOUND,        "file not found")                   \
 | 
						||
    LT_ERROR(DEPLIB_NOT_FOUND,      "dependency library not found")     \
 | 
						||
    LT_ERROR(NO_SYMBOLS,            "no symbols defined")               \
 | 
						||
    LT_ERROR(CANNOT_OPEN,           "can't open the module")            \
 | 
						||
    LT_ERROR(CANNOT_CLOSE,          "can't close the module")           \
 | 
						||
    LT_ERROR(SYMBOL_NOT_FOUND,      "symbol not found")                 \
 | 
						||
    LT_ERROR(NO_MEMORY,             "not enough memory")                \
 | 
						||
    LT_ERROR(INVALID_HANDLE,        "invalid module handle")            \
 | 
						||
    LT_ERROR(BUFFER_OVERFLOW,       "internal buffer overflow")         \
 | 
						||
    LT_ERROR(INVALID_ERRORCODE,     "invalid errorcode")                \
 | 
						||
    LT_ERROR(SHUTDOWN,              "library already shutdown")         \
 | 
						||
    LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module")      \
 | 
						||
    LT_ERROR(INVALID_MUTEX_ARGS,    "invalid mutex handler registration") \
 | 
						||
    LT_ERROR(INVALID_POSITION,      "invalid search path insert position")
 | 
						||
 | 
						||
/* Enumerate the symbolic error names. */
 | 
						||
enum {
 | 
						||
#define LT_ERROR(name, diagnostic)      LT_CONC(LT_ERROR_, name),
 | 
						||
        lt_dlerror_table
 | 
						||
#undef LT_ERROR
 | 
						||
 | 
						||
        LT_ERROR_MAX
 | 
						||
};
 | 
						||
 | 
						||
/* These functions are only useful from inside custom module loaders. */
 | 
						||
LT_SCOPE        int     lt_dladderror   LT_PARAMS((const char *diagnostic));
 | 
						||
LT_SCOPE        int     lt_dlseterror   LT_PARAMS((int errorcode));
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/* --- SOURCE COMPATIBILITY WITH OLD LIBLTDL --- */
 | 
						||
 | 
						||
 | 
						||
#ifdef LT_NON_POSIX_NAMESPACE
 | 
						||
#  define lt_ptr_t              lt_ptr
 | 
						||
#  define lt_module_t           lt_module
 | 
						||
#  define lt_module_open_t      lt_module_open
 | 
						||
#  define lt_module_close_t     lt_module_close
 | 
						||
#  define lt_find_sym_t         lt_find_sym
 | 
						||
#  define lt_dlloader_exit_t    lt_dlloader_exit
 | 
						||
#  define lt_dlloader_t         lt_dlloader
 | 
						||
#  define lt_dlloader_data_t    lt_user_data
 | 
						||
#endif
 | 
						||
 | 
						||
LT_END_C_DECLS
 | 
						||
 | 
						||
#endif /* !LTDL_H */
 |