⛏️ index : buildtools.git

author Ingo Weinhold <ingo_weinhold@gmx.de> 2008-03-21 23:52:23.0 +00:00:00
committer Ingo Weinhold <ingo_weinhold@gmx.de> 2008-03-21 23:52:23.0 +00:00:00
commit
58799d5d74543c394f56148f6cde873972c610b3 [patch]
tree
b9801981bbb3d34985d50c676f706109c77876e1
parent
eb680fdd74280e46a9dcd9124c1b83141ecde332
download
58799d5d74543c394f56148f6cde873972c610b3.tar.gz

* Created a Haiku configuration by copying the BeOS configuration and adjusting it where I figured it necessary. * Disabled the --no-beos-fixes option for Haiku.

git-svn-id: file:///srv/svn/repos/haiku/buildtools/trunk@24513 a95241bf-73f2-0310-859d-f6bbb57e9c96

Diff

 legacy/gcc/configure.in               |   6 ++++++
 legacy/gcc/gcc/configure.in           |  12 ++++++++++++
 legacy/gcc/gcc/gcc.c                  |   8 ++++++++
 legacy/gcc/gcc/version.c              |   2 +-
 legacy/gcc/libiberty/config.table     |   1 +
 legacy/gcc/libio/configure.in         |   1 +
 legacy/gcc/libstdc++/configure.in     |   1 +
 legacy/gcc/gcc/fixinc/mkfixinc.sh     |   3 ++-
 legacy/gcc/libio/config/haiku.mt      |  25 +++++++++++++++++++++++++
 legacy/gcc/libstdc++/config/haiku.ml  |   5 +++++
 legacy/gcc/gcc/config/i386/haiku.h    | 535 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 legacy/gcc/gcc/config/i386/t-haiku    |  15 +++++++++++++++
 legacy/gcc/gcc/config/i386/x-haiku    |   9 +++++++++
 legacy/gcc/gcc/config/i386/xm-haiku.h |  78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 14 files changed, 699 insertions(+), 2 deletions(-)

diff --git a/legacy/gcc/configure.in b/legacy/gcc/configure.in
index 40ac1c5..b113d42 100644
--- a/legacy/gcc/configure.in
+++ b/legacy/gcc/configure.in
@@ -535,6 +535,9 @@
  powerpc-*-beos*)
     noconfigdirs="$noconfigdirs tk itcl tix libgui gdb readline"
	 ;;
  i[3456789]86-*-haiku*)
     noconfigdirs="$noconfigdirs tk itcl tix libgui gdb"
     ;;
  *-*-cygwin32)
     noconfigdirs="autoconf automake send-pr gprof rcs guile perl apache inet"
    ;;
@@ -695,6 +698,9 @@
    noconfigdirs="$noconfigdirs emacs emacs19 target-libgloss"
    ;;
  i[3456]86-*-beos*)
     noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss"
     ;;
  i[3456789]86-*-haiku*)
     noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss"
     ;;
  mn10200-*-*)
diff --git a/legacy/gcc/gcc/configure.in b/legacy/gcc/gcc/configure.in
index 5c06f52..13e07fd 100644
--- a/legacy/gcc/gcc/configure.in
+++ b/legacy/gcc/gcc/configure.in
@@ -1163,6 +1163,18 @@
		float_format=i386
		;;
changequote(,)dnl
	i[3456789]86-*-haiku*)
changequote([,])dnl
		xm_file=i386/xm-haiku.h
		tmake_file='i386/t-haiku i386/t-crtpic'
		tm_file=i386/haiku.h
		xmake_file=i386/x-haiku
		extra_objs=winnt.o
		extra_parts='crtbegin.o crtend.o'
		fixincludes=Makefile.in
		float_format=i386
		;;
changequote(,)dnl
	i[34567]86-*-bsdi* | i[34567]86-*-bsd386*)
changequote([,])dnl
		tm_file=i386/bsd386.h
diff --git a/legacy/gcc/gcc/gcc.c b/legacy/gcc/gcc/gcc.c
index 63e05d9..9b540a3 100644
--- a/legacy/gcc/gcc/gcc.c
+++ b/legacy/gcc/gcc/gcc.c
@@ -858,7 +858,9 @@
   {"--library-directory", "-L", "a"},
   {"--machine", "-m", "aj"},
   {"--machine-", "-m", "*j"},
#ifndef __HAIKU__
   {"--no-beos-fixes", "-no-beos-fixes", 0},
#endif
   {"--no-line-commands", "-P", 0},
   {"--no-precompiled-includes", "-noprecomp", 0},
   {"--no-standard-includes", "-nostdinc", 0},
@@ -2519,7 +2521,9 @@
  printf ("                            'none' means revert to the default behaviour of\n");
  printf ("                            guessing the language based on the file's extension\n");
  printf ("  -priority=<prio>         Specify thread-priority to use (1-10, default is 5)\n");
#ifndef __HAIKU__
  printf ("  -no-beos-fixes           Disable any BeOS-R5 compatibility fixes\n");
#endif

  printf ("\nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n");
  printf ("the various sub-processes invoked by %s.  In order to pass other options\n",
@@ -2798,10 +2802,12 @@
	  add_linker_option (argv[i], strlen(argv[i]));
	  n_switches++;
	}
#ifndef __HAIKU__
      else if (!strcmp (argv[i], "-no-beos-fixes"))
	{
	  n_switches++;
	}
#endif	/* !__HAIKU__ */
#endif
      else if (! strcmp (argv[i], "-print-search-dirs"))
	print_search_dirs = 1;
@@ -3195,6 +3201,7 @@
	;
      else if (! strcmp (argv[i], "-print-multi-directory"))
	;
#ifndef __HAIKU__
      else if (! strcmp (argv[i], "-no-beos-fixes"))
	{
	  /* Preserve the switch so that it can be caught by the
@@ -3205,6 +3212,7 @@
	  switches[n_switches].validated = 0;
	  n_switches++;
	}
#endif /* !__HAIKU__ */
      else if (! strncmp (argv[i], "-priority=", 10))
	{
	  /* Preserve the switch so that it can be caught by the
diff --git a/legacy/gcc/gcc/version.c b/legacy/gcc/gcc/version.c
index 98ed90c..bd3bd7b 100644
--- a/legacy/gcc/gcc/version.c
+++ b/legacy/gcc/gcc/version.c
@@ -1,1 +1,1 @@
char *version_string = "2.95.3-beos-060710";
char *version_string = "2.95.3-haiku-080322";
diff --git a/legacy/gcc/libiberty/config.table b/legacy/gcc/libiberty/config.table
index 5913b23..bcd725b 100644
--- a/legacy/gcc/libiberty/config.table
+++ b/legacy/gcc/libiberty/config.table
@@ -6,6 +6,7 @@
  *-*-freebsd2.2.[012])	frag=mh-fbsd21 ;;
  i[345]86-*-windows*)	frag=mh-windows ;;
  *-*-beos*)		frag=mh-beos ;;
  *-*-haiku*)		frag=mh-haiku ;;
esac

frags=$frag
diff --git a/legacy/gcc/libio/configure.in b/legacy/gcc/libio/configure.in
index 7fd0977..6a59a45 100644
--- a/legacy/gcc/libio/configure.in
+++ b/legacy/gcc/libio/configure.in
@@ -61,6 +61,7 @@
  *-isc*)        frags=isc.mt ;;
  *-netware*)    frags=netware.mt ;;
  *-beos*)	 frags="beos.mt mtsafe.mt" ;;
  *-haiku*)	 frags="haiku.mt mtsafe.mt" ;;
  *)             frags=${target_cpu}.mt ;;
esac

diff --git a/legacy/gcc/libstdc++/configure.in b/legacy/gcc/libstdc++/configure.in
index 56daf92..bc9ce79 100644
--- a/legacy/gcc/libstdc++/configure.in
+++ b/legacy/gcc/libstdc++/configure.in
@@ -80,6 +80,7 @@
    *-*-sunos4*)	frags="${frags} sunos4.ml" ;;
    *-*-aix*)		frags="${frags} aix.ml" ;;
    *-*-beos*)		frags="${frags} beos.ml" ;;
    *-*-haiku*)		frags="${frags} haiku.ml" ;;
    i[3456]86-*-interix*)	frags="${frags} x86-interix.ml" ;;
    *-*-gnu*)		frags="${frags} gnu.ml" ;;
  esac
diff --git a/legacy/gcc/gcc/fixinc/mkfixinc.sh b/legacy/gcc/gcc/fixinc/mkfixinc.sh
index 1dc29c2..e763c8e 100755
--- a/legacy/gcc/gcc/fixinc/mkfixinc.sh
+++ b/legacy/gcc/gcc/fixinc/mkfixinc.sh
@@ -18,7 +18,8 @@
#
case $build in
	i?86-*-msdosdjgpp* | \
	*-*-beos* )
	*-*-beos* \
	*-*-haiku* )
		MAKE="${MAKE} TARGETS=twoprocess"
		CFLAGS="${CFLAGS} -DSEPARATE_FIX_PROC"
		;;
diff --git a/legacy/gcc/libio/config/haiku.mt b/legacy/gcc/libio/config/haiku.mt
new file mode 100644
index 0000000..9e3c519 100644
--- /dev/null
+++ b/legacy/gcc/libio/config/haiku.mt
@@ -1,0 +1,25 @@
# Use the libio which comes with the local libc.

# Comment this out to avoid including the stdio functions in libiostream.a:
# LIBIOSTREAM_OBJECTS = $(IO_OBJECTS) $(IOSTREAM_OBJECTS) $(STDIO_WRAP_OBJECTS) $(OSPRIM_OBJECTS)
# LIBIOSTREAM_DEP = $(LIBIOSTREAM_OBJECTS) stdio.list
# LIBIOSTREAM_USE = $(LIBIOSTREAM_OBJECTS) `cat stdio.list`

# Comment the above and uncomment the below to use the code in the Linux libc:
# We have _G_config.h in /usr/include.
_G_CONFIG_H=

# We must not see the libio.h file from this library.
LIBIO_INCLUDE=

# We have those in libc.a.
IO_OBJECTS= iogetline.o
STDIO_WRAP_OBJECTS=
OSPRIM_OBJECTS=
STDIO_OBJECTS=

# We have the rest in /usr/include.
USER_INCLUDES=PlotFile.h SFile.h builtinbuf.h editbuf.h fstream.h \
	indstream.h iomanip.h iostream.h istream.h ostream.h \
	parsestream.h pfstream.h procbuf.h stdiostream.h stream.h \
	streambuf.h strfile.h strstream.h
diff --git a/legacy/gcc/libstdc++/config/haiku.ml b/legacy/gcc/libstdc++/config/haiku.ml
new file mode 100644
index 0000000..33a54d4 100644
--- /dev/null
+++ b/legacy/gcc/libstdc++/config/haiku.ml
@@ -1,0 +1,5 @@
SHLIB	= libstdc++.r4.so
LIBS	= $(ARLIB) $(ARLINK) $(SHLIB)
DEPLIBS	= ../$(SHLIB)
SHFLAGS	= -Wl,-soname,$(SHLIB)
SHOPT	= -nostart
diff --git a/legacy/gcc/gcc/config/i386/haiku.h b/legacy/gcc/gcc/config/i386/haiku.h
new file mode 100644
index 0000000..a3505fc 100644
--- /dev/null
+++ b/legacy/gcc/gcc/config/i386/haiku.h
@@ -1,0 +1,535 @@
/* Definitions for Intel x86 running Haiku
   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004
   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 2, 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 COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

#ifndef I386
#include <i386/i386.h>	/* Base i386 target machine definitions */
#include <i386/att.h>	/* Use the i386 AT&T assembler syntax */
#include <svr4.h>	/* some common stuff */
#endif

/* /usr/ccs doesn't exist on Haiku, so we don't want to use it */
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX

#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (i386 Haiku/ELF)");

/* Change debugging to Dwarf2.  */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG

/* The SVR4 ABI for the i386 says that records and unions are returned
   in memory.  */
#undef DEFAULT_PCC_STRUCT_RETURN
#define DEFAULT_PCC_STRUCT_RETURN 1

#undef ASM_COMMENT_START
#define ASM_COMMENT_START " #"

/* This is how to output an element of a case-vector that is relative.
   This is only used for PIC code.  See comments by the `casesi' insn in
   i386.md for an explanation of the expression this outputs. */
#undef ASM_OUTPUT_ADDR_DIFF_ELT
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
  fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)

/* Indicate that jump tables go in the text section.  This is
   necessary when compiling PIC code.  */
#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)

/* Copy this from the svr4 specifications... */
/* Define the register numbers to be used in Dwarf debugging information.
   The SVR4 reference port C compiler uses the following register numbers
   in its Dwarf output code:
	0 for %eax (gnu regno = 0)
	1 for %ecx (gnu regno = 2)
	2 for %edx (gnu regno = 1)
	3 for %ebx (gnu regno = 3)
	4 for %esp (gnu regno = 7)
	5 for %ebp (gnu regno = 6)
	6 for %esi (gnu regno = 4)
	7 for %edi (gnu regno = 5)
   The following three DWARF register numbers are never generated by
   the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
   believes these numbers have these meanings.
	8  for %eip    (no gnu equivalent)
	9  for %eflags (no gnu equivalent)
	10 for %trapno (no gnu equivalent)
   It is not at all clear how we should number the FP stack registers
   for the x86 architecture.  If the version of SDB on x86/svr4 were
   a bit less brain dead with respect to floating-point then we would
   have a precedent to follow with respect to DWARF register numbers
   for x86 FP registers, but the SDB on x86/svr4 is so completely
   broken with respect to FP registers that it is hardly worth thinking
   of it as something to strive for compatibility with.
   The version of x86/svr4 SDB I have at the moment does (partially)
   seem to believe that DWARF register number 11 is associated with
   the x86 register %st(0), but that's about all.  Higher DWARF
   register numbers don't seem to be associated with anything in
   particular, and even for DWARF regno 11, SDB only seems to under-
   stand that it should say that a variable lives in %st(0) (when
   asked via an `=' command) if we said it was in DWARF regno 11,
   but SDB still prints garbage when asked for the value of the
   variable in question (via a `/' command).
   (Also note that the labels SDB prints for various FP stack regs
   when doing an `x' command are all wrong.)
   Note that these problems generally don't affect the native SVR4
   C compiler because it doesn't allow the use of -O with -g and
   because when it is *not* optimizing, it allocates a memory
   location for each floating-point variable, and the memory
   location is what gets described in the DWARF AT_location
   attribute for the variable in question.
   Regardless of the severe mental illness of the x86/svr4 SDB, we
   do something sensible here and we use the following DWARF
   register numbers.  Note that these are all stack-top-relative
   numbers.
	11 for %st(0) (gnu regno = 8)
	12 for %st(1) (gnu regno = 9)
	13 for %st(2) (gnu regno = 10)
	14 for %st(3) (gnu regno = 11)
	15 for %st(4) (gnu regno = 12)
	16 for %st(5) (gnu regno = 13)
	17 for %st(6) (gnu regno = 14)
	18 for %st(7) (gnu regno = 15)
*/
#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(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)+3 \
 : (-1))

/* Output assembler code to FILE to increment profiler label # LABELNO
   for profiling a function entry.  */

#undef FUNCTION_PROFILER
#define FUNCTION_PROFILER(FILE, LABELNO)  \
{									\
  if (flag_pic)								\
    {									\
      fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n",		\
	       LPREFIX, (LABELNO));					\
      fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n");			\
    }									\
  else									\
    {									\
      fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO));	\
      fprintf (FILE, "\tcall mcount\n");				\
    }									\
}

#undef SIZE_TYPE
#define SIZE_TYPE "long unsigned int"
 
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "long int"
  
#undef WCHAR_TYPE
#define WCHAR_TYPE "short unsigned int"
   
#undef WCHAR_UNSIGNED
#define WCHAR_UNSIGNED 1

#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 16
    
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-D__ELF__ -D__HAIKU__ -D__BEOS__ -D__INTEL__ -D_X86_=1 \
-D__stdcall=__attribute__((__stdcall__)) \
-D__cdecl=__attribute__((__cdecl__)) \
-D__declspec(x)=__attribute__((x)) \
-Asystem(haiku)"

#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) %{!no-fPIC:%{!no-fpic:-D__PIC__ -D__pic__}}"

/* Haiku uses lots of multichars, so don't warn about them unless the
   user explicitly asks for the warnings with -Wmultichar.  Note that
   CC1_SPEC is used for both cc1 and cc1plus. */

#undef CC1_SPEC
#define CC1_SPEC "%{!no-fpic:%{!fPIC:-fpic}} %{!Wmultichar: -Wno-multichar} %(cc1_cpu) %{profile:-p}"

#undef CC1PLUS_SPEC
#define CC1PLUS_SPEC "%{!Wctor-dtor-privacy:-Wno-ctor-dtor-privacy}"

/* Provide a LINK_SPEC appropriate for BeOS.  Here we provide support
   for the special GCC options -static and -shared, which allow us to
   link things in one of these three modes by applying the appropriate
   combinations of options at link-time. */

/* If ELF is the default format, we should not use /lib/elf. */

#undef	LINK_SPEC
#define LINK_SPEC "%{!o*:-o %b} -m elf_i386_haiku -shared -Bsymbolic --no-undefined %{nostart:-e 0} %{shared:-e 0}"

/* Provide start and end file specs appropriate to glibc.  */

/* LIB_SPEC for Haiku */
#undef LIB_SPEC
#define LIB_SPEC "-lroot"

/* gcc runtime lib is built into libroot.so on Haiku */
/* ??? This is gonna be lovely when the next release of gcc has 
   some new symbol in, so that links start failing.  */
#undef LIBGCC_SPEC
#define LIBGCC_SPEC ""

#undef  STARTFILE_SPEC
#define STARTFILE_SPEC "crti.o%s crtbegin.o%s %{!nostart: %{!shared: start_dyn.o%s}} init_term_dyn.o%s %{p:i386-mcount.o%s}"

#undef  ENDFILE_SPEC
#define ENDFILE_SPEC "crtend.o%s crtn.o%s"

/* Get perform_* macros to build libgcc.a.  */
#include "i386/perform.h"

/* A C statement (sans semicolon) to output to the stdio stream
   FILE the assembler definition of uninitialized global DECL named
   NAME whose size is SIZE bytes and alignment is ALIGN bytes.
   Try to use asm_output_aligned_bss to implement this macro.  */

#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
  asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)

/* A C statement to output to the stdio stream FILE an assembler
   command to advance the location counter to a multiple of 1<<LOG
   bytes if it is within MAX_SKIP bytes.

   This is used to align code labels according to Intel recommendations.  */

#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
  do {									\
    if ((LOG)!=0) \
      if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG));   \
      else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
  } while (0)
#endif

/*
 * Support for __declspec(dllimport) & __declspec(dllexport).
 */

/* We don't care about dllimport.  */
#define TARGET_NOP_FUN_DLLIMPORT 1

/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
   is a valid machine specific attribute for DECL.
   The attributes in ATTRIBUTES have previously been assigned to DECL.  */

#undef VALID_MACHINE_DECL_ATTRIBUTE
#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
  i386_pe_valid_decl_attribute_p (DECL, ATTRIBUTES, IDENTIFIER, ARGS)
extern int i386_pe_valid_decl_attribute_p ();

/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
   is a valid machine specific attribute for TYPE.
   The attributes in ATTRIBUTES have previously been assigned to TYPE.  */

#undef VALID_MACHINE_TYPE_ATTRIBUTE
#define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) \
  i386_pe_valid_type_attribute_p (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)
extern int i386_pe_valid_type_attribute_p ();

#define MERGE_MACHINE_DECL_ATTRIBUTES(OLD, NEW) \
  i386_pe_merge_decl_attributes ((OLD), (NEW))
extern union tree_node *i386_pe_merge_decl_attributes ();

/* Used to implement dllexport overriding dllimport semantics.  It's also used
   to handle vtables - the first pass won't do anything because
   DECL_CONTEXT (DECL) will be 0 so i386_pe_dll{ex,im}port_p will return 0.
   It's also used to handle dllimport override semantics.  */
#define REDO_SECTION_INFO_P(DECL) \
  ((DECL_MACHINE_ATTRIBUTES (DECL) != NULL_TREE) \
   || (TREE_CODE (DECL) == VAR_DECL && DECL_VIRTUAL_P (DECL)))

/* Used only here locally.  If the decl has been exported, emit the 
   necessary assembly.  */

#define ASM_EXPORT_DECL(FILE, NAME, DECL)				\
  do {									\
    if ((DECL) && i386_pe_dllexport_p (DECL))				\
      {									\
	fprintf ((FILE), ".section .exports\n");			\
	fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP);			\
        assemble_name (FILE, NAME);					\
	fprintf ((FILE), "\"\n.previous\n");				\
      }									\
  } while (0)

/* Write the extra assembler code needed to declare a function properly.
   Some svr4 assemblers need to also have something extra said about the
   function's return value.  We allow for that here.  */

#undef ASM_DECLARE_FUNCTION_NAME
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
  do {									\
    ASM_EXPORT_DECL(FILE, NAME, DECL);					\
    fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);				\
    assemble_name (FILE, NAME);						\
    putc (',', FILE);							\
    fprintf (FILE, TYPE_OPERAND_FMT, "function");			\
    putc ('\n', FILE);							\
    ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));			\
    ASM_OUTPUT_LABEL(FILE, NAME);					\
  } while (0)

/* Write the extra assembler code needed to declare an object properly.  */

#undef ASM_DECLARE_OBJECT_NAME
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
  do {									\
    ASM_EXPORT_DECL(FILE, NAME, DECL);					\
    fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);				\
    assemble_name (FILE, NAME);						\
    putc (',', FILE);							\
    fprintf (FILE, TYPE_OPERAND_FMT, "object");				\
    putc ('\n', FILE);							\
    size_directive_output = 0;						\
    if (!flag_inhibit_size_directive && DECL_SIZE (DECL))		\
      {									\
        size_directive_output = 1;					\
        fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);				\
        assemble_name (FILE, NAME);					\
        putc (',', FILE);						\
        fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,				\
                 int_size_in_bytes (TREE_TYPE (DECL)));			\
        fputc ('\n', FILE);						\
      }									\
    ASM_OUTPUT_LABEL(FILE, NAME);					\
  } while (0)

/* Similarly for COMMON symbols.  */

#undef ASM_OUTPUT_ALIGNED_COMMON
#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN)	\
  do {									\
    ASM_EXPORT_DECL(FILE, NAME, DECL);					\
    fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);				\
    assemble_name ((FILE), (NAME));					\
    fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
  } while (0)

#undef ASM_OUTPUT_ALIGNED_LOCAL
#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	     \
  do {									     \
    fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);				     \
    assemble_name ((FILE), (NAME));					     \
    fprintf ((FILE), "\n");						     \
    ASM_OUTPUT_ALIGNED_DECL_COMMON((FILE), (DECL), (NAME), (SIZE), (ALIGN)); \
  } while (0)

/* Haiku's default stack size for a process' main thread is 16 MB. That's
   definitely not "small". */

#undef SMALL_STACK

/* For native compiler, use standard Haiku include file search paths
   rooted in /boot/develop/headers.  For a cross compiler, don't
   expect the host to use the Haiku directory scheme, and instead look
   for the Haiku include files relative to TOOL_INCLUDE_DIR.  Yes, we
   use ANSI string concatenation here (FIXME) */

#ifndef CROSS_COMPILE
#undef INCLUDE_DEFAULTS
#define INCLUDE_DEFAULTS \
    { \
    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },\
    { GCC_INCLUDE_DIR, "GCC", 0, 0 },\
    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1}, \
    { "/boot/develop/headers/be/add-ons/graphics", 0, 0, 0 },\
    { "/boot/develop/headers/be/devel", 0, 0, 0 },\
    { "/boot/develop/headers/be/translation", 0, 0, 0 },\
    { "/boot/develop/headers/be/mail", 0, 0, 0 },\
    { "/boot/develop/headers/gnu", 0, 0, 0 },\
    { "/boot/develop/headers/be/drivers", 0, 0, 0 },\
    { "/boot/develop/headers/be/opengl", 0, 0, 0 },\
    { "/boot/develop/headers/be/game", 0, 0, 0 },\
    { "/boot/develop/headers/be/support", 0, 0, 0 },\
    { "/boot/develop/headers/be/storage", 0, 0, 0 },\
    { "/boot/develop/headers/be/kernel", 0, 0, 0 },\
    { "/boot/develop/headers/be/net", 0, 0, 0 },\
    { "/boot/develop/headers/be/midi", 0, 0, 0 },\
    { "/boot/develop/headers/be/midi2", 0, 0, 0 },\
    { "/boot/develop/headers/be/media", 0, 0, 0 },\
    { "/boot/develop/headers/be/interface", 0, 0, 0 },\
    { "/boot/develop/headers/be/device", 0, 0, 0 },\
    { "/boot/develop/headers/be/app", 0, 0, 0 },\
    { "/boot/develop/headers/be/precompiled", 0, 0, 0 },\
    { "/boot/develop/headers/be/add-ons/input_server", 0, 0, 0 },\
    { "/boot/develop/headers/be/add-ons/net_server", 0, 0, 0 },\
    { "/boot/develop/headers/be/add-ons/screen_saver", 0, 0, 0 },\
    { "/boot/develop/headers/be/add-ons/tracker", 0, 0, 0 },\
    { "/boot/develop/headers/be/be_apps/Deskbar", 0, 0, 0 },\
    { "/boot/develop/headers/be/be_apps/NetPositive", 0, 0, 0 },\
    { "/boot/develop/headers/be/be_apps/Tracker", 0, 0, 0 },\
    { "/boot/develop/headers/be/drivers/tty", 0, 0, 0 },\
    { "/boot/develop/headers/be/net/netinet", 0, 0, 0 },\
    { "/boot/develop/headers/be/storage", 0, 0, 0 },\
    { "/boot/develop/headers/be", 0, 0, 0 },\
    { "/boot/develop/headers/cpp", 0, 0, 0 },\
    { "/boot/develop/headers/posix", 0, 0, 0 },\
    { "/boot/develop/headers", 0, 0, 0 }, \
    { 0, 0, 0, 0 } \
    };
#else /* CROSS_COMPILE */
#undef	INCLUDE_DEFAULTS
#define INCLUDE_DEFAULTS				\
    { \
    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },\
    { GCC_INCLUDE_DIR, "GCC", 0, 0 },\
    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1}, \
    { CROSS_INCLUDE_DIR "/be/add-ons/graphics", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/devel", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/translation", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/mail", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/gnu", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/drivers", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/opengl", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/game", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/support", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/storage", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/kernel", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/net", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/midi", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/midi2", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/media", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/interface", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/device", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/app", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/precompiled", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/add-ons/input_server", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/add-ons/net_server", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/add-ons/screen_saver", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/add-ons/tracker", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/be_apps/Deskbar", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/be_apps/NetPositive", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/be_apps/Tracker", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/drivers/tty", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/net/netinet", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be/storage", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/be", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/cpp", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR "/posix", 0, 0, 0 },\
    { CROSS_INCLUDE_DIR , 0, 0, 0 }, \
    { 0, 0, 0, 0 } \
    };
#endif

/* Whee.  LIBRARY_PATH is Haiku's LD_LIBRARY_PATH, which of course will
   cause nasty problems if we override it.  */
#define LIBRARY_PATH_ENV        "BELIBRARIES"

/* Haiku doesn't have a separate math library.  */
#define MATH_LIBRARY ""

/* Haiku headers are C++-aware (and often use C++).  */
#define NO_IMPLICIT_EXTERN_C

/* 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).  */
/* [zooey]:
	I believe BeOS doesn't actually require this, and *not* using it
   yields considerably smaller object files.
   That's why we do not follow the configuration from gnupro-0002224
   and go with a single symbol space instead: */
/* [zooey]:
	After more research, it turned out that with -O0, we require MULTIPLE
	SYMBOL_SPACES, but with active optimization, we don't.
	(We get link-errors about BView::SetHighColor(ui,ui,ui,ui) missing
	when optimization is off).
	So we do just that, we replace MULTIPLE_SYMBOL_SPACES with a
	test for optimization (see lex.c, line 4882ff and decl2.c, line 2701).
*/
/* [bonefish]:
    Review! */

#undef MULTIPLE_SYMBOL_SPACES

/* I'm not sure why this is defined this way, but pavel@be.com can
   probably provide some insight.  :-)  */
#define LIBSTDCXX "-lstdc++.r4"

/* A C statement to output assembler commands which will identify the object
   file as having been compiled with GNU CC.  This isn't needed for Haiku
   because we use DWARF and DWARF has an DW_AT_producer tag that does the
   same thing.  Gdb is probably the only debugger that uses this anyway,
   so the most likely ill effect of disabling this is that a BeOS gdb
   debugging an executable with no debug info would not see the gcc2_compiled
   label. */
/* [bonefish]:
    Review! */
#undef ASM_IDENTIFY_GCC
#define ASM_IDENTIFY_GCC(FILE) 

/* required to compile winnt.c */
/* [bonefish]:
    Review! */
#define I386_PE_STRIP_ENCODING(SYM_NAME) \
  ((SYM_NAME) + ((SYM_NAME)[0] == '@' ? 3 : 0))

#define DRECTVE_SECTION_FUNCTION \
void									\
drectve_section ()							\
{									\
  if (in_section != in_drectve)						\
    {									\
      fprintf (asm_out_file, "%s\n", "\t.section .drectve\n");		\
      in_section = in_drectve;						\
    }									\
}

#undef EXTRA_SECTION_FUNCTIONS
#define EXTRA_SECTION_FUNCTIONS						\
  CONST_SECTION_FUNCTION						\
  CTORS_SECTION_FUNCTION						\
  DTORS_SECTION_FUNCTION						\
  DRECTVE_SECTION_FUNCTION

#undef EXTRA_SECTIONS
#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_drectve

/* [zooey]:
   '#pragma interface' seems to trigger a bug which causes 
   global constructors and destructors (keyed to the first function in
   a translation unit) not being generated, causing the link to fail.
   So we ignore '#pragma interface' for Haiku.
   All this applies only when multiple symbol spaces are active (i.e.
   if no optimization is done).
   */
#define WORK_AROUND_PRAGMA_INTERFACE_BUG 1

/* The origin of Haiku's gcc is egcs 1.1.x, and these version had a bug
   in mangled name builder. The APIs of Haiku are furnished to the
   developers as shared library of C++. And if we use fixed mangled
   names in newer gcc, some APIs are hidden with name problem. */
#define USE_EGCS_MANGLED_NAMES
diff --git a/legacy/gcc/gcc/config/i386/t-haiku b/legacy/gcc/gcc/config/i386/t-haiku
new file mode 100644
index 0000000..71908d0 100644
--- /dev/null
+++ b/legacy/gcc/gcc/config/i386/t-haiku
@@ -1,0 +1,15 @@
# Do not build libgcc1.
LIBGCC1 =
CROSS_LIBGCC1 =

# There are system headers elsewhere, but these are the ones that
# we are most likely to want to apply any fixes to.
SYSTEM_HEADER_DIR = /boot/develop/headers/posix
CROSS_SYSTEM_HEADER_DIR := $(CROSS_SYSTEM_HEADER_DIR)/posix

# Use the system assert.h
INSTALL_ASSERT_H =

winnt.o: $(srcdir)/config/i386/winnt.c
	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/i386/winnt.c

diff --git a/legacy/gcc/gcc/config/i386/x-haiku b/legacy/gcc/gcc/config/i386/x-haiku
new file mode 100644
index 0000000..88d79e1 100644
--- /dev/null
+++ b/legacy/gcc/gcc/config/i386/x-haiku
@@ -1,0 +1,9 @@
# configuration for Haiku
INSTALL=install -c

# Show we need to use the C version of ALLOCA
ALLOCA=alloca.o
# Use it regardless of whether we are compiling with gcc or not.
USE_ALLOCA= `echo "${ALLOCA}"`
USE_HOST_ALLOCA= `echo ${HOST_PREFIX}${HOST_ALLOCA}`
SUBDIR_USE_ALLOCA = `if [ x$(ALLOCA) != x ]; then echo ../$(ALLOCA); else true; fi`
diff --git a/legacy/gcc/gcc/config/i386/xm-haiku.h b/legacy/gcc/gcc/config/i386/xm-haiku.h
new file mode 100644
index 0000000..40fb7a8 100644
--- /dev/null
+++ b/legacy/gcc/gcc/config/i386/xm-haiku.h
@@ -1,0 +1,78 @@
/* Configuration for GNU C-compiler for BeOS host.
   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
   Contributed by Fred Fish (fnf@cygnus.com), based on xm-rs6000.h
   by Richard Kenner (kenner@vlsi1.ultra.nyu.edu).

This file is part of GNU CC.

GNU CC 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 2, or (at your option)
any later version.

GNU CC 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 GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

#include <i386/xm-i386.h>

/* Arguments to use with `exit'.  */

#define	SUCCESS_EXIT_CODE	0
#define	FATAL_EXIT_CODE		33

/* Include <sys/wait.h> to define the exit status access macros.  */
#ifndef inhibit_libc
#include <sys/wait.h>
#endif

#define	ONLY_INT_FIELDS

/* use ANSI/SYSV style byte manipulation routines instead of BSD ones */

#undef bcopy
#define bcopy(s,d,n)	memmove((d),(s),(n))
#undef bzero
#define bzero(d,n)	memset((d),0,(n))
#undef bcmp
#define bcmp(l,r,n)	memcmp((l),(r),(n))
#undef index
#define index		strchr
#undef rindex
#define rindex		strrchr

/* Haiku is closer to USG than BSD */

#define USG

/* Define various things that the Haiku host has. */

#ifndef HAVE_VPRINTF
#define HAVE_VPRINTF
#endif
#ifndef HAVE_PUTENV
#define HAVE_PUTENV
#endif
#define HAVE_RENAME

#define STDC_HEADERS 1

#ifndef CROSS_COMPILE
/* Define this macro to make error messages always emit full paths.
   This is needed so that error output parsing development environment
   can unambiguously determine the source file with an error.  */
#define FULL_PATHS_IN_ERRORS 1
#endif

#ifndef LIBRARY_PATH_ENV
/* If we don't define this, LIBRARY_PATH will be overwritten and
   the execution of collect2 will be failed. */
#define LIBRARY_PATH_ENV	"BELIBRARIES"
#endif