Hi, Hi,
the first part of required code-changes for upcoming cygwin x64 target. ChangeLog 2013-03-22 Kai Tietz <kti...@redhat.com> * config/i386/cygwin-stdint.h: Add support for cygwin x64 target. * config/i386/t-cygwin-w64: New file. * config/i386/cygwin-w64.h: New file. * config/i386/cygwin.h (EXTRA_OS_CPP_BUILTINS): Extend and add support for x64-cygwin target. (CPP_SPEC): Likewise. (CXX_WRAP_SPEC_LIST): Undefine before define. (LIBGCJ_SONAME): Make name minor-build-version dependent. Tested for i686-pc-cygwin, and x86_64-pc-cygwin. Dave, please especially a look to LIBGCJ_SONAME change. I think we should include MAJOR_VERSION here, too. Ok for apply? Regards, Kai Tested with i686-pc-cygwin, and x86_64-pc-cygwin. I will apply tomorrow, if there are no objections by other Windows-target-maintainers. Regards, Kai Index: gcc/config/i386/cygwin-stdint.h =================================================================== --- gcc/config/i386/cygwin-stdint.h (Revision 196898) +++ gcc/config/i386/cygwin-stdint.h (Arbeitskopie) @@ -24,39 +24,71 @@ along with GCC; see the file COPYING3. If not see #define INT8_TYPE "signed char" #define INT16_TYPE "short int" #define INT32_TYPE "int" +#ifdef __x86_64__ +#define INT64_TYPE "long int" +#else #define INT64_TYPE "long long int" +#endif #define UINT8_TYPE "unsigned char" #define UINT16_TYPE "short unsigned int" #define UINT32_TYPE "unsigned int" +#ifdef __x86_64__ +#define UINT64_TYPE "long unsigned int" +#else #define UINT64_TYPE "long long unsigned int" +#endif /* Minimum-width integer types */ #define INT_LEAST8_TYPE "signed char" #define INT_LEAST16_TYPE "short int" #define INT_LEAST32_TYPE "int" +#ifdef __x86_64__ +#define INT_LEAST64_TYPE "long int" +#else #define INT_LEAST64_TYPE "long long int" +#endif #define UINT_LEAST8_TYPE "unsigned char" #define UINT_LEAST16_TYPE "short unsigned int" #define UINT_LEAST32_TYPE "unsigned int" +#ifdef __x86_64__ +#define UINT_LEAST64_TYPE "long unsigned int" +#else #define UINT_LEAST64_TYPE "long long unsigned int" +#endif /* Fastest minimum-width integer types */ #define INT_FAST8_TYPE "signed char" +#ifdef __x86_64__ +#define INT_FAST16_TYPE "long int" +#define INT_FAST32_TYPE "long int" +#define INT_FAST64_TYPE "long int" +#else #define INT_FAST16_TYPE "int" #define INT_FAST32_TYPE "int" #define INT_FAST64_TYPE "long long int" +#endif #define UINT_FAST8_TYPE "unsigned char" +#ifdef __x86_64__ +#define UINT_FAST16_TYPE "long unsigned int" +#define UINT_FAST32_TYPE "long unsigned int" +#define UINT_FAST64_TYPE "long unsigned int" +#else #define UINT_FAST16_TYPE "unsigned int" #define UINT_FAST32_TYPE "unsigned int" #define UINT_FAST64_TYPE "long long unsigned int" +#endif /* Integer types capable of holding object pointers */ +#ifdef __x86_64__ +#define INTPTR_TYPE "long int" +#define UINTPTR_TYPE "long unsigned int" +#else #define INTPTR_TYPE "int" #define UINTPTR_TYPE "unsigned int" - +#endif Index: gcc/config/i386/cygwin.h =================================================================== --- gcc/config/i386/cygwin.h (revision 196791) +++ gcc/config/i386/cygwin.h (working copy) @@ -18,11 +18,20 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ -#define EXTRA_OS_CPP_BUILTINS() /* Nothing. */ +#define EXTRA_OS_CPP_BUILTINS() \ + do \ + { \ + builtin_define ("__CYGWIN__"); \ + if (!TARGET_64BIT) \ + builtin_define ("__CYGWIN32__"); \ + builtin_define ("__unix__"); \ + builtin_define ("__unix"); \ + } \ + while (0) #undef CPP_SPEC #define CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \ - -D__CYGWIN32__ -D__CYGWIN__ %{!ansi:-Dunix} -D__unix__ -D__unix \ + %{!ansi:-Dunix} \ %{mwin32:-DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ %{!ansi:-DWINNT}} \ %{!nostdinc:%{!mno-win32:-idirafter ../include/w32api%s -idirafter ../../include/w32api%s}}\ " @@ -73,6 +82,7 @@ /* To implement C++ function replacement we always wrap the cxx malloc-like operators. See N2800 #17.6.4.6 [replacement.functions] */ +#undef CXX_WRAP_SPEC_LIST #define CXX_WRAP_SPEC_LIST " \ --wrap _Znwj \ --wrap _Znaj \ @@ -132,6 +142,13 @@ #endif #define LIBGCC_SONAME "cyggcc_s" LIBGCC_EH_EXTN "-1.dll" -/* We should find a way to not have to update this manually. */ -#define LIBGCJ_SONAME "cyggcj" /*LIBGCC_EH_EXTN*/ "-13.dll" - +#ifndef BUILDING_GCC_MAJOR +#include "bversion.h" +#endif +#define ___cyg_mkstr(x) #x +#define __cyg_mkstr(x) ___cyg_mkstr(x) +#if BUILDING_GCC_MAJOR == 4 +#define LIBGCJ_SONAME "cyggcj-" __cyg_mkstr (BUILDING_GCC_MINOR+6) ".dll" +#else +#error LIBGCJ_SONAME versioning scheme needs attention +#endif Index: gcc/config/i386/cygwin-w64.h =================================================================== --- gcc/config/i386/cygwin-w64.h (revision 0) +++ gcc/config/i386/cygwin-w64.h (working copy) @@ -0,0 +1,83 @@ +/* Operating system specific defines to be used when targeting GCC for + hosting on Windows 32/64 via Cygwin runtime, using GNU tools and + the Windows API Library. + Copyright (C) 2013 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/>. */ + +/* Enable multilib. */ + +#undef ASM_SPEC +#define ASM_SPEC "%{m32:--32} %{m64:--64}" + +/* To implement C++ function replacement we always wrap the cxx + malloc-like operators. See N2800 #17.6.4.6 [replacement.functions] */ +#undef CXX_WRAP_SPEC_LIST +#define CXX_WRAP_SPEC_LIST " \ + --wrap _Znwm \ + --wrap _Znam \ + --wrap _ZdlPv \ + --wrap _ZdaPv \ + --wrap _ZnwmRKSt9nothrow_t \ + --wrap _ZnamRKSt9nothrow_t \ + --wrap _ZdlPvRKSt9nothrow_t \ + --wrap _ZdaPvRKSt9nothrow_t \ +" + +#undef SPEC_32 +#undef SPEC_64 +#define SPEC_32 "m32" +#define SPEC_64 "!m32" + +#undef SUB_LINK_ENTRY32 +#undef SUB_LINK_ENTRY64 +#define SUB_LINK_ENTRY32 "-e __cygwin_dll_entry@12" +#define SUB_LINK_ENTRY64 "-e _cygwin_dll_entry" + +#undef SUB_LINK_SPEC +#undef SUB_LINK_ENTRY +#define SUB_LINK_SPEC "%{" SPEC_64 ":-m i386pep} %{" SPEC_32 ":-m i386pe}" +#define SUB_LINK_ENTRY "%{" SPEC_64 ":" SUB_LINK_ENTRY64 "} %{" SPEC_32 ":" SUB_LINK_ENTRY32 "}" + +#undef MULTILIB_DEFAULTS +#define MULTILIB_DEFAULTS { "m64" } + +#undef LINK_SPEC +#define LINK_SPEC SUB_LINK_SPEC "\ + %{mwindows:--subsystem windows} \ + %{mconsole:--subsystem console} \ + " CXX_WRAP_SPEC " \ + %{shared: %{mdll: %eshared and mdll are not compatible}} \ + %{shared: --shared} %{mdll:--dll} \ + %{static:-Bstatic} %{!static:-Bdynamic} \ + %{shared|mdll: " SUB_LINK_ENTRY " --enable-auto-image-base} \ + %(shared_libgcc_undefs) \ + --dll-search-prefix=cyg -tsaware" + +/* Cygwin64 will have a 64-bit long type. */ +#undef LONG_TYPE_SIZE +#undef LONG_TYPE_SIZE +#define LONG_TYPE_SIZE (TARGET_64BIT ? 64 : 32) + +/* Override default "long long unsigned int" from cygming.h. */ +#undef SIZE_TYPE +#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") + +#undef LIBGCC_SONAME +#define LIBGCC_SONAME "cyggcc_s-seh-1.dll" Index: gcc/config/i386/t-cygwin-w64 =================================================================== --- gcc/config/i386/t-cygwin-w64 (revision 0) +++ gcc/config/i386/t-cygwin-w64 (working copy) @@ -0,0 +1,3 @@ +MULTILIB_OPTIONS = m64/m32 +MULTILIB_DIRNAMES = 64 +MULTILIB_OSDIRNAMES = ../lib ../lib32