From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1873) id 7D1993858001; Thu, 25 Mar 2021 18:06:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7D1993858001 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Iain Buclaw To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/ibuclaw/heads/mingw)] Really fix hello world X-Act-Checkin: gcc X-Git-Author: Iain Buclaw X-Git-Refname: refs/users/ibuclaw/heads/mingw X-Git-Oldrev: 7432cad757def574c0e752de38870ad5df5056ab X-Git-Newrev: d76402050d8c2f5fcd2e3129745e194d6d51d256 Message-Id: <20210325180631.7D1993858001@sourceware.org> Date: Thu, 25 Mar 2021 18:06:31 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Mar 2021 18:06:31 -0000 https://gcc.gnu.org/g:d76402050d8c2f5fcd2e3129745e194d6d51d256 commit d76402050d8c2f5fcd2e3129745e194d6d51d256 Author: Iain Buclaw Date: Thu Mar 25 17:13:49 2021 +0100 Really fix hello world Diff: --- libphobos/configure | 74 -------------------- libphobos/configure.ac | 1 - libphobos/libdruntime/config/mingw/msvc.c | 17 +++-- libphobos/libdruntime/core/stdc/stdio.d | 109 +++++++++++++++++++++++++++--- libphobos/m4/druntime/libraries.m4 | 14 ---- 5 files changed, 111 insertions(+), 104 deletions(-) diff --git a/libphobos/configure b/libphobos/configure index 037b030a03e..59ca64aa1e0 100755 --- a/libphobos/configure +++ b/libphobos/configure @@ -15024,80 +15024,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - case "$druntime_cv_target_os" in - mingw*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing _fputc_nolock" >&5 -$as_echo_n "checking for library containing _fputc_nolock... " >&6; } -if ${ac_cv_search__fputc_nolock+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char _fputc_nolock (); -int -main () -{ -return _fputc_nolock (); - ; - return 0; -} -_ACEOF -for ac_lib in '' ucrtbase; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search__fputc_nolock=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search__fputc_nolock+:} false; then : - break -fi -done -if ${ac_cv_search__fputc_nolock+:} false; then : - -else - ac_cv_search__fputc_nolock=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search__fputc_nolock" >&5 -$as_echo "$ac_cv_search__fputc_nolock" >&6; } -ac_res=$ac_cv_search__fputc_nolock -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - - ;; - esac - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - druntime_check_both=no ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : diff --git a/libphobos/configure.ac b/libphobos/configure.ac index 4511cf3d79f..248d0ebbc19 100644 --- a/libphobos/configure.ac +++ b/libphobos/configure.ac @@ -159,7 +159,6 @@ WITH_LOCAL_DRUNTIME([ DRUNTIME_LIBRARIES_ATOMIC DRUNTIME_LIBRARIES_BACKTRACE DRUNTIME_LIBRARIES_DLOPEN -DRUNTIME_LIBRARIES_IO DRUNTIME_LIBRARIES_NET DRUNTIME_LIBRARIES_UCONTEXT DRUNTIME_LIBRARIES_ZLIB diff --git a/libphobos/libdruntime/config/mingw/msvc.c b/libphobos/libdruntime/config/mingw/msvc.c index 85ce3741bca..4ca77e58f5a 100644 --- a/libphobos/libdruntime/config/mingw/msvc.c +++ b/libphobos/libdruntime/config/mingw/msvc.c @@ -23,10 +23,13 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ +#ifdef __MINGW32__ +#include <_mingw.h> +#endif #include -/* The symbols for stdin, stdout, and stderr are defined for D in the - core.stdc.stdio module. Save the macros and redeclare them here. */ +/* 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; @@ -36,16 +39,16 @@ static FILE *core_stdc_stdout; __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 - msvcUsedUCRT = 1; -#endif - core_stdc_stdin = stdin; core_stdc_stdout = stdout; core_stdc_stderr = stderr; + +#if __MSVCRT_VERSION__ >= 0xE00 + msvcUsedUCRT = 1; +#endif } diff --git a/libphobos/libdruntime/core/stdc/stdio.d b/libphobos/libdruntime/core/stdc/stdio.d index 67011596b1c..eb029db3bfa 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; + } } /// @@ -1322,7 +1336,8 @@ version (CRuntime_DigitalMars) /// pure int fileno()(FILE* stream) { return stream._file; } } - /// + + /// int _snprintf(scope char* s, size_t n, scope const char* fmt, scope const ...); /// alias _snprintf snprintf; @@ -1331,6 +1346,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) { @@ -1346,7 +1380,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) @@ -1377,16 +1414,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) + { + 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 _fputc_nolock(int c, 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 _fgetc_nolock(FILE *fp); - + int _fputc_nolock(int c, FILE* fp); /// - int _lock_file(FILE *fp); + int _fgetc_nolock(FILE* fp); + } /// - int _unlock_file(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); /// diff --git a/libphobos/m4/druntime/libraries.m4 b/libphobos/m4/druntime/libraries.m4 index 194602c1bf1..743d3e3e17c 100644 --- a/libphobos/m4/druntime/libraries.m4 +++ b/libphobos/m4/druntime/libraries.m4 @@ -233,17 +233,3 @@ AC_DEFUN([DRUNTIME_LIBRARIES_UCONTEXT], AC_MSG_ERROR([swapcontext required but not found])) fi ]) - -# DRUNTIME_LIBRARIES_IO -# ----------------------- -# Autodetect and add IO library to LIBS if necessary. -AC_DEFUN([DRUNTIME_LIBRARIES_IO], -[ - AC_LANG_PUSH([C]) - case "$druntime_cv_target_os" in - mingw*) - AC_SEARCH_LIBS([_fputc_nolock], [ucrtbase]) - ;; - esac - AC_LANG_POP([C]) -])