Bug 91595 - Version (Windows) is not defined in GCC D Compiler
Summary: Version (Windows) is not defined in GCC D Compiler
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: d (show other bugs)
Version: 9.2.0
: P3 normal
Target Milestone: ---
Assignee: Iain Buclaw
URL:
Keywords:
: 91600 91666 (view as bug list)
Depends on:
Blocks:
 
Reported: 2019-08-29 06:54 UTC by ray linn
Modified: 2021-03-26 15:50 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
winnt-d support (1.77 KB, patch)
2020-03-22 00:16 UTC, Iain Buclaw
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description ray linn 2019-08-29 06:54:36 UTC
when build Druntime with msys2/mingw-w64 on Windows 10, it looks version (Windows) is not defined into the compiler.

The trouble appears while building libdruntime

EXAMPLE: libphobos\libdruntime\core\stdc\time.d
error: undefined identifier 'time_t'
error: undefined identifier 'tm'

Manually add

version (GNU) {
    alias c_long time_t;
    alias c_long clock_t;
}

into time.d then it compiles but it seems weird.

The trouble is that there are many other similar errors
with core\stdc\stddef.d, stdlib.d, stdint.d, etc ...
Comment 1 Iain Buclaw 2020-03-22 00:08:36 UTC
*** Bug 91666 has been marked as a duplicate of this bug. ***
Comment 2 Iain Buclaw 2020-03-22 00:09:23 UTC
*** Bug 91600 has been marked as a duplicate of this bug. ***
Comment 3 Iain Buclaw 2020-03-22 00:16:55 UTC
Created attachment 48078 [details]
winnt-d support

Attached patch, though the target is untested.
Comment 4 Brecht Sanders 2021-03-21 09:56:42 UTC
I tried to build gcc 10 snapshot 20210320 for Windows 64-bit with the proposed patch.

First I got this error:

make[2]: Entering directory '/R/winlibs64_stage/gcc-10-20210320/build_mingw/gcc'make[2]: *** No rule to make target 'config/winnt-d.c', needed by 'winnt-d.o'.
Stop.

After copying the file manually there like this:

mkdir -p build_mingw/gcc/config
cp -u gcc/config/i386/winnt-d.c build_mingw/gcc/config/

I got this error:

d:/prog/winlibs64_stage/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.0.1/../../../../x86_64-w64-mingw32/bin/ld.exe: winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.c:60: multiple definition of `targetdm'; winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.c:60: first defined here
collect2.exe: error: ld returned 1 exit status
Comment 5 Iain Buclaw 2021-03-21 10:30:57 UTC
(In reply to Brecht Sanders from comment #4)
> I tried to build gcc 10 snapshot 20210320 for Windows 64-bit with the
> proposed patch.
> 
> First I got this error:
> 
> make[2]: Entering directory
> '/R/winlibs64_stage/gcc-10-20210320/build_mingw/gcc'make[2]: *** No rule to
> make target 'config/winnt-d.c', needed by 'winnt-d.o'.
> Stop.
> 

That is because the build rule is not correct, it should be config/i386/winnt-d.c according to the location of the file in the patch.

> After copying the file manually there like this:
> 
> mkdir -p build_mingw/gcc/config
> cp -u gcc/config/i386/winnt-d.c build_mingw/gcc/config/
> 
> I got this error:
> 
> d:/prog/winlibs64_stage/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.0.1/../.
> ./../../x86_64-w64-mingw32/bin/ld.exe:
> winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.
> c:60: multiple definition of `targetdm';
> winnt-d.o:R:\winlibs64_stage\gcc-10-20210320\build_mingw\gcc/config/winnt-d.
> c:60: first defined here
> collect2.exe: error: ld returned 1 exit status

Because I imagine it's now picked up the object file from two different locations.
Comment 6 Brecht Sanders 2021-03-21 13:11:42 UTC
The patch for gcc/config/i386/t-cygming added a line:
winnt-d.o: config/winnt-d.c
I changed it to:
winnt-d.o: config/i386/winnt-d.c

Then I got one step further.

Output is now:
libtool: compile:  /R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/gdc -B/R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/ -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/lib -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/include -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/bin/ -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib/ -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/sys-include --sysroot=/R/winlibs64_stage/gcc-10-20210320/build_mingw/mingw-w64 -DDLL_EXPORT -Wall -frelease -O2 -g -nostdinc -I ../../../../libphobos/libdruntime -I . -c ../../../../libphobos/libdruntime/core/demangle.d -fversion=Shared -o core/.libs/demangle.o
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:134:5: error: undefined identifier 'FILE'
  134 | int fwprintf(FILE* stream, in wchar_t* format, ...);
      |     ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:136:5: error: undefined identifier 'FILE'
  136 | int fwscanf(FILE* stream, in wchar_t* format, ...);
      |     ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:139:5: error: undefined identifier 'FILE'
  139 | int vfwprintf(FILE* stream, in wchar_t* format, va_list arg);
      |     ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:141:5: error: undefined identifier 'FILE'
  141 | int vfwscanf(FILE* stream, in wchar_t* format, va_list arg);
      |     ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:177:12: error: undefined identifier 'FILE'
  177 |     wint_t fgetwc(FILE* stream);
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:179:12: error: undefined identifier 'FILE'
  179 |     wint_t fputwc(wchar_t c, FILE* stream);
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:183:10: error: undefined identifier 'FILE'
  183 | wchar_t* fgetws(wchar_t* s, int n, FILE* stream);
      |          ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:185:10: error: undefined identifier 'FILE'
  185 | int      fputws(in wchar_t* s, FILE* stream);
      |          ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:195:12: error: undefined identifier 'FILE'
  195 |     wint_t getwc(FILE* stream)            { return fgetwc(stream);    }
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:197:12: error: undefined identifier 'FILE'
  197 |     wint_t putwc(wchar_t c, FILE* stream) { return fputwc(c, stream); }
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:204:12: error: undefined identifier 'FILE'
  204 |     wint_t ungetwc(wint_t c, FILE* stream);
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:213:16: error: undefined identifier 'FILE'
  213 |         int    fwide(FILE* stream, int mode);
      |                ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1140:16: error: undefined identifier 'FILE'
 1140 | @trusted FILE* tmpfile(); // No unsafe pointer manipulation.
      |                ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1145:7: error: undefined identifier 'FILE'
 1145 | int   fclose(FILE* stream);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1151:11: error: undefined identifier 'FILE'
 1151 |     int   fflush(FILE* stream);
      |           ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1155:7: error: undefined identifier 'FILE'
 1155 | FILE* fopen(scope const char* filename, scope const char* mode);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1157:7: error: undefined identifier 'FILE'
 1157 | FILE* freopen(scope const char* filename, scope const char* mode, FILE*
stream);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1157:7: error: undefined identifier 'FILE'
 1157 | FILE* freopen(scope const char* filename, scope const char* mode, FILE*
stream);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1160:6: error: undefined identifier 'FILE'
 1160 | void setbuf(FILE* stream, char* buf);
      |      ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1162:6: error: undefined identifier 'FILE'
 1162 | int  setvbuf(FILE* stream, char* buf, int mode, size_t size);
      |      ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1169:9: error: undefined identifier 'FILE'
 1169 |     int __mingw_fprintf(FILE* stream, scope const char* format, ...);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1174:9: error: undefined identifier 'FILE'
 1174 |     int __mingw_fscanf(FILE* stream, scope const char* format, ...);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1189:9: error: undefined identifier 'FILE'
 1189 |     int __mingw_vfprintf(FILE* stream, scope const char* format, va_list arg);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1194:9: error: undefined identifier 'FILE'
 1194 |     int __mingw_vfscanf(FILE* stream, scope const char* format, va_list
arg);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1260:9: error: undefined identifier 'FILE'
 1260 |     int fgetc(FILE* stream);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1262:9: error: undefined identifier 'FILE'
 1262 |     int fputc(int c, FILE* stream);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1266:7: error: undefined identifier 'FILE'
 1266 | char* fgets(char* s, int n, FILE* stream);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1268:7: error: undefined identifier 'FILE'
 1268 | int   fputs(scope const char* s, FILE* stream);
      |       ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1288:14: error: undefined identifier 'FILE'
 1288 | @trusted int ungetc(int c, FILE* stream); // No unsafe pointer manipulation.
      |              ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1291:8: error: undefined identifier 'FILE'
 1291 | size_t fread(scope void* ptr, size_t size, size_t nmemb, FILE* stream);
      |        ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1293:8: error: undefined identifier 'FILE'
 1293 | size_t fwrite(scope const void* ptr, size_t size, size_t nmemb, FILE* stream);
      |        ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1299:9: error: undefined identifier 'FILE'
 1299 |     int fgetpos(FILE* stream, scope fpos_t * pos);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1299:9: error: undefined identifier 'fpos_t'
 1299 |     int fgetpos(FILE* stream, scope fpos_t * pos);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1301:9: error: undefined identifier 'FILE'
 1301 |     int fsetpos(FILE* stream, scope const fpos_t* pos);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1301:9: error: undefined identifier 'fpos_t'
 1301 |     int fsetpos(FILE* stream, scope const fpos_t* pos);
      |         ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1304:12: error: undefined identifier 'FILE'
 1304 |     int    fseek(FILE* stream, c_long offset, int whence);
      |            ^
r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\stdio.d:1306:12: error: undefined identifier 'FILE'
 1306 |     c_long ftell(FILE* stream);
      |            ^
../../../../libphobos/libdruntime/core/demangle.d:2622:16: error: module core.stdc.stdio import 'snprintf' not found, did you mean alias 'sprintf'?
 2622 |         import core.stdc.stdio : snprintf;
      |                ^
make[4]: *** [Makefile:2280: core/demangle.lo] Error 1
Comment 7 Iain Buclaw 2021-03-21 13:20:34 UTC
(In reply to Brecht Sanders from comment #6)
> The patch for gcc/config/i386/t-cygming added a line:
> winnt-d.o: config/winnt-d.c
> I changed it to:
> winnt-d.o: config/i386/winnt-d.c
> 
> Then I got one step further.
> 
> Output is now:
> libtool: compile:  /R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/gdc
> -B/R/winlibs64_stage/gcc-10-20210320/build_mingw/./gcc/
> -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib
> -L/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/lib -isystem
> /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include
> -isystem /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/mingw/include
> -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/bin/
> -B/R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/lib/
> -isystem
> /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/include
> -isystem
> /R/winlibs64_stage/inst_gcc-10-20210320/share/gcc/x86_64-w64-mingw32/sys-
> include --sysroot=/R/winlibs64_stage/gcc-10-20210320/build_mingw/mingw-w64
> -DDLL_EXPORT -Wall -frelease -O2 -g -nostdinc -I
> ../../../../libphobos/libdruntime -I . -c
> ../../../../libphobos/libdruntime/core/demangle.d -fversion=Shared -o
> core/.libs/demangle.o
> r:\winlibs64_stage\gcc-10-20210320\libphobos\libdruntime\core\stdc\wchar_.d:
> 134:5: error: undefined identifier 'FILE'
>   134 | int fwprintf(FILE* stream, in wchar_t* format, ...);
>       |     ^

What predefined versions are added by the compiler?

./gcc/d21 -v 2>&1 | grep predefs
Comment 8 Brecht Sanders 2021-03-21 13:27:35 UTC
predefs   GNU D_Version2 LittleEndian GNU_SEH_Exceptions GNU_EMUTLS GNU_StackGrowsDown GNU_InlineAsm D_LP64 D_PIC assert D_ModuleInfo D_Exceptions D_TypeInfo all X86_64 D_HardFloat Windows MinGW Win64 CppRuntime_Gcc
Comment 9 Iain Buclaw 2021-03-21 13:44:31 UTC
(In reply to Brecht Sanders from comment #8)
> predefs   GNU D_Version2 LittleEndian GNU_SEH_Exceptions GNU_EMUTLS
> GNU_StackGrowsDown GNU_InlineAsm D_LP64 D_PIC assert D_ModuleInfo
> D_Exceptions D_TypeInfo all X86_64 D_HardFloat Windows MinGW Win64
> CppRuntime_Gcc
So there's no predefined CRuntime_* version condition, which is where all the missing definitions are hidden behind.

Would MinGW be a CRuntime_Glibc target, a CRuntime_Microsoft target, or using it's own C library that has little commonality with neither glibc nor msvc?
Comment 10 Brecht Sanders 2021-03-21 13:51:44 UTC
I thought MinGW-w64 is it's own C library.
It is found by GCC build process because the folder mingw exists in the location specified with --with-build-sysroot

CppRuntime_Gcc is mentioned in the predefs, why would CRuntime_Gcc not be defined then?
Comment 11 Iain Buclaw 2021-03-21 14:18:44 UTC
(In reply to Brecht Sanders from comment #10)
> I thought MinGW-w64 is it's own C library.
> It is found by GCC build process because the folder mingw exists in the
> location specified with --with-build-sysroot
> 

Right, so there will need to be some porting done to add `version (MinGW)` blocks to druntime in order to define all bindings that are tied to a specific C library - such as core/stdc/stdio.d.

> CppRuntime_Gcc is mentioned in the predefs, why would CRuntime_Gcc not be
> defined then?

CppRuntime_Gcc is for libstdc++, the other C++ runtime library is MSVC++, which GCC is not compatible with.  There is no C runtime library included with GCC.
Comment 12 GCC Commits 2021-03-26 15:15:46 UTC
The master branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:2892e2f70287f961e3bac990b926232cc2a5b123

commit r11-7847-g2892e2f70287f961e3bac990b926232cc2a5b123
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Mar 22 01:18:42 2020 +0100

    d: Add windows support for D compiler [PR91595]
    
    gcc/ChangeLog:
    
            PR d/91595
            * config.gcc (*-*-cygwin*): Add winnt-d.o
            (*-*-mingw*): Likewise.
            * config/i386/cygwin.h (EXTRA_TARGET_D_OS_VERSIONS): New macro.
            * config/i386/mingw32.h (EXTRA_TARGET_D_OS_VERSIONS): Likewise.
            * config/i386/t-cygming: Add winnt-d.o.
            * config/i386/winnt-d.c: New file.
Comment 13 Iain Buclaw 2021-03-26 15:50:28 UTC
Necessary versions have been committed to mainline.  I've created a new PR for tracking library fixes in pr99794.