This patch restores interix v3 and above to working condition, combines the multitude of config/*interix*.h files into one file, removes unused bits, and fixes PR 47096.

Comments welcome.

--Douglas B Rupp


2011-06-09  Douglas B Rupp  <r...@gnat.com>

        * <toplevel>/config/mh-interix: Remove.
        * <toplevel>/configure.ac (host_makefile_frag): Remove above.
        * <toplevel>/configure: Regenerate

        * config/i386/i386-interix3.h: Incorporate this file ...
        * config/interix3.h: Likewise
        * config/interix.h: Likewise
        * config/i386/i386-interix.h: ... into here and remove pre-Interix3
        bits.

        * config/interix.opt: Incorporate this file ...
        * config/i386/interix.opt: ... into here.

        * config/i386/t-interix (winnt-cxx.o,winnt-stubs.o,msformat-c.o): Add
        rules to build.

        * config.gcc: Rename interix3* to interix[3-9]*. Fix macros to reflect
        config file changes. Remove interix3 from obsolete configurations.
        * configure.ac (HAVE_GAS_ALIGNED_COMM): Allow on Interix.
        * configure: Regenerate.

        * testsuite/gcc.dg/builtins-config.h: (__INTERIX): Not C99.

        * libgcc/config.host: Rename interix3* to interix[3-9]*.

        * doc/install.texi: Note that gcc supports Interix version 3 and above.

diff -rupN gcc.orig/config/mh-interix gcc/config/mh-interix
--- gcc.orig/config/mh-interix  2011-04-06 16:54:04.000000000 -0700
+++ gcc/config/mh-interix       1969-12-31 16:00:00.000000000 -0800
@@ -1,7 +0,0 @@
-# The shell may not be in /bin. 
-SHELL = sh
-
-# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be
-# built without debugging information
-
-LIBGCC2_DEBUG_CFLAGS=
diff -rupN gcc.orig/configure.ac gcc/configure.ac
--- gcc.orig/configure.ac       2011-06-01 13:35:36.000000000 -0700
+++ gcc/configure.ac    2011-06-01 15:46:59.000000000 -0700
@@ -1083,9 +1085,6 @@ case "${host}" in
   *-mingw*)
     host_makefile_frag="config/mh-mingw"
     ;;
-  *-interix*)
-    host_makefile_frag="config/mh-interix"
-    ;;
   hppa*-hp-hpux10*)
     host_makefile_frag="config/mh-pa-hpux10"
     ;;
diff -rupN gcc.orig/gcc/config/i386/i386-interix3.h 
gcc/gcc/config/i386/i386-interix3.h
--- gcc.orig/gcc/config/i386/i386-interix3.h    2011-04-06 16:49:50.000000000 
-0700
+++ gcc/gcc/config/i386/i386-interix3.h 1969-12-31 16:00:00.000000000 -0800
@@ -1,23 +0,0 @@
-/* Target definitions for GCC for Intel 80386 running Interix V3.
-   Copyright (C) 2001, 2007 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (r...@gnat.com)
-
-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/>.  */
-
-#undef CPP_SPEC
-#define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
-
diff -rupN gcc.orig/gcc/config/interix3.h gcc/gcc/config/interix3.h
--- gcc.orig/gcc/config/interix3.h      2011-04-06 16:50:26.000000000 -0700
+++ gcc/gcc/config/interix3.h   1969-12-31 16:00:00.000000000 -0800
@@ -1,34 +0,0 @@
-/* Operating system specific defines to be used when targeting GCC for
-   Interix version 3.
-   Copyright (C) 2001, 2007 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (r...@gnat.com)
-
-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/>.  */
-
-/* Interix 3.x has a single rooted file system and properly named
-   libraries, so LIB_SPEC can be simplified */
-
-#undef LIB_SPEC
-#define LIB_SPEC "\
- %{!shared:%{!dynamic:-lc -lpsxdll \
- }} \
- %{!G:%{!dynamic:-lc -lpsxdll \
- }} \
- %{dynamic:-lc -lpsxdll \
- } \
- %{v}"
-
diff -rupN gcc.orig/gcc/config/interix.h gcc/gcc/config/interix.h
--- gcc.orig/gcc/config/interix.h       2011-04-06 16:50:26.000000000 -0700
+++ gcc/gcc/config/interix.h    1969-12-31 16:00:00.000000000 -0800
@@ -1,110 +0,0 @@
-/* Operating system specific defines to be used when targeting GCC for
-   Interix
-   Copyright (C) 1994, 1995, 1999, 2002, 2004, 2007, 2010
-   Free Software Foundation, Inc.
-   Donn Terry, Softway Systems, Inc. (d...@softway.com)
-   Modified from code
-      Contributed by Douglas B. Rupp (dr...@cs.washington.edu).
-
-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/>.  */
-
-/* POSIX/Uni-thread only for now.  Look at the winnt version
-for windows/multi thread */
-
-/* We need multiple -lc -lcpsx because they mutually refer;
-   that should go away someday */
-
-#undef LIB_SPEC
-#define LIB_SPEC "\
- %{!shared:%{!dynamic:-lc -lcpsx -lc -lcpsx %$INTERIX_ROOT/usr/lib/psxdll.a \
- %$INTERIX_ROOT/usr/lib/psxdll2.a \
- }} \
- %{!G:%{!dynamic:-lc -lcpsx -lc -lcpsx %$INTERIX_ROOT/usr/lib/psxdll.a \
- %$INTERIX_ROOT/usr/lib/psxdll2.a \
- }} \
- %{dynamic:-lc %$INTERIX_ROOT/usr/lib/psxdll.a \
- %$INTERIX_ROOT/usr/lib/psxdll2.a \
- } \
- %{v}"
-
-#undef LINK_SPEC
-#define LINK_SPEC "%{!shared:-stack 0x400000,0x10000} \
-                  -subsystem posix \
-                  %{g} \
-                  %{dynamic:-Bdynamic} \
-                  %{static:-Bstatic} \
-                  %{shared:--shared -Bdynamic} \
-                  %{G:--shared -Bdynamic} \
-                  %{symbolic:--shared -Bsymbolic -Bdynamic} \
-                  %{rpath*:--rpath %*} \
-                  "
-
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC  \
-  "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}} 
%{shared:crti%O%s}"
-
-
-#define STDC_0_IN_SYSTEM_HEADERS 1
-
-/* Names to predefine in the preprocessor for this target machine.  */
-
-#define DBX_DEBUGGING_INFO 1
-#define SDB_DEBUGGING_INFO 1
-#undef PREFERRED_DEBUGGING_TYPE
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-
-
-/* TARGET_DEFAULT from configure */
-
-#undef WCHAR_TYPE
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE "short unsigned int"
-#define WCHAR_TYPE_SIZE 16
-
-/* Our strategy for finding global constructors is a bit different, although
-   not a lot.  */
-#define DO_GLOBAL_CTORS_BODY                                           \
-do {                                                                   \
-  int i;                                                               \
-  unsigned long nptrs;                                                 \
-  func_ptr *p;                                                         \
-  asm(                                                                 \
-       "     .section .ctor_head, \"rw\"\n"                            \
-       "1:\n"                                                          \
-       "     .text \n"                                                 \
-       ASM_LOAD_ADDR(1b,%0)                                            \
-       : "=r" (p) : : "cc");                                           \
-  for (nptrs = 0; p[nptrs] != 0; nptrs++);                             \
-  for (i = nptrs-1; i >= 0; i--)                                       \
-    p[i] ();                                                           \
-} while (0) 
-
-#define DO_GLOBAL_DTORS_BODY                                           \
-do {                                                                   \
-  func_ptr *p;                                                         \
-  asm(                                                                 \
-       "     .section .dtor_head, \"rw\"\n"                            \
-       "1:\n"                                                          \
-       "     .text \n"                                                 \
-       ASM_LOAD_ADDR(1b,%0)                                            \
-       : "=r" (p) : : "cc");                                           \
-  while (*p)                                                           \
-    {                                                                  \
-      p++;                                                             \
-      (*(p-1)) ();                                                     \
-    }                                                                  \
-} while (0) 
diff -rupN gcc.orig/gcc/config/i386/i386-interix.h 
gcc/gcc/config/i386/i386-interix.h
--- gcc.orig/gcc/config/i386/i386-interix.h     2011-04-06 16:49:50.000000000 
-0700
+++ gcc/gcc/config/i386/i386-interix.h  2011-06-02 20:17:29.000000000 -0700
@@ -24,31 +24,77 @@ You should have received a copy of the G
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
-/* The rest must follow.  */
+/* Note: Interix doesn't support user-written DLLs (use conventional
+   shared libs (.so) instead).  Thus a lot of the stuff that might apply
+   about dllimport/dllexport and the like does not apply here. */
+
+#include <stdio.h>
+
+#undef LIB_SPEC
+#define LIB_SPEC "\
+ %{!shared:%{!dynamic:-lc -lpsxdll \
+ }} \
+ %{!G:%{!dynamic:-lc -lpsxdll \
+ }} \
+ %{dynamic:-lc -lpsxdll \
+ } \
+ %{v}"
+
+#undef LINK_SPEC
+#define LINK_SPEC "%{!shared:-stack 0x4000000,0x10000} \
+                  %{g} \
+                  %{dynamic:-Bdynamic} \
+                  %{static:-Bstatic} \
+                  %{shared:--shared -Bdynamic} \
+                  %{G:--shared -Bdynamic} \
+                  %{symbolic:--shared -Bsymbolic -Bdynamic} \
+                  %{rpath*:--rpath %*} \
+                  "
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC  \
+  "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}} 
%{shared:crti%O%s}"
+
+/* Names to predefine in the preprocessor for this target machine.  */
 
 #define DBX_DEBUGGING_INFO 1
 #define SDB_DEBUGGING_INFO 1
+#undef PREFERRED_DEBUGGING_TYPE
 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
 
-/* By default, target has a 80387, uses IEEE compatible arithmetic,
-   and returns float values in the 387 and needs stack probes
-   We also align doubles to 64-bits for MSVC default compatibility
-   We do bitfields MSVC-compatibly by default, too.  */
-#undef TARGET_SUBTARGET_DEFAULT
-#define TARGET_SUBTARGET_DEFAULT \
-   (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE | \
-    MASK_ALIGN_DOUBLE | MASK_MS_BITFIELD_LAYOUT)
-
-#undef TARGET_CPU_DEFAULT
-#define TARGET_CPU_DEFAULT TARGET_CPU_DEFAULT_i486
-
-#define WCHAR_TYPE_SIZE 16
-#define WCHAR_TYPE "short unsigned int"
-
-/* WinNT (and thus Interix) use unsigned int */
-#define SIZE_TYPE "unsigned int"
+/* Our strategy for finding global constructors is a bit different, although
+   not a lot.  */
+#define DO_GLOBAL_CTORS_BODY                                           \
+do {                                                                   \
+  int i;                                                               \
+  unsigned long nptrs;                                                 \
+  func_ptr *p;                                                         \
+  asm(                                                                 \
+       "     .section .ctor_head, \"rw\"\n"                            \
+       "1:\n"                                                          \
+       "     .text \n"                                                 \
+       ASM_LOAD_ADDR(1b,%0)                                            \
+       : "=r" (p) : : "cc");                                           \
+  for (nptrs = 0; p[nptrs] != 0; nptrs++);                             \
+  for (i = nptrs-1; i >= 0; i--)                                       \
+    p[i] ();                                                           \
+} while (0) 
 
-#define ASM_LOAD_ADDR(loc, reg)   "     leal " #loc "," #reg "\n"
+#define DO_GLOBAL_DTORS_BODY                                           \
+do {                                                                   \
+  func_ptr *p;                                                         \
+  asm(                                                                 \
+       "     .section .dtor_head, \"rw\"\n"                            \
+       "1:\n"                                                          \
+       "     .text \n"                                                 \
+       ASM_LOAD_ADDR(1b,%0)                                            \
+       : "=r" (p) : : "cc");                                           \
+  while (*p)                                                           \
+    {                                                                  \
+      p++;                                                             \
+      (*(p-1)) ();                                                     \
+    }                                                                  \
+} while (0) 
 
 #define TARGET_DECLSPEC 1
 
@@ -62,6 +108,7 @@ along with GCC; see the file COPYING3.  
        builtin_define ("_X86_=1");                                     \
        builtin_define ("__stdcall=__attribute__((__stdcall__))");      \
        builtin_define ("__cdecl=__attribute__((__cdecl__))");          \
+       builtin_define ("__declspec(x)=__attribute__((x))");            \
        builtin_assert ("system=unix");                                 \
        builtin_assert ("system=interix");                              \
        if (preprocessing_asm_p ())                                     \
@@ -78,153 +125,21 @@ along with GCC; see the file COPYING3.  
   while (0)
 
 #undef CPP_SPEC
-/* Write out the correct language type definition for the header files.  
-   Unless we have assembler language, write out the symbols for C.
-   mieee is an Alpha specific variant.  Cross pollination a bad idea.
-   */
-#define CPP_SPEC "-remap %{posix:-D_POSIX_SOURCE} \
--isystem %$INTERIX_ROOT/usr/include"
-
-/* The global __fltused is necessary to cause the printf/scanf routines
-   for outputting/inputting floating point numbers to be loaded.  Since this
-   is kind of hard to detect, we just do it all the time.  */
-#undef X86_FILE_START_FLTUSED
-#define X86_FILE_START_FLTUSED 1
-
-/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
-   ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
-   corresponds to a particular byte value [0..255].  For any
-   given byte value, if the value in the corresponding table
-   position is zero, the given character can be output directly.
-   If the table value is 1, the byte must be output as a \ooo
-   octal escape.  If the tables value is anything else, then the
-   byte value should be output as a \ followed by the value
-   in the table.  Note that we can use standard UN*X escape
-   sequences for many control characters, but we don't use
-   \a to represent BEL because some svr4 assemblers (e.g. on
-   the i386) don't know about that.  Also, we don't use \v
-   since some versions of gas, such as 2.2 did not accept it.  */
-
-#define ESCAPES \
-"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
-
-/* Some svr4 assemblers have a limit on the number of characters which
-   can appear in the operand of a .string directive.  If your assembler
-   has such a limitation, you should define STRING_LIMIT to reflect that
-   limit.  Note that at least some svr4 assemblers have a limit on the
-   actual number of bytes in the double-quoted string, and that they
-   count each character in an escape sequence as one byte.  Thus, an
-   escape sequence like \377 would count as four bytes.
-
-   If your target assembler doesn't support the .string directive, you
-   should define this to zero.
-*/
-
-#define STRING_LIMIT   ((unsigned) 256)
-
-#define STRING_ASM_OP  "\t.string\t"
-
-/* The routine used to output NUL terminated strings.  We use a special
-   version of this for most svr4 targets because doing so makes the
-   generated assembly code more compact (and thus faster to assemble)
-   as well as more readable, especially for targets like the i386
-   (where the only alternative is to output character sequences as
-   comma separated lists of numbers).  */
-
-#define ASM_OUTPUT_LIMITED_STRING(FILE, STR)                           \
-  do                                                                   \
-    {                                                                  \
-      const unsigned char *_limited_str =                              \
-        (const unsigned char *) (STR);                                 \
-      unsigned ch;                                                     \
-      fprintf ((FILE), "%s\"", STRING_ASM_OP);                         \
-      for (; (ch = *_limited_str); _limited_str++)                     \
-        {                                                              \
-         int escape = ESCAPES[ch];                                     \
-         switch (escape)                                               \
-           {                                                           \
-           case 0:                                                     \
-             putc (ch, (FILE));                                        \
-             break;                                                    \
-           case 1:                                                     \
-             fprintf ((FILE), "\\%03o", ch);                           \
-             break;                                                    \
-           default:                                                    \
-             putc ('\\', (FILE));                                      \
-             putc (escape, (FILE));                                    \
-             break;                                                    \
-           }                                                           \
-        }                                                              \
-      fprintf ((FILE), "\"\n");                                                
\
-    }                                                                  \
-  while (0)
-
-/* The routine used to output sequences of byte values.  We use a special
-   version of this for most svr4 targets because doing so makes the
-   generated assembly code more compact (and thus faster to assemble)
-   as well as more readable.  Note that if we find subparts of the
-   character sequence which end with NUL (and which are shorter than
-   STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING.  */
+#define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
 
-#undef ASM_OUTPUT_ASCII
-#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)                            \
-  do                                                                   \
-    {                                                                  \
-      const unsigned char *_ascii_bytes =                              \
-        (const unsigned char *) (STR);                                 \
-      const unsigned char *limit = _ascii_bytes + (LENGTH);            \
-      unsigned bytes_in_chunk = 0;                                     \
-      for (; _ascii_bytes < limit; _ascii_bytes++)                     \
-        {                                                              \
-         const unsigned char *p;                                       \
-         if (bytes_in_chunk >= 64)                                     \
-           {                                                           \
-             fputc ('\n', (FILE));                                     \
-             bytes_in_chunk = 0;                                       \
-           }                                                           \
-         for (p = _ascii_bytes; p < limit && *p != '\0'; p++)          \
-           continue;                                                   \
-         if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT)   \
-           {                                                           \
-             if (bytes_in_chunk > 0)                                   \
-               {                                                       \
-                 fputc ('\n', (FILE));                                 \
-                 bytes_in_chunk = 0;                                   \
-               }                                                       \
-             ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes);         \
-             _ascii_bytes = p;                                         \
-           }                                                           \
-         else                                                          \
-           {                                                           \
-             if (bytes_in_chunk == 0)                                  \
-               fputs (ASM_BYTE, (FILE));                               \
-             else                                                      \
-               fputc (',', (FILE));                                    \
-             fprintf ((FILE), "0x%02x", *_ascii_bytes);                \
-             bytes_in_chunk += 5;                                      \
-           }                                                           \
-       }                                                               \
-      if (bytes_in_chunk > 0)                                          \
-        fputc ('\n', (FILE));                                          \
-    }                                                                  \
-  while (0)
-
-/* Emit code to check the stack when allocating more that 4000
-   bytes in one go.  */
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "short unsigned int"
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 16
 
-#define CHECK_STACK_LIMIT 0x1000
+#define SIZE_TYPE "unsigned int"
+#define PTRDIFF_TYPE "int"
 
-/* the following are OSF linker (not gld) specific... we don't want them */
-#undef HAS_INIT_SECTION
-#undef LD_INIT_SWITCH
-#undef LD_FINI_SWITCH
+/* Turn off long double being 96 bits.  */
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 64
+#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
 
 /* The following are needed for us to be able to use winnt.c, but are not
    otherwise meaningful to Interix.  (The functions that use these are
@@ -232,42 +147,127 @@ along with GCC; see the file COPYING3.  
 #define TARGET_NOP_FUN_DLLIMPORT 1
 #define drectve_section()  /* nothing */
 
-/* Objective-C has its own packing rules...
-   Objc tries to parallel the code in stor-layout.c at runtime 
-   (see libobjc/encoding.c).  This (compile-time) packing info isn't 
-   available at runtime, so it's hopeless to try.
-
-   And if the user tries to set the flag for objc, give an error
-   so he has some clue.  */
-
-#undef  SUBTARGET_OVERRIDE_OPTIONS
-#define SUBTARGET_OVERRIDE_OPTIONS                                     \
-do {                                                                   \
-  if (strcmp (lang_hooks.name, "GNU Objective-C") == 0)                        
\
-    {                                                                  \
-      if ((target_flags & MASK_MS_BITFIELD_LAYOUT) != 0                        
\
-         && (target_flags_explicit & MASK_MS_BITFIELD_LAYOUT) != 0)    \
-       {                                                               \
-          error ("ms-bitfields not supported for objc");               \
-       }                                                               \
-      target_flags &= ~MASK_MS_BITFIELD_LAYOUT;                                
\
-    }                                                                  \
-} while (0)
 
 #define EH_FRAME_IN_DATA_SECTION
 
 #define READONLY_DATA_SECTION_ASM_OP   "\t.section\t.rdata,\"r\""
 
+/* Define this macro if references to a symbol must be treated
+   differently depending on something about the variale or
+   function named by the symbol (such as what section it is in).  */
+
+#undef TARGET_ENCODE_SECTION_INFO
+#define TARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info
+#undef  TARGET_STRIP_NAME_ENCODING
+#define TARGET_STRIP_NAME_ENCODING  i386_pe_strip_name_encoding_full
+
+/* Emit code to check the stack when allocating more that 4000
+   bytes in one go.  */
+
+#define CHECK_STACK_LIMIT 4000
+
+/* By default, target has a 80387, uses IEEE compatible arithmetic,
+   and returns float values in the 387 and needs stack probes
+   We also align doubles to 64-bits forMSVC default compatibility
+   Ditto for bitfields. */
+#undef TARGET_SUBTARGET_DEFAULT
+#define TARGET_SUBTARGET_DEFAULT \
+   (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE | \
+    MASK_ALIGN_DOUBLE | MASK_MS_BITFIELD_LAYOUT)
+
 /* The MS compilers take alignment as a number of bytes, so we do as well */
 #undef ASM_OUTPUT_ALIGN
 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
   if ((LOG)!=0) fprintf ((FILE), "\t.balign %d\n", 1<<(LOG))
 
+/* Define this macro if in some cases global symbols from one translation
+   unit may not be bound to undefined symbols in another translation unit
+   without user intervention.  For instance, under Microsoft Windows
+   symbols must be explicitly imported from shared libraries (DLLs).  */
+/*
+ * Old gcc(3.3) did not have 1 here
+ */
+#define MULTIPLE_SYMBOL_SPACES 1
+
+extern void i386_pe_unique_section PARAMS ((tree, int));
+#define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section
+
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
+
+/* Select attributes for named sections.  */
+#define TARGET_SECTION_TYPE_FLAGS  i386_pe_section_type_flags
+
+/* Write the extra assembler code needed to declare a function
+   properly.  If we are generating SDB debugging information, this
+   will happen automatically, so we only need to handle other cases.  */
+#undef ASM_DECLARE_FUNCTION_NAME
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                    \
+  do                                                                   \
+    {                                                                  \
+      if (write_symbols != SDB_DEBUG)                                  \
+       i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \
+      ASM_OUTPUT_LABEL (FILE, NAME);                                   \
+    }                                                                  \
+  while (0)
+
+/* Add an external function to the list of functions to be declared at
+   the end of the file.  */
+#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)                          \
+  do                                                                   \
+    {                                                                  \
+      if (TREE_CODE (DECL) == FUNCTION_DECL)                           \
+        i386_pe_record_external_function (DECL, NAME);                 \
+    }                                                                  \
+  while (0)
+
+/* Declare the type properly for any external libcall.  */
+#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
+  i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1)
+
+/* This says out to put a global symbol in the BSS section.  */
+#undef ASM_OUTPUT_ALIGNED_BSS
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+  asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
+
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START " #"
+
+/* Don't assume anything about the header files.  */
+#define NO_IMPLICIT_EXTERN_C
+
+/* External function declarations.  */
+extern void i386_pe_record_external_function (tree, const char *);
+extern void i386_pe_declare_function_type (FILE *, const char *, int);
+extern void i386_pe_record_exported_symbol (const char *, int);
+extern void i386_pe_asm_file_end (FILE *);
+
+/* For Win32 ABI compatibility */
+#undef DEFAULT_PCC_STRUCT_RETURN
+#define DEFAULT_PCC_STRUCT_RETURN 0
+
+/* A bitfield declared as `int' forces `int' alignment for the struct.  */
+#undef PCC_BITFIELD_TYPE_MATTERS
+#define PCC_BITFIELD_TYPE_MATTERS 1
+
+/* Enable alias attribute support.  */
+#ifndef SET_ASM_OP
+#define SET_ASM_OP "\t.set\t"
+#endif
+
+/* Note that there appears to be two different ways to support const
+   sections at the moment.  You can either #define the symbol
+   READONLY_DATA_SECTION (giving it some code which switches to the
+   readonly data section) or else you can #define the symbols
+   EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
+   SELECT_RTX_SECTION.  We do both here just to be on the safe side.  */
+
+#define USE_CONST_SECTION 1
+
 /* The linker will take care of this, and having them causes problems with
    ld -r (specifically -rU).  */
 #define CTOR_LISTS_DEFINED_EXTERNALLY 1
 
-#define SET_ASM_OP     "\t.set\t"
 /* Output a definition (implements alias) */
 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                             \
 do                                                                     \
@@ -288,68 +288,33 @@ while (0)
 
 /* Forward references to tags are allowed.  */
 #define SDB_ALLOW_FORWARD_REFERENCES
-
 /* Unknown tags are also allowed.  */
 #define SDB_ALLOW_UNKNOWN_REFERENCES
-
-/* The integer half of this list needs to be constant.  However, there's
-   a lot of disagreement about what the floating point adjustments should
-   be.  We pick one that works with gdb.  (The underlying problem is
-   what to do about the segment registers.  Since we have access to them
-   from /proc, we'll allow them to be accessed in gdb, even tho the
-   gcc compiler can't generate them.  (There's some evidence that 
-   MSVC does, but possibly only for certain special "canned" sequences.) */
-
-#undef DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(n) \
-(TARGET_64BIT ? dbx64_register_map[n] \
- : (n) == 0 ? 0 \
- : (n) == 1 ? 2 \
- : (n) == 2 ? 1 \
- : (n) == 3 ? 3 \
- : (n) == 4 ? 6 \
- : (n) == 5 ? 7 \
- : (n) == 6 ? 5 \
- : (n) == 7 ? 4 \
- : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+8 \
- : (-1))
-
-/* Define this macro if references to a symbol must be treated
-   differently depending on something about the variable or
-   function named by the symbol (such as what section it is in).  */
-
-#define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info
-#undef  TARGET_STRIP_NAME_ENCODING
-#define TARGET_STRIP_NAME_ENCODING  i386_pe_strip_name_encoding_full
-
-#if 0  
-/* Turn this back on when the linker is updated to handle grouped
-   .data$ sections correctly. See corresponding note in i386/interix.c. 
-   MK.  */
-
-/* Interix uses explicit import from shared libraries.  */
-#define MULTIPLE_SYMBOL_SPACES 1
-
-extern void i386_pe_unique_section (tree, int);
-#define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section
-#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
-
-#define SUPPORTS_ONE_ONLY 1
-#endif /* 0 */
-
-/* Switch into a generic section.  */
-#define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
-
 /* DWARF2 Unwinding doesn't work with exception handling yet.  */
 #define DWARF2_UNWIND_INFO 0
+/* MSVC returns structs of up to 8 bytes via registers. */
 
-/* Don't assume anything about the header files.  */
-#define NO_IMPLICIT_EXTERN_C
+#undef SUBTARGET_RETURN_IN_MEMORY
+#define SUBTARGET_RETURN_IN_MEMORY(TYPE, FNTYPE) \
+  (TYPE_MODE (TYPE) == BLKmode || \
+     (AGGREGATE_TYPE_P (TYPE) && int_size_in_bytes(TYPE) > 8 ))
 
-/* MSVC returns structs of up to 8 bytes via registers.  */
+#define ASM_LOAD_ADDR(loc, reg)   "     leal " #loc "," #reg "\n"
 
-#define DEFAULT_PCC_STRUCT_RETURN 0
+#define EH_FRAME_IN_DATA_SECTION
 
-#define SUBTARGET_RETURN_IN_MEMORY(TYPE, FNTYPE) \
-       (TYPE_MODE (TYPE) == BLKmode \
-        || (AGGREGATE_TYPE_P (TYPE) && int_size_in_bytes (TYPE) > 8 ))
+/* the following are OSF linker (not gld) specific... we don't want them */
+#undef HAS_INIT_SECTION
+#undef LD_INIT_SWITCH
+#undef LD_FINI_SWITCH
+
+/* The following are needed for us to be able to use winnt.c, but are not
+   otherwise meaningful to Interix.  (The functions that use these are
+   never called because we don't do DLLs.) */
+#define TARGET_NOP_FUN_DLLIMPORT 1
+#define I386_PE_STRIP_ENCODING(SYM_NAME) \
+  ((SYM_NAME) + ((SYM_NAME)[0] == '@' \
+                 ? ((SYM_NAME)[3] == '*' ? 4 : 3) : 0) \
+             + ((SYM_NAME)[0] == '*' ? 1 : 0))
+
+#define drectve_section()  /* nothing */
diff -rupN gcc.orig/gcc/config/interix.opt gcc/gcc/config/interix.opt
--- gcc.orig/gcc/config/interix.opt     2011-04-06 16:50:26.000000000 -0700
+++ gcc/gcc/config/interix.opt  1969-12-31 16:00:00.000000000 -0800
@@ -1,36 +0,0 @@
-; Interix options.
-
-; Copyright (C) 2010, 2011
-; 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/>.
-
-; See the GCC internals manual (options.texi) for a description of
-; this file's format.
-
-; Please try to keep this file in ASCII collating order.
-
-dynamic
-Driver
-
-G
-Driver
-
-posix
-Driver
-
-; This comment is to ensure we retain the blank line above.
diff -rupN gcc.orig/gcc/config/i386/interix.opt gcc/gcc/config/i386/interix.opt
--- gcc.orig/gcc/config/i386/interix.opt        1969-12-31 16:00:00.000000000 
-0800
+++ gcc/gcc/config/i386/interix.opt     2011-06-01 23:07:58.000000000 -0700
@@ -0,0 +1,34 @@
+; Interix-specific options.
+
+; Copyright (C) 2005, 2007, 2009-2011 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/>.
+
+mpe-aligned-commons
+Target Var(use_pe_aligned_common) Init(HAVE_GAS_ALIGNED_COMM)
+Use the GNU extension to the PE format for aligned common data
+
+dynamic
+Driver
+
+G
+Driver
+
+posix
+Driver
+
+; This comment is to ensure we retain the blank line above.
diff -rupN gcc.orig/gcc/config/i386/t-interix gcc/gcc/config/i386/t-interix
--- gcc.orig/gcc/config/i386/t-interix  2011-04-06 16:49:50.000000000 -0700
+++ gcc/gcc/config/i386/t-interix       2011-06-01 15:41:57.000000000 -0700
@@ -6,3 +6,22 @@ winnt.o: $(srcdir)/config/i386/winnt.c $
   $(TM_P_H) $(HASHTAB_H) $(GGC_H)
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
                $(srcdir)/config/i386/winnt.c
+
+winnt-cxx.o: $(srcdir)/config/i386/winnt-cxx.c $(CONFIG_H) $(SYSTEM_H) 
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+       $(COMPILER) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+       $(srcdir)/config/i386/winnt-cxx.c
+
+winnt-stubs.o: $(srcdir)/config/i386/winnt-stubs.c $(CONFIG_H) $(SYSTEM_H) 
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+       $(COMPILER) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+       $(srcdir)/config/i386/winnt-stubs.c
+
+msformat-c.o: $(srcdir)/config/i386/msformat-c.c $(CONFIG_H) $(SYSTEM_H) 
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) $(HASHTAB_H) $(GGC_H)
+       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+       $(srcdir)/config/i386/msformat-c.c
+
diff -rupN gcc.orig/gcc/config.gcc gcc/gcc/config.gcc
--- gcc.orig/gcc/config.gcc     2011-06-01 13:35:12.000000000 -0700
+++ gcc/gcc/config.gcc  2011-06-01 23:19:00.000000000 -0700
@@ -237,8 +237,7 @@
 
 # Obsolete configurations.
 case ${target} in
-   i[34567]86-*-interix3*              \
- | mips*-*-openbsd*                    \
+   mips*-*-openbsd*                    \
  | score-*                             \
  | *-*-solaris2.8*                     \
  )
@@ -1539,11 +1539,12 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
                        ;;
        esac
        ;;
-i[34567]86-*-interix3*)
-       tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h 
i386/i386-interix.h i386/i386-interix3.h interix.h interix3.h"
+i[34567]86-*-interix[3-9]*)
+       tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h 
i386/i386-interix.h"
        tmake_file="${tmake_file} i386/t-interix"
-       extra_options="${extra_options} rpath.opt interix.opt"
-       extra_objs=winnt.o
+       extra_options="${extra_options} rpath.opt i386/interix.opt"
+       extra_objs="winnt.o winnt-stubs.o"
+       cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
        target_gtfiles="\$(srcdir)/config/i386/winnt.c"
        if test x$enable_threads = xyes ; then
                thread_file='posix'
diff -rupN gcc.orig/gcc/configure.ac gcc/gcc/configure.ac
--- gcc.orig/gcc/configure.ac   2011-06-01 13:35:12.000000000 -0700
+++ gcc/gcc/configure.ac        2011-06-01 15:41:57.000000000 -0700
@@ -3460,7 +3460,7 @@ changequote([,])dnl
           Cygwin DLL exports wrappers to support libstdc++ function 
replacement.])
     esac
     case $target_os in
-      cygwin* | pe | mingw32*)
+      cygwin* | pe | mingw32* | interix[[3-9]]*)
        # Recent binutils allows the three-operand form of ".comm" on PE.  This
        # definition is used unconditionally to initialise the default state of
        # the target option variable that governs usage of the feature.
diff -rupN gcc.orig/gcc/testsuite/gcc.dg/builtins-config.h 
gcc/gcc/testsuite/gcc.dg/builtins-config.h
--- gcc.orig/gcc/testsuite/gcc.dg/builtins-config.h     2011-04-06 
16:43:19.000000000 -0700
+++ gcc/gcc/testsuite/gcc.dg/builtins-config.h  2011-06-01 18:13:09.000000000 
-0700
@@ -11,6 +11,8 @@
 
 #if defined(__hppa) && defined(__hpux)
 /* PA HP-UX doesn't have the entire C99 runtime.  */
+#elif defined(__INTERIX)
+/* Interix doesn't have the entire C99 runtime.  */
 #elif defined(__AVR__)
 /* AVR doesn't have the entire C99 runtime.  */
 #elif defined(__FreeBSD__) && (__FreeBSD__ < 9)
diff -rupN gcc.orig/libgcc/config.host gcc/libgcc/config.host
--- gcc.orig/libgcc/config.host 2011-06-01 13:34:29.000000000 -0700
+++ gcc/libgcc/config.host      2011-06-01 15:41:57.000000000 -0700
@@ -349,7 +349,7 @@ i[34567]86-*-cygwin* | i[34567]86-*-ming
        ;;
 x86_64-*-mingw*)
        ;;
-i[34567]86-*-interix3*)
+i[34567]86-*-interix[3-9]*)
        ;;
 ia64*-*-elf*)
        extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
--- gcc.orig/gcc/doc/install.texi       2011-06-08 14:05:22.000000000 -0700
+++ gcc/gcc/doc/install.texi    2011-06-09 10:04:38.000000000 -0700
@@ -4499,7 +4499,7 @@
 The Interix target is used by OpenNT, Interix, Services For UNIX (SFU),
 and Subsystem for UNIX-based Applications (SUA).  Applications compiled
 with this target run in the Interix subsystem, which is separate from
-the Win32 subsystem.  This target was last known to work in GCC 3.3.
+the Win32 subsystem.  Gcc supports Interix version 3 and above.
 
 @html
 <hr />

Reply via email to