public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Iain Buclaw <ibuclaw@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/ibuclaw/heads/mingw)] Fix hello world with std.stdio Date: Tue, 13 Apr 2021 20:42:22 +0000 (GMT) [thread overview] Message-ID: <20210413204222.DA9B53951E44@sourceware.org> (raw) https://gcc.gnu.org/g:a56d05672dd4a6b08ed25b6ff2876bd4d5b60290 commit a56d05672dd4a6b08ed25b6ff2876bd4d5b60290 Author: Iain Buclaw <ibuclaw@gdcproject.org> Date: Wed Mar 24 22:11:10 2021 +0100 Fix hello world with std.stdio Diff: --- libphobos/libdruntime/config/mingw/msvc.c | 34 +++++----- libphobos/libdruntime/core/stdc/stdio.d | 108 +++++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 25 deletions(-) diff --git a/libphobos/libdruntime/config/mingw/msvc.c b/libphobos/libdruntime/config/mingw/msvc.c index 25b15a06950..4ca77e58f5a 100644 --- a/libphobos/libdruntime/config/mingw/msvc.c +++ b/libphobos/libdruntime/config/mingw/msvc.c @@ -23,32 +23,32 @@ 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 symbols for stdin, stdout, and stderr are defined for D in the - core.stdc.stdio module. Save the macros and redeclare them here. */ -#define c_stdin stdin -#undef stdin -extern FILE *stdin; +/* 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; -#define c_stdout stdout -#undef stdout -extern FILE *stdout; +__attribute__((weakref ("stdout"))) +static FILE *core_stdc_stdout; -#define c_stderr stderr -#undef stderr -extern FILE *stderr; +__attribute__((weakref ("stderr"))) +static FILE *core_stdc_stderr; -/* Set to 1 if run-time is using ucrtbase.dll. */ +/* Set to 1 if runtime is using libucrt.dll. */ unsigned char msvcUsesUCRT; void init_msvc() { -#if __MSVCRT_VERSION__ >= 0x1400 + core_stdc_stdin = stdin; + core_stdc_stdout = stdout; + core_stdc_stderr = stderr; + +#if __MSVCRT_VERSION__ >= 0xE00 msvcUsedUCRT = 1; #endif - - stdin = c_stdin; - stdout = c_stdout; - stderr = c_stderr; } diff --git a/libphobos/libdruntime/core/stdc/stdio.d b/libphobos/libdruntime/core/stdc/stdio.d index 532a0803f55..6cd7851f96c 100644 --- a/libphobos/libdruntime/core/stdc/stdio.d +++ b/libphobos/libdruntime/core/stdc/stdio.d @@ -391,7 +391,21 @@ else version (CRuntime_Microsoft) /// struct _iobuf { + version (MinGW) + { + char* _ptr; + int _cnt; + char* _base; + int _flag; + int _file; + int _charbuf; + int _bufsiz; + char* _tmpfname; + } + else + { void* undefined; + } } /// @@ -1347,7 +1361,7 @@ version (CRuntime_DigitalMars) /// pure int fileno()(FILE* stream) { return stream._file; } } - /// + /// pragma(printf) int _snprintf(scope char* s, size_t n, scope const char* fmt, scope const ...); /// @@ -1358,6 +1372,25 @@ version (CRuntime_DigitalMars) int _vsnprintf(scope char* s, size_t n, scope const char* format, va_list arg); /// alias _vsnprintf vsnprintf; + + // + // Digital Mars under-the-hood C I/O functions. + // + + /// + int _fputc_nlock(int c, FILE* fp); + /// + int _fputwc_nlock(int c, FILE* fp); + /// + int _fgetc_nlock(FILE* fp); + /// + int _fgetwc_nlock(FILE* fp); + /// + int __fp_lock(FILE* fp); + /// + void __fp_unlock(FILE* fp); + /// + int setmode(int fd, int mode); } else version (CRuntime_Microsoft) { @@ -1373,7 +1406,10 @@ else version (CRuntime_Microsoft) /// pure int ferror(FILE* stream); /// - pure int fileno(FILE* stream); + pure int _fileno(FILE* stream); + /// + alias fileno = _fileno; + } version (MinGW) @@ -1410,16 +1446,72 @@ else version (CRuntime_Microsoft) int vsnprintf(scope char* s, size_t n, scope const char* format, va_list arg); } + // + // Microsoft under-the-hood C I/O functions + // Uses _iobuf* for the unshared version of FILE*, + // usable when the FILE is locked. + // + + version (MinGW) + { + private int _filbuf(FILE*); + private int _flsbuf(int, FILE*); + /// - int _fputc_nolock(int c, FILE *fp); + int _fputc_nolock(int c, FILE* fp) + { + pragma(inline, true); + fp._cnt = fp._cnt - 1; + if (fp._cnt >= 0) + { + immutable ch = cast(char)c; + *fp._ptr = ch; + fp._ptr = fp._ptr + 1; + return ch & 0xFF; + } + else + return _flsbuf(c, fp); + } /// - int _fgetc_nolock(FILE *fp); - + int _fgetc_nolock(FILE* fp) + { + pragma(inline, true); + fp._cnt = fp._cnt - 1; + if (fp._cnt >= 0) + { + immutable ch = *fp._ptr; + fp._ptr = fp._ptr + 1; + return ch & 0xFF; + } + else + return _filbuf(fp); + } + } + else + { /// - int _lock_file(FILE *fp); + int _fputc_nolock(int c, FILE* fp); /// - int _unlock_file(FILE *fp); - + int _fgetc_nolock(FILE* fp); + } + /// + int _fputwc_nolock(int c, FILE* fp); + /// + int _fgetwc_nolock(FILE* fp); + /// + void _lock_file(FILE* fp); + /// + void _unlock_file(FILE* fp); + /// + int _setmode(int fd, int mode); + /// + FILE* _fdopen(int fd, const (char)* mode); + /// + FILE* _wfdopen(int fd, const (wchar)* mode); + /// + int _fseeki64(FILE* stream, long offset, int origin); + /// + long _ftelli64(FILE* stream); /// intptr_t _get_osfhandle(int fd); ///
next reply other threads:[~2021-04-13 20:42 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-13 20:42 Iain Buclaw [this message] -- strict thread matches above, loose matches on Subject: below -- 2021-04-17 20:43 Iain Buclaw 2021-04-16 1:04 Iain Buclaw 2021-04-11 18:58 Iain Buclaw 2021-04-10 17:21 Iain Buclaw 2021-04-10 17:19 Iain Buclaw 2021-04-10 15:22 Iain Buclaw 2021-04-08 13:36 Iain Buclaw 2021-03-24 21:11 Iain Buclaw
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210413204222.DA9B53951E44@sourceware.org \ --to=ibuclaw@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).