libphobos: Add D runtime support code for MinGW (PR99794)
libphobos/ChangeLog: PR d/99794 * libdruntime/Makefile.am (DRUNTIME_SOURCES_CONFIGURED): Add config/mingw/msvc.c on DRUNTIME_OS_MINGW. * libdruntime/Makefile.in: Regenerate. * libdruntime/config/mingw/msvc.c: New file. * libdruntime/config/mingw/switchcontext.S (fiber_switchContext): Fix function definition. * libdruntime/gcc/deh.d (__gdc_personality_seh0): Fix call to _GCC_specific_handler. * libdruntime/gcc/gthread.d (__gthread_once_t): Fix definition. * libdruntime/gcc/unwind/generic.d (_GCC_specific_handler): Fix declaration. * libdruntime/rt/dmain2.d (rt_loadLibrary): Remove function. (rt_loadLibraryW): Remove function. (initLibrary): Remove function. (rt_unloadLibrary): Remove function.
This commit is contained in:
parent
d86e60855f
commit
b66e72b43e
@ -69,7 +69,8 @@ if DRUNTIME_OS_LINUX
|
||||
DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_LINUX)
|
||||
endif
|
||||
if DRUNTIME_OS_MINGW
|
||||
DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_WINDOWS)
|
||||
DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_WINDOWS) \
|
||||
config/mingw/msvc.c
|
||||
endif
|
||||
if DRUNTIME_OS_SOLARIS
|
||||
DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_SOLARIS)
|
||||
|
@ -117,7 +117,9 @@ target_triplet = @target@
|
||||
@DRUNTIME_OS_NETBSD_TRUE@am__append_6 = $(DRUNTIME_DSOURCES_NETBSD)
|
||||
@DRUNTIME_OS_OPENBSD_TRUE@am__append_7 = $(DRUNTIME_DSOURCES_OPENBSD)
|
||||
@DRUNTIME_OS_LINUX_TRUE@am__append_8 = $(DRUNTIME_DSOURCES_LINUX)
|
||||
@DRUNTIME_OS_MINGW_TRUE@am__append_9 = $(DRUNTIME_DSOURCES_WINDOWS)
|
||||
@DRUNTIME_OS_MINGW_TRUE@am__append_9 = $(DRUNTIME_DSOURCES_WINDOWS) \
|
||||
@DRUNTIME_OS_MINGW_TRUE@ config/mingw/msvc.c
|
||||
|
||||
@DRUNTIME_OS_SOLARIS_TRUE@am__append_10 = $(DRUNTIME_DSOURCES_SOLARIS)
|
||||
# CPU specific sources
|
||||
@DRUNTIME_CPU_AARCH64_TRUE@am__append_11 = config/aarch64/switchcontext.S
|
||||
@ -428,7 +430,8 @@ am__objects_19 = core/sys/windows/accctrl.lo \
|
||||
core/sys/windows/winsvc.lo core/sys/windows/winuser.lo \
|
||||
core/sys/windows/winver.lo core/sys/windows/wtsapi32.lo \
|
||||
core/sys/windows/wtypes.lo
|
||||
@DRUNTIME_OS_MINGW_TRUE@am__objects_20 = $(am__objects_19)
|
||||
@DRUNTIME_OS_MINGW_TRUE@am__objects_20 = $(am__objects_19) \
|
||||
@DRUNTIME_OS_MINGW_TRUE@ config/mingw/libgdruntime_la-msvc.lo
|
||||
am__objects_21 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \
|
||||
core/sys/solaris/err.lo core/sys/solaris/execinfo.lo \
|
||||
core/sys/solaris/libelf.lo core/sys/solaris/link.lo \
|
||||
@ -463,24 +466,26 @@ am_libgdruntime_la_OBJECTS = $(am__objects_33)
|
||||
libgdruntime_la_OBJECTS = $(am_libgdruntime_la_OBJECTS)
|
||||
am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
|
||||
am__objects_34 = core/stdc/libgdruntime_convenience_la-errno_.lo
|
||||
@DRUNTIME_CPU_AARCH64_TRUE@am__objects_35 = config/aarch64/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_ARM_TRUE@am__objects_36 = config/arm/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_MIPS_TRUE@am__objects_37 = config/mips/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_POWERPC_TRUE@am__objects_38 = config/powerpc/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_39 = config/mingw/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_40 = config/x86/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_41 = config/systemz/libgdruntime_convenience_la-get_tls_offset.lo
|
||||
@DRUNTIME_CPU_S390_TRUE@am__objects_42 = config/s390/libgdruntime_convenience_la-get_tls_offset.lo
|
||||
am__objects_43 = $(am__objects_4) $(am__objects_6) $(am__objects_8) \
|
||||
@DRUNTIME_OS_MINGW_TRUE@am__objects_35 = $(am__objects_19) \
|
||||
@DRUNTIME_OS_MINGW_TRUE@ config/mingw/libgdruntime_convenience_la-msvc.lo
|
||||
@DRUNTIME_CPU_AARCH64_TRUE@am__objects_36 = config/aarch64/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_ARM_TRUE@am__objects_37 = config/arm/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_MIPS_TRUE@am__objects_38 = config/mips/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_POWERPC_TRUE@am__objects_39 = config/powerpc/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_40 = config/mingw/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_41 = config/x86/libgdruntime_convenience_la-switchcontext.lo
|
||||
@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_42 = config/systemz/libgdruntime_convenience_la-get_tls_offset.lo
|
||||
@DRUNTIME_CPU_S390_TRUE@am__objects_43 = config/s390/libgdruntime_convenience_la-get_tls_offset.lo
|
||||
am__objects_44 = $(am__objects_4) $(am__objects_6) $(am__objects_8) \
|
||||
$(am__objects_10) $(am__objects_12) $(am__objects_14) \
|
||||
$(am__objects_16) $(am__objects_18) $(am__objects_20) \
|
||||
$(am__objects_22) $(am__objects_35) $(am__objects_36) \
|
||||
$(am__objects_37) $(am__objects_38) $(am__objects_39) \
|
||||
$(am__objects_40) $(am__objects_41) $(am__objects_42)
|
||||
am__objects_44 = $(am__objects_1) $(am__objects_34) $(am__objects_43) \
|
||||
$(am__objects_16) $(am__objects_18) $(am__objects_35) \
|
||||
$(am__objects_22) $(am__objects_36) $(am__objects_37) \
|
||||
$(am__objects_38) $(am__objects_39) $(am__objects_40) \
|
||||
$(am__objects_41) $(am__objects_42) $(am__objects_43)
|
||||
am__objects_45 = $(am__objects_1) $(am__objects_34) $(am__objects_44) \
|
||||
$(am__objects_32)
|
||||
am__objects_45 = $(am__objects_44)
|
||||
am_libgdruntime_convenience_la_OBJECTS = $(am__objects_45)
|
||||
am__objects_46 = $(am__objects_45)
|
||||
am_libgdruntime_convenience_la_OBJECTS = $(am__objects_46)
|
||||
libgdruntime_convenience_la_OBJECTS = \
|
||||
$(am_libgdruntime_convenience_la_OBJECTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
@ -1732,6 +1737,10 @@ core/sys/windows/winuser.lo: core/sys/windows/$(am__dirstamp)
|
||||
core/sys/windows/winver.lo: core/sys/windows/$(am__dirstamp)
|
||||
core/sys/windows/wtsapi32.lo: core/sys/windows/$(am__dirstamp)
|
||||
core/sys/windows/wtypes.lo: core/sys/windows/$(am__dirstamp)
|
||||
config/mingw/$(am__dirstamp):
|
||||
@$(MKDIR_P) config/mingw
|
||||
@: > config/mingw/$(am__dirstamp)
|
||||
config/mingw/libgdruntime_la-msvc.lo: config/mingw/$(am__dirstamp)
|
||||
core/sys/solaris/$(am__dirstamp):
|
||||
@$(MKDIR_P) core/sys/solaris
|
||||
@: > core/sys/solaris/$(am__dirstamp)
|
||||
@ -1781,9 +1790,6 @@ config/powerpc/$(am__dirstamp):
|
||||
@: > config/powerpc/$(am__dirstamp)
|
||||
config/powerpc/libgdruntime_la-switchcontext.lo: \
|
||||
config/powerpc/$(am__dirstamp)
|
||||
config/mingw/$(am__dirstamp):
|
||||
@$(MKDIR_P) config/mingw
|
||||
@: > config/mingw/$(am__dirstamp)
|
||||
config/mingw/libgdruntime_la-switchcontext.lo: \
|
||||
config/mingw/$(am__dirstamp)
|
||||
config/x86/$(am__dirstamp):
|
||||
@ -1808,6 +1814,8 @@ libgdruntime.la: $(libgdruntime_la_OBJECTS) $(libgdruntime_la_DEPENDENCIES) $(EX
|
||||
$(AM_V_GEN)$(libgdruntime_la_LINK) -rpath $(toolexeclibdir) $(libgdruntime_la_OBJECTS) $(libgdruntime_la_LIBADD) $(LIBS)
|
||||
core/stdc/libgdruntime_convenience_la-errno_.lo: \
|
||||
core/stdc/$(am__dirstamp)
|
||||
config/mingw/libgdruntime_convenience_la-msvc.lo: \
|
||||
config/mingw/$(am__dirstamp)
|
||||
config/aarch64/libgdruntime_convenience_la-switchcontext.lo: \
|
||||
config/aarch64/$(am__dirstamp)
|
||||
config/arm/libgdruntime_convenience_la-switchcontext.lo: \
|
||||
@ -2003,9 +2011,15 @@ config/s390/libgdruntime_convenience_la-get_tls_offset.lo: config/s390/get_tls_o
|
||||
core/stdc/libgdruntime_la-errno_.lo: core/stdc/errno_.c
|
||||
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgdruntime_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o core/stdc/libgdruntime_la-errno_.lo `test -f 'core/stdc/errno_.c' || echo '$(srcdir)/'`core/stdc/errno_.c
|
||||
|
||||
config/mingw/libgdruntime_la-msvc.lo: config/mingw/msvc.c
|
||||
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgdruntime_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o config/mingw/libgdruntime_la-msvc.lo `test -f 'config/mingw/msvc.c' || echo '$(srcdir)/'`config/mingw/msvc.c
|
||||
|
||||
core/stdc/libgdruntime_convenience_la-errno_.lo: core/stdc/errno_.c
|
||||
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgdruntime_convenience_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o core/stdc/libgdruntime_convenience_la-errno_.lo `test -f 'core/stdc/errno_.c' || echo '$(srcdir)/'`core/stdc/errno_.c
|
||||
|
||||
config/mingw/libgdruntime_convenience_la-msvc.lo: config/mingw/msvc.c
|
||||
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgdruntime_convenience_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o config/mingw/libgdruntime_convenience_la-msvc.lo `test -f 'config/mingw/msvc.c' || echo '$(srcdir)/'`config/mingw/msvc.c
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
|
169
libphobos/libdruntime/config/mingw/msvc.c
Normal file
169
libphobos/libdruntime/config/mingw/msvc.c
Normal file
@ -0,0 +1,169 @@
|
||||
/* Windows support code to wrap differences between different
|
||||
versions of the Microsoft C libaries.
|
||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3, or (at your option) any later
|
||||
version.
|
||||
|
||||
GCC 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 General Public License
|
||||
for more details.
|
||||
|
||||
Under Section 7 of GPL version 3, you are granted additional
|
||||
permissions described in the GCC Runtime Library Exception, version
|
||||
3.1, as published by the Free Software Foundation.
|
||||
|
||||
You should have received a copy of the GNU General Public License and
|
||||
a copy of the GCC Runtime Library Exception along with this program;
|
||||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include <_mingw.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
|
||||
/* The D runtime library defines stdin, stdout, and stderr as extern(C) symbols
|
||||
in the core.stdc.stdio module, and require initializing at start-up. */
|
||||
__attribute__((weakref ("stdin")))
|
||||
static FILE *core_stdc_stdin;
|
||||
|
||||
__attribute__((weakref ("stdout")))
|
||||
static FILE *core_stdc_stdout;
|
||||
|
||||
__attribute__((weakref ("stderr")))
|
||||
static FILE *core_stdc_stderr;
|
||||
|
||||
/* Set to 1 if runtime is using libucrt.dll. */
|
||||
unsigned char msvcUsesUCRT;
|
||||
|
||||
void
|
||||
init_msvc (void)
|
||||
{
|
||||
core_stdc_stdin = stdin;
|
||||
core_stdc_stdout = stdout;
|
||||
core_stdc_stderr = stderr;
|
||||
|
||||
#if __MSVCRT_VERSION__ >= 0xE00
|
||||
msvcUsedUCRT = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Phobos std.stdio module assumes these functions are present at link time,
|
||||
and not absent or macros. */
|
||||
#ifdef _fgetc_nolock
|
||||
#undef _fgetc_nolock
|
||||
|
||||
int
|
||||
_fgetc_nolock (FILE *fp)
|
||||
{
|
||||
fp->_cnt--;
|
||||
if (fp->_cnt >= 0)
|
||||
{
|
||||
const int c = *fp->_ptr;
|
||||
fp->_ptr++;
|
||||
return c & 0xff;
|
||||
}
|
||||
else
|
||||
return _filbuf (fp);
|
||||
}
|
||||
|
||||
#endif /* _fgetc_nolock */
|
||||
|
||||
#ifdef _fputc_nolock
|
||||
#undef _fputc_nolock
|
||||
|
||||
int
|
||||
_fputc_nolock (int c, FILE *fp)
|
||||
{
|
||||
fp->_cnt--;
|
||||
if (fp->_cnt >= 0)
|
||||
{
|
||||
*fp->_ptr = (char) c;
|
||||
fp->_ptr++;
|
||||
return c & 0xff;
|
||||
}
|
||||
else
|
||||
return _flsbuf (c, fp);
|
||||
}
|
||||
|
||||
#endif /* _fputc_nolock */
|
||||
|
||||
#ifdef rewind
|
||||
#undef rewind
|
||||
|
||||
void
|
||||
rewind (FILE *fp)
|
||||
{
|
||||
fseek (fp, 0, SEEK_SET);
|
||||
fp->_flag &= ~_IOERR;
|
||||
}
|
||||
|
||||
#endif /* rewind */
|
||||
|
||||
#ifdef clearerr
|
||||
#undef clearerr
|
||||
|
||||
void
|
||||
clearerr (FILE *fp)
|
||||
{
|
||||
fp->_flag &= ~(_IOERR | _IOEOF);
|
||||
}
|
||||
|
||||
#endif /* clearerr */
|
||||
|
||||
#ifdef feof
|
||||
#undef feof
|
||||
|
||||
int
|
||||
feof (FILE *fp)
|
||||
{
|
||||
return fp->_flag & _IOEOF;
|
||||
}
|
||||
|
||||
#endif /* feof */
|
||||
|
||||
#ifdef ferror
|
||||
#undef ferror
|
||||
|
||||
int
|
||||
ferror (FILE *fp)
|
||||
{
|
||||
return fp->_flag & _IOERR;
|
||||
}
|
||||
|
||||
#endif /* ferror */
|
||||
|
||||
#ifdef fileno
|
||||
#undef fileno
|
||||
|
||||
int
|
||||
fileno (FILE *fp)
|
||||
{
|
||||
return fp->_file;
|
||||
}
|
||||
|
||||
#endif /* fileno */
|
||||
|
||||
/* Phobos std.stdio module has a dependency on the UCRT library, so provide
|
||||
stubs that forward to the nearest equivalent. */
|
||||
#if __MSVCRT_VERSION__ < 0x800
|
||||
|
||||
wint_t
|
||||
_fgetwc_nolock (FILE *fp)
|
||||
{
|
||||
return fgetwc (fp);
|
||||
}
|
||||
|
||||
wint_t
|
||||
_fputwc_nolock (wchar_t c, FILE *fp)
|
||||
{
|
||||
return fputwc(c, fp);
|
||||
}
|
||||
|
||||
#endif /* __MSVCRT_VERSION__ < 0x800*/
|
@ -28,7 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
|
||||
.text
|
||||
.globl CSYM(fiber_switchContext)
|
||||
.type CSYM(fiber_switchContext), @function
|
||||
.def CSYM(fiber_switchContext)
|
||||
.scl 2
|
||||
.type 32
|
||||
.endef
|
||||
.align 16
|
||||
CSYM(fiber_switchContext):
|
||||
.cfi_startproc
|
||||
@ -63,13 +66,15 @@ CSYM(fiber_switchContext):
|
||||
popq %RCX;
|
||||
jmp *%RCX;
|
||||
.cfi_endproc
|
||||
.size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
|
||||
|
||||
#elif defined(_X86_)
|
||||
|
||||
.text
|
||||
.globl CSYM(fiber_switchContext)
|
||||
.type CSYM(fiber_switchContext), @function
|
||||
.def CSYM(fiber_switchContext)
|
||||
.scl 2
|
||||
.type 32
|
||||
.endef
|
||||
.align 16
|
||||
CSYM(fiber_switchContext):
|
||||
.cfi_startproc
|
||||
@ -104,6 +109,5 @@ CSYM(fiber_switchContext):
|
||||
// 'return' to complete switch
|
||||
ret;
|
||||
.cfi_endproc
|
||||
.size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
|
||||
|
||||
#endif
|
||||
|
@ -805,7 +805,7 @@ version (GNU_SEH_Exceptions)
|
||||
void* ms_orig_context, void* ms_disp)
|
||||
{
|
||||
return _GCC_specific_handler(ms_exc, this_frame, ms_orig_context,
|
||||
ms_disp, &__gdc_personality_imp);
|
||||
ms_disp, &gdc_personality);
|
||||
}
|
||||
}
|
||||
else version (GNU_SjLj_Exceptions)
|
||||
|
@ -86,10 +86,12 @@ else static if (GNU_Thread_Model == ThreadModel.Single)
|
||||
}
|
||||
else static if (GNU_Thread_Model == ThreadModel.Win32)
|
||||
{
|
||||
import core.stdc.config;
|
||||
|
||||
struct __gthread_once_t
|
||||
{
|
||||
INT done;
|
||||
LONG started;
|
||||
int done;
|
||||
c_long started;
|
||||
}
|
||||
|
||||
int __gthr_win32_key_create(__gthread_key_t* keyp, GthreadDestroyFn dtor);
|
||||
|
@ -269,6 +269,6 @@ version (GNU_SEH_Exceptions)
|
||||
ExceptionCollidedUnwind
|
||||
}
|
||||
|
||||
extern(C) EXCEPTION_DISPOSITION _GCC_specific_handler(void*, void*, void*,
|
||||
extern(C) EXCEPTION_DISPOSITION _GCC_specific_handler(void*, void*, void*, void*,
|
||||
_Unwind_Personality_Fn);
|
||||
}
|
||||
|
@ -9,6 +9,9 @@
|
||||
* Source: $(DRUNTIMESRC src/rt/_dmain2.d)
|
||||
*/
|
||||
|
||||
/* NOTE: This file has been patched from the original DMD distribution to
|
||||
* work with the GDC compiler.
|
||||
*/
|
||||
module rt.dmain2;
|
||||
|
||||
private
|
||||
@ -70,70 +73,6 @@ version (CRuntime_Microsoft)
|
||||
extern(C) void init_msvc();
|
||||
}
|
||||
|
||||
/***********************************
|
||||
* These are a temporary means of providing a GC hook for DLL use. They may be
|
||||
* replaced with some other similar functionality later.
|
||||
*/
|
||||
extern (C)
|
||||
{
|
||||
void* gc_getProxy();
|
||||
void gc_setProxy(void* p);
|
||||
void gc_clrProxy();
|
||||
|
||||
alias void* function() gcGetFn;
|
||||
alias void function(void*) gcSetFn;
|
||||
alias void function() gcClrFn;
|
||||
}
|
||||
|
||||
version (Windows)
|
||||
{
|
||||
/*******************************************
|
||||
* Loads a DLL written in D with the name 'name'.
|
||||
* Returns:
|
||||
* opaque handle to the DLL if successfully loaded
|
||||
* null if failure
|
||||
*/
|
||||
extern (C) void* rt_loadLibrary(const char* name)
|
||||
{
|
||||
return initLibrary(.LoadLibraryA(name));
|
||||
}
|
||||
|
||||
extern (C) void* rt_loadLibraryW(const wchar_t* name)
|
||||
{
|
||||
return initLibrary(.LoadLibraryW(name));
|
||||
}
|
||||
|
||||
void* initLibrary(void* mod)
|
||||
{
|
||||
// BUG: LoadLibrary() call calls rt_init(), which fails if proxy is not set!
|
||||
// (What? LoadLibrary() is a Windows API call, it shouldn't call rt_init().)
|
||||
if (mod is null)
|
||||
return mod;
|
||||
gcSetFn gcSet = cast(gcSetFn) GetProcAddress(mod, "gc_setProxy");
|
||||
if (gcSet !is null)
|
||||
{ // BUG: Set proxy, but too late
|
||||
gcSet(gc_getProxy());
|
||||
}
|
||||
return mod;
|
||||
}
|
||||
|
||||
/*************************************
|
||||
* Unloads DLL that was previously loaded by rt_loadLibrary().
|
||||
* Input:
|
||||
* ptr the handle returned by rt_loadLibrary()
|
||||
* Returns:
|
||||
* 1 succeeded
|
||||
* 0 some failure happened
|
||||
*/
|
||||
extern (C) int rt_unloadLibrary(void* ptr)
|
||||
{
|
||||
gcClrFn gcClr = cast(gcClrFn) GetProcAddress(ptr, "gc_clrProxy");
|
||||
if (gcClr !is null)
|
||||
gcClr();
|
||||
return FreeLibrary(ptr) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* To get out-of-band access to the args[] passed to main().
|
||||
*/
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user