public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/ibuclaw/heads/mingw)] Really fix hello world
@ 2021-04-08 13:36 Iain Buclaw
  0 siblings, 0 replies; 3+ messages in thread
From: Iain Buclaw @ 2021-04-08 13:36 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:554b372620ff8ce54c2d5621579ddc28b8fdd1db

commit 554b372620ff8ce54c2d5621579ddc28b8fdd1db
Author: Iain Buclaw <ibuclaw@gdcproject.org>
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   | 108 +++++++++++++++++++++++++++---
 libphobos/m4/druntime/libraries.m4        |  14 ----
 5 files changed, 110 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
 <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.  */
+/* 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 532a0803f55..c4dce71f1e0 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);
     ///
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])
-])


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [gcc(refs/users/ibuclaw/heads/mingw)] Really fix hello world
@ 2021-04-10 15:22 Iain Buclaw
  0 siblings, 0 replies; 3+ messages in thread
From: Iain Buclaw @ 2021-04-10 15:22 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:1f370679204cb34d1a57e57ebe85612d311be6ca

commit 1f370679204cb34d1a57e57ebe85612d311be6ca
Author: Iain Buclaw <ibuclaw@gdcproject.org>
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   | 108 +++++++++++++++++++++++++++---
 libphobos/m4/druntime/libraries.m4        |  14 ----
 5 files changed, 110 insertions(+), 104 deletions(-)

diff --git a/libphobos/configure b/libphobos/configure
index e483fcd8360..fe7cd9c11ff 100755
--- a/libphobos/configure
+++ b/libphobos/configure
@@ -15067,80 +15067,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 1b1ce5008f0..3b5a830cccf 100644
--- a/libphobos/configure.ac
+++ b/libphobos/configure.ac
@@ -160,7 +160,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
 <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.  */
+/* 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 532a0803f55..c4dce71f1e0 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);
     ///
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])
-])


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [gcc(refs/users/ibuclaw/heads/mingw)] Really fix hello world
@ 2021-03-25 18:06 Iain Buclaw
  0 siblings, 0 replies; 3+ messages in thread
From: Iain Buclaw @ 2021-03-25 18:06 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d76402050d8c2f5fcd2e3129745e194d6d51d256

commit d76402050d8c2f5fcd2e3129745e194d6d51d256
Author: Iain Buclaw <ibuclaw@gdcproject.org>
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
 <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.  */
+/* 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])
-])


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-04-10 15:22 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-08 13:36 [gcc(refs/users/ibuclaw/heads/mingw)] Really fix hello world Iain Buclaw
  -- strict thread matches above, loose matches on Subject: below --
2021-04-10 15:22 Iain Buclaw
2021-03-25 18:06 Iain Buclaw

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).