2011-06-09 Douglas B Rupp * /config/mh-interix: Remove. * /configure.ac (host_makefile_frag): Remove above. * /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 (rupp@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 -. */ - -#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 (rupp@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 -. */ - -/* 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. (donn@softway.com) - Modified from code - Contributed by Douglas B. Rupp (drupp@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 -. */ - -/* 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 . */ -/* 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 + +#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 -; . - -; 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 +; . + +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