[Patch/RFC] Enable PCH for mingw32

Danny Smith dannysmith@clear.net.nz
Tue Jun 1 11:25:00 GMT 2004


 "Zack Weinberg" <zack@codesourcery.com> writes:
| Geoff Keating <geoffk@geoffk.org> writes:
| > Danny Smith <dannysmith@users.sourceforge.net> writes:
| >> The list of undefined external functions are output by
| >> winnt.c:i386_pe_file_end. I do not know how these directives are used by
| >> GNU as, but they do not seem to be needed. In fact, if I undefine
| >> ASM_OUTPUT_EXTERNAL (where the external symbols are saved into a list)
| >> in cygming.h, I can still build working executables and dlls (and the
| >> pch testsuite failures are resolved). Am I missing something or are
| >> these end-of-file directives just for compatability with other
| >> assemblers/linkers as suggested by this comment in winnt.c. 
| ...
| > You probably want to fix this by adding appropriate GTY markers in
| > winnt.c.  I expect that they are needed by some code, otherwise why
| > would someone have gone to the effort of writing all that code?  Plus,
| > it's worth it just so that the testsuite passes.
| 
| I had to fix similar bugs in the ia64 back end.  It looks like this
| bug would be fixed by adding GTY(()) markers to struct extern_list,
| struct export_list, extern_head, and export_head, and using ggc_alloc
| instead of xmalloc in i386_pe_record_(external_function|exported_symbol).
| You'll also have to do the "when you add GTY(()) markers to a file
| that didn't previously have them" dance - see
| http://gcc.gnu.org/onlinedocs/gccint/Files.html for instructions.
| 
| zw

Hello Zack, Geoff. 

Thanks for your help.  I have followed your suggestions and now all pch
testsuite pass!  I have also simplified mingw32_gt_pch_use_address, to
simply return 0 if called with size == 0.

I do not like the idea of changing the pch file to text mode on windows
host. Changing asm_out_file to 'b' is a safer option for mingw32, since
the MS runtime fseek and ftell are not reliable in text mode (according to
MS docs and a lot of mingw bug reports) because of CRLF<->LF translations
and the CTRL-Z EOF marker

I have added target_gtfiles=winnt.c to cygwin, uwin, and interix as well
as mingw32. I haven't tested on those targets. Nor have I tried to use
the code in host-mingw32.c as a host-cygwin out_host_hook_obj. It might
work, but I would prefer if someone who knows more about cygwin's
internal use of virtual memory to test.
   
Revised patch is attached.


There is still a bug that I tripped over when testing the libstdc++
pch file.

On targets that HAVE_TARGET_EXECUTABLE_SUFFIX the command
 gcc foo.h -ofoo
creates foo.{TARGET_EXEXUTABLE_SUFFIX) not foo.  The problem arise in
the call to convert_filename in gcc.c.

I have worked around it for the momemt when testing libstdc++ pch,
by changing the libstdc++ makefile to put a .gch suffix on the files output to
the  stdc++h.gch directory.

Danny


2004-06-01  Danny Smith  <dannysmith@users.sourceforge.net>

        * toplev.c (init_asm_output): Add explicit 'b' to mode when
        opening asm_out_file. 
        * c-pch.c (c_common_write_pch): Remove unnecessary fflush before
        reading asm_out_file. Replace fflush after reading asm_out_file
        with fseek.
        * hosthooks-def.h (HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY): Define
        default and add to HOST_HOOKS_INITIALIZER. 
        * hosthooks.h (gt_pch_alloc_granularity): Declare hook function.
        * gcc-common.c (default_gt_pch_alloc_granularity): New function.
        (gt_pch_save): Use host_hooks.gt_pch_alloc_granularity 
        to set mmi.offset padding.
         * config.gcc (i[34567]86-*-mingw32*): Set target_gtfiles to
        $(srcdir)/config/i386/winnt.c.
        (i[34567]86-*-pe | i[34567]86-*-cygwin*): Likewise.
        (i[34567]86-*-uwin*): Likewise.
        *i[34567]86-*-interix3*): Likewise.
        * config.host (i[34567]86-*-mingw32*): Set out_host_hook_obj.
        * config/i386/host-mingw32.c: New file.
        * config/i386/x-mingw32: Add rule for host-mingw32.o.
        * config/i386/winnt.c: (struct extern_list) Tag as GTY.
        (extern_head): Likewise.
        (struct export_list) Likewise.
        (export_head): Likewise.
        (i386_pe_record_external_function): Use ggc_alloc.
        (i386_pe_record_exported_symbol): Likewise.
        Include "gt-winnt.h" at end.
        * doc/hostconfig.texi: Document
        HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY.

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: mingw32-pch-2.diff
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20040601/689dc33a/attachment.ksh>


More information about the Gcc-patches mailing list