diff --git a/gcc/config.host b/gcc/config.host index a522c39658e336c3a93595728ac5993f090c8823..4abb32ad73d3af2f332e0adc115c8d439a264ebb 100644 --- a/gcc/config.host +++ b/gcc/config.host @@ -241,10 +241,11 @@ case ${host} in x86_64-*-mingw*) use_long_long_for_widest_fast_int=yes host_xm_file=i386/xm-mingw32.h - host_xmake_file="${host_xmake_file} i386/x-mingw32" + host_xmake_file="${host_xmake_file} i386/x-mingw32 i386/x-mingw32-utf8" host_exeext=.exe out_host_hook_obj=host-mingw32.o - host_extra_gcc_objs="${host_extra_gcc_objs} driver-mingw32.o" + host_extra_objs="${host_extra_objs} utf8-mingw32.o" + host_extra_gcc_objs="${host_extra_gcc_objs} driver-mingw32.o utf8rc-mingw32.o" host_lto_plugin_soname=liblto_plugin.dll ;; aarch64*-*-darwin*) diff --git a/gcc/config/i386/sym-mingw32.cc b/gcc/config/i386/sym-mingw32.cc new file mode 100644 index 0000000000000000000000000000000000000000..f369698abc4155b10999900dd5186649c3a87ca0 --- /dev/null +++ b/gcc/config/i386/sym-mingw32.cc @@ -0,0 +1 @@ +char HOST_EXTRA_OBJS_SYMBOL; diff --git a/gcc/config/i386/utf8-mingw32.rc b/gcc/config/i386/utf8-mingw32.rc new file mode 100644 index 0000000000000000000000000000000000000000..e2174e85b7c1f908d2cc4b02a7e84eb7bafbdf72 --- /dev/null +++ b/gcc/config/i386/utf8-mingw32.rc @@ -0,0 +1,3 @@ +#include <winuser.h> + +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "winnt-utf8.manifest" diff --git a/gcc/config/i386/winnt-utf8.manifest b/gcc/config/i386/winnt-utf8.manifest new file mode 100644 index 0000000000000000000000000000000000000000..dab929e1515a2bdf20e2e89afe9cc3985ca95da2 --- /dev/null +++ b/gcc/config/i386/winnt-utf8.manifest @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> + <application> + <windowsSettings> + <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage> + </windowsSettings> + </application> +</assembly> diff --git a/gcc/config/i386/x-mingw32 b/gcc/config/i386/x-mingw32 index 5b8b5f96143c6044516c941f479c929631ffbe73..cb3d84348816252dfd845ffcbf447180aae0f3ba 100644 --- a/gcc/config/i386/x-mingw32 +++ b/gcc/config/i386/x-mingw32 @@ -27,8 +27,7 @@ WERROR_FLAGS += -Wno-format host-mingw32.o : $(srcdir)/config/i386/host-mingw32.cc $(CONFIG_H) $(SYSTEM_H) \ coretypes.h hosthooks.h hosthooks-def.h toplev.h $(DIAGNOSTIC_H) $(HOOKS_H) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(srcdir)/config/i386/host-mingw32.cc + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< driver-mingw32.o : $(srcdir)/config/i386/driver-mingw32.cc $(CONFIG_H) $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< diff --git a/gcc/config/i386/x-mingw32-utf8 b/gcc/config/i386/x-mingw32-utf8 new file mode 100644 index 0000000000000000000000000000000000000000..6161dc2354718379d91c1df4dc9024dfefa65485 --- /dev/null +++ b/gcc/config/i386/x-mingw32-utf8 @@ -0,0 +1,56 @@ +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. +# +# +# For 64-bit Windows host, embed a manifest that sets the active +# code page of the driver and compiler proper processes to utf8. +# This only has an effect on Windows version 1903 (May 2019 Update) +# or later. + +# The resource .rc file references the utf8 .manifest file. +# Compile it into an object file using windres. +# The resulting .o file gets added to host_extra_gcc_objs in +# config.host for x86_64-*-mingw* host and gets linked into +# the driver as a .o file, so it's lack of symbols is OK. +utf8rc-mingw32.o : $(srcdir)/config/i386/utf8-mingw32.rc + $(WINDRES) $< $@ + +# Create an object file that just exports the global symbol +# HOST_EXTRA_OBJS_SYMBOL +sym-mingw32.o : $(srcdir)/config/i386/sym-mingw32.cc + $(COMPILER) -c $< $@ + +# Combine the two object files into one which has both the +# compiled utf8 resource and the HOST_EXTRA_OBJS_SYMBOL symbol. +# The resulting .o file gets added to host_extra_objs in +# config.host for x86_64-*-mingw* host and gets archived into +# libbackend.a which gets linked into the compiler proper. +# If nothing references it into libbackend.a, it will not +# get linked into the compiler proper eventually. +# Therefore we need to request the symbol at compiler link time. +utf8-mingw32.o : utf8rc-mingw32.o sym-mingw32.o + $(COMPILER) -r utf8rc-mingw32.o sym-mingw32.o -o $@ + +# Force compilers to link against the utf8 resource by +# requiring the symbol to be defined. +# Otherwise the object file won't get linked in the compilers +# because nothing is referencing it in libbackend.a +# This is expected because the resource object is not supposed +# to have any symbols, it just has to be linked into the +# executable in order for Windows to use the utf8 code page. +$(COMPILERS) : override LDFLAGS += -Wl,--require-defined=HOST_EXTRA_OBJS_SYMBOL