From df8f8618917332bbc5e681ac57971112dedb91d8 Mon Sep 17 00:00:00 2001 From: wirx6 Date: Thu, 5 Oct 2017 21:55:00 +0200 Subject: [PATCH 1/2] druntime: build on mingw-w64 *add FILE definition *use ms's stdio functions *another try to fix sections *phobos will be fixed later --- src/core/stdc/stdio.d | 225 +++++++++++++++++++++--------------------- src/rt/sections.d | 2 +- src/rt/sections_ldc.d | 21 ++++ 3 files changed, 132 insertions(+), 116 deletions(-) diff --git a/src/core/stdc/stdio.d b/src/core/stdc/stdio.d index 7ce585c70f..ac8c80a31d 100644 --- a/src/core/stdc/stdio.d +++ b/src/core/stdc/stdio.d @@ -59,7 +59,7 @@ version( CRuntime_DigitalMars ) /// enum int L_tmpnam = _P_tmpdir.length + 12; } -else version( CRuntime_Microsoft ) +else version( Windows ) { enum { @@ -265,6 +265,23 @@ else version( CRuntime_Microsoft ) /// alias shared(_iobuf) FILE; } +else version( MinGW ) +{ + alias long fpos_t; + + struct _iobuf { + char *_ptr; + int _cnt; + char *_base; + int _flag; + int _file; + int _charbuf; + int _bufsiz; + char *_tmpfname; + }; + + alias shared(_iobuf) FILE; +} else version( CRuntime_Glibc ) { import core.stdc.wchar_ : mbstate_t; @@ -556,6 +573,49 @@ version( CRuntime_DigitalMars ) /// shared stdprn = &_iob[4]; } +else version( MinGW ) +{ + enum + { + /// + _IOFBF = 0, + /// + _IOLBF = 0x40, + /// + _IONBF = 4, + /// + _IOREAD = 1, // non-standard + /// + _IOWRT = 2, // non-standard + /// + _IOMYBUF = 8, // non-standard + /// + _IOEOF = 0x10, // non-standard + /// + _IOERR = 0x20, // non-standard + /// + _IOSTRG = 0x40, // non-standard + /// + _IORW = 0x80, // non-standard + /// + _IOAPP = 0x200, // non-standard + /// + _IOAPPEND = 0x200, // non-standard + } + + extern shared void function() _fcloseallp; + + private extern shared FILE[_NFILE] _iob; + + shared(FILE)* __iob_func(); + + /// + shared FILE* stdin = &_iob[0]; + /// + shared FILE* stdout = &_iob[1]; + /// + shared FILE* stderr = &_iob[2]; +} else version( CRuntime_Microsoft ) { enum @@ -748,98 +808,30 @@ FILE* freopen(in char* filename, in char* mode, FILE* stream); void setbuf(FILE* stream, char* buf); /// int setvbuf(FILE* stream, char* buf, int mode, size_t size); - -version (MinGW) -{ - // Prefer the MinGW versions over the MSVC ones, as the latter don't handle - // reals at all. - /// - int __mingw_fprintf(FILE* stream, in char* format, ...); - /// - alias __mingw_fprintf fprintf; - - /// - int __mingw_fscanf(FILE* stream, in char* format, ...); - /// - alias __mingw_fscanf fscanf; - - /// - int __mingw_sprintf(char* s, in char* format, ...); - /// - alias __mingw_sprintf sprintf; - - /// - int __mingw_sscanf(in char* s, in char* format, ...); - /// - alias __mingw_sscanf sscanf; - - /// - int __mingw_vfprintf(FILE* stream, in char* format, va_list arg); - /// - alias __mingw_vfprintf vfprintf; - - /// - int __mingw_vfscanf(FILE* stream, in char* format, va_list arg); - /// - alias __mingw_vfscanf vfscanf; - - /// - int __mingw_vsprintf(char* s, in char* format, va_list arg); - /// - alias __mingw_vsprintf vsprintf; - - /// - int __mingw_vsscanf(in char* s, in char* format, va_list arg); - /// - alias __mingw_vsscanf vsscanf; - - /// - int __mingw_vprintf(in char* format, va_list arg); - /// - alias __mingw_vprintf vprintf; - - /// - int __mingw_vscanf(in char* format, va_list arg); - /// - alias __mingw_vscanf vscanf; - - /// - int __mingw_printf(in char* format, ...); - /// - alias __mingw_printf printf; - - /// - int __mingw_scanf(in char* format, ...); - /// - alias __mingw_scanf scanf; -} -else -{ - /// - int fprintf(FILE* stream, in char* format, ...); - /// - int fscanf(FILE* stream, in char* format, ...); - /// - int sprintf(char* s, in char* format, ...); - /// - int sscanf(in char* s, in char* format, ...); - /// - int vfprintf(FILE* stream, in char* format, va_list arg); - /// - int vfscanf(FILE* stream, in char* format, va_list arg); - /// - int vsprintf(char* s, in char* format, va_list arg); - /// - int vsscanf(in char* s, in char* format, va_list arg); - /// - int vprintf(in char* format, va_list arg); - /// - int vscanf(in char* format, va_list arg); - /// - int printf(in char* format, ...); - /// - int scanf(in char* format, ...); -} +/// +int fprintf(FILE* stream, in char* format, ...); +/// +int fscanf(FILE* stream, in char* format, ...); +/// +int sprintf(char* s, in char* format, ...); +/// +int sscanf(in char* s, in char* format, ...); +/// +int vfprintf(FILE* stream, in char* format, va_list arg); +/// +int vfscanf(FILE* stream, in char* format, va_list arg); +/// +int vsprintf(char* s, in char* format, va_list arg); +/// +int vsscanf(in char* s, in char* format, va_list arg); +/// +int vprintf(in char* format, va_list arg); +/// +int vscanf(in char* format, va_list arg); +/// +int printf(in char* format, ...); +/// +int scanf(in char* format, ...); // No unsafe pointer manipulation. @trusted @@ -896,35 +888,37 @@ size_t fwrite(in void* ptr, size_t size, size_t nmemb, FILE* stream); version( MinGW ) { - // No unsafe pointer manipulation. - extern (D) @trusted - { - /// - void rewind(FILE* stream) { fseek(stream,0L,SEEK_SET); stream._flag = stream._flag & ~_IOERR; } - /// - pure void clearerr(FILE* stream) { stream._flag = stream._flag & ~(_IOERR|_IOEOF); } + // No unsafe pointer manipulation. + @trusted + { + /// + void rewind(FILE* stream); + /// + pure void clearerr(FILE* stream); + /// + pure int feof(FILE* stream); + /// + pure int ferror(FILE* stream); + /// + pure int fileno(FILE* stream); + } + /// - pure int feof(FILE* stream) { return stream._flag&_IOEOF; } + int _snprintf(char* s, size_t n, in char* format, ...); /// - pure int ferror(FILE* stream) { return stream._flag&_IOERR; } - } - /// - int __mingw_snprintf(char* s, size_t n, in char* fmt, ...); + int snprintf(char* s, size_t n, in char* format, ...); + /// - alias __mingw_snprintf _snprintf; + int _vsnprintf(char* s, size_t n, in char* format, va_list arg); /// - alias __mingw_snprintf snprintf; + int vsnprintf(char* s, size_t n, in char* format, va_list arg); /// - int __mingw_vsnprintf(char* s, size_t n, in char* format, va_list arg); - /// - alias __mingw_vsnprintf _vsnprintf; + int _lock_file(FILE *fp); /// - alias __mingw_vsnprintf vsnprintf; - - uint _set_output_format(uint format); - enum _TWO_DIGIT_EXPONENT = 1; + int _unlock_file(FILE *fp); + /// intptr_t _get_osfhandle(int fd); int _open_osfhandle(intptr_t osfhandle, int flags); } @@ -1232,7 +1226,7 @@ version(CRuntime_DigitalMars) FILE *_wfdopen(int fd, const(wchar)* flags); /// } -else version (CRuntime_Microsoft) +else version (Windows) { int _open(const char* filename, int oflag, ...); /// int _wopen(const wchar* filename, int oflag, ...); /// @@ -1241,6 +1235,7 @@ else version (CRuntime_Microsoft) int _close(int fd); /// FILE *_fdopen(int fd, const(char)* flags); /// FILE *_wfdopen(int fd, const(wchar)* flags); /// + alias _fdopen fdopen; } version (Windows) diff --git a/src/rt/sections.d b/src/rt/sections.d index 3e93392b11..57df62335d 100644 --- a/src/rt/sections.d +++ b/src/rt/sections.d @@ -22,7 +22,7 @@ else version (OSX) public import rt.sections_osx; else version (CRuntime_DigitalMars) public import rt.sections_win32; -else version (CRuntime_Microsoft) +else version (Windows) public import rt.sections_win64; else version (CRuntime_Bionic) public import rt.sections_android; diff --git a/src/rt/sections_ldc.d b/src/rt/sections_ldc.d index f423af950f..571b252d7f 100644 --- a/src/rt/sections_ldc.d +++ b/src/rt/sections_ldc.d @@ -106,6 +106,27 @@ private void* _bss_end__; } } + else version (MinGW) + { + version (Win32) + { + extern extern (C) __gshared + { + int _data_start__; + int _bss_end__; + } + } + else version (Win64) + { + extern extern (C) __gshared + { + int __data_start__; + int __bss_end__; + } + alias _data_start__ = __data_start__; + alias _bss_end__ = __bss_end__; + } + } else version (Windows) { extern extern (C) __gshared From c251cc34341e7ff9d61c42cd209e2bf5b4755059 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 27 Oct 2017 17:37:22 +0200 Subject: [PATCH 2/2] Cleanup --- src/core/stdc/stdio.d | 119 ++++++++++-------------------------------- src/rt/sections.d | 6 ++- src/rt/sections_ldc.d | 10 ++-- 3 files changed, 36 insertions(+), 99 deletions(-) diff --git a/src/core/stdc/stdio.d b/src/core/stdc/stdio.d index ac8c80a31d..3ffca8c089 100644 --- a/src/core/stdc/stdio.d +++ b/src/core/stdc/stdio.d @@ -573,50 +573,7 @@ version( CRuntime_DigitalMars ) /// shared stdprn = &_iob[4]; } -else version( MinGW ) -{ - enum - { - /// - _IOFBF = 0, - /// - _IOLBF = 0x40, - /// - _IONBF = 4, - /// - _IOREAD = 1, // non-standard - /// - _IOWRT = 2, // non-standard - /// - _IOMYBUF = 8, // non-standard - /// - _IOEOF = 0x10, // non-standard - /// - _IOERR = 0x20, // non-standard - /// - _IOSTRG = 0x40, // non-standard - /// - _IORW = 0x80, // non-standard - /// - _IOAPP = 0x200, // non-standard - /// - _IOAPPEND = 0x200, // non-standard - } - - extern shared void function() _fcloseallp; - - private extern shared FILE[_NFILE] _iob; - - shared(FILE)* __iob_func(); - - /// - shared FILE* stdin = &_iob[0]; - /// - shared FILE* stdout = &_iob[1]; - /// - shared FILE* stderr = &_iob[2]; -} -else version( CRuntime_Microsoft ) +else version( Windows ) { enum { @@ -646,14 +603,32 @@ else version( CRuntime_Microsoft ) _IOAPPEND = 0x200, // non-standard } - extern shared void function() _fcloseallp; + version (CRuntime_Microsoft) + { + extern shared void function() _fcloseallp; - /// - shared FILE* stdin; // = &__iob_func()[0]; - /// - shared FILE* stdout; // = &__iob_func()[1]; - /// - shared FILE* stderr; // = &__iob_func()[2]; + /// + shared FILE* stdin; // = &__iob_func()[0]; + /// + shared FILE* stdout; // = &__iob_func()[1]; + /// + shared FILE* stderr; // = &__iob_func()[2]; + } + else version (MinGW) + { + private extern shared FILE[_NFILE] _iob; + + /// + shared FILE* stdin = &_iob[0]; + /// + shared FILE* stdout = &_iob[1]; + /// + shared FILE* stderr = &_iob[2]; + } + else + { + static assert(false, "Unsupported platform"); + } } else version( CRuntime_Glibc ) { @@ -886,43 +861,7 @@ size_t fwrite(in void* ptr, size_t size, size_t nmemb, FILE* stream); c_long ftell(FILE* stream); } -version( MinGW ) -{ - // No unsafe pointer manipulation. - @trusted - { - /// - void rewind(FILE* stream); - /// - pure void clearerr(FILE* stream); - /// - pure int feof(FILE* stream); - /// - pure int ferror(FILE* stream); - /// - pure int fileno(FILE* stream); - } - - /// - int _snprintf(char* s, size_t n, in char* format, ...); - /// - int snprintf(char* s, size_t n, in char* format, ...); - - /// - int _vsnprintf(char* s, size_t n, in char* format, va_list arg); - /// - int vsnprintf(char* s, size_t n, in char* format, va_list arg); - - /// - int _lock_file(FILE *fp); - /// - int _unlock_file(FILE *fp); - - /// - intptr_t _get_osfhandle(int fd); - int _open_osfhandle(intptr_t osfhandle, int flags); -} -else version( CRuntime_DigitalMars ) +version( CRuntime_DigitalMars ) { // No unsafe pointer manipulation. extern (D) @trusted @@ -948,7 +887,7 @@ else version( CRuntime_DigitalMars ) /// alias _vsnprintf vsnprintf; } -else version( CRuntime_Microsoft ) +else version( Windows ) { // No unsafe pointer manipulation. @trusted @@ -1234,8 +1173,8 @@ else version (Windows) int _wsopen(const wchar* filename, int oflag, int shflag, ...); /// int _close(int fd); /// FILE *_fdopen(int fd, const(char)* flags); /// + alias fdopen = _fdopen; /// FILE *_wfdopen(int fd, const(wchar)* flags); /// - alias _fdopen fdopen; } version (Windows) diff --git a/src/rt/sections.d b/src/rt/sections.d index 57df62335d..c0e6decca4 100644 --- a/src/rt/sections.d +++ b/src/rt/sections.d @@ -22,9 +22,11 @@ else version (OSX) public import rt.sections_osx; else version (CRuntime_DigitalMars) public import rt.sections_win32; -else version (Windows) +else version (CRuntime_Microsoft) public import rt.sections_win64; -else version (CRuntime_Bionic) +else version (MinGW) { + // handled by rt.sections_ldc +} else version (CRuntime_Bionic) public import rt.sections_android; else static assert(0, "unimplemented"); diff --git a/src/rt/sections_ldc.d b/src/rt/sections_ldc.d index 571b252d7f..8500a6b67c 100644 --- a/src/rt/sections_ldc.d +++ b/src/rt/sections_ldc.d @@ -126,13 +126,9 @@ private alias _data_start__ = __data_start__; alias _bss_end__ = __bss_end__; } - } - else version (Windows) - { - extern extern (C) __gshared + else { - int _data_start__; - int _bss_end__; + static assert(false, "Unsupported platform"); } } else version (UseELF) @@ -400,7 +396,7 @@ void initSections() pushRange(_bss_start__, _bss_end__); } } - else version (Windows) + else version (MinGW) { pushRange(&_data_start__, &_bss_end__); }