haiku: Initial build support

Message ID 20180717012715.26131-1-kallisti5@unixzen.com
State New
Headers show
Series
  • haiku: Initial build support
Related show

Commit Message

Alexander von Gluck IV July 17, 2018, 1:27 a.m.
* We have been dragging these around since gcc 4.x.
* Some tweaks will likely be needed, but this gets our foot
  in the door.

Authors:
  Fredrik Holmqvist
  Jerome Duval
  Augustin Cavalier
  François Revol
  Simon South
  Jessica Hamilton
  Ithamar R. Adema
  Oliver Tappe
  Jonathan Schleifer
  .. and maybe more!
---
 config.rpath                                  |   2 +
 config/acx.m4                                 |  36 ++-
 configure                                     |  53 ++--
 configure.ac                                  |  60 ++--
 gcc/config.gcc                                |  49 +++-
 gcc/config.host                               |  10 +-
 gcc/config/arm/haiku.h                        |  80 ++++++
 gcc/config/arm/t-haiku                        |  21 ++
 gcc/config/haiku-spec.h                       |  38 +++
 gcc/config/haiku-stdint.h                     |  55 ++++
 gcc/config/haiku.h                            | 217 ++++++++++++++
 gcc/config/i386/haiku.h                       |  77 +++++
 gcc/config/i386/haiku64.h                     | 135 +++++++++
 gcc/config/i386/t-haiku64                     |  16 ++
 gcc/config/m68k/haiku.h                       | 268 ++++++++++++++++++
 gcc/config/mips/haiku.h                       |  44 +++
 gcc/config/rs6000/haiku.h                     |  56 ++++
 gcc/config/t-haiku                            |   4 +
 gcc/configure                                 |  22 +-
 libgcc/config.host                            |  22 ++
 libgcc/config/t-haiku                         |   3 +
 libstdc++-v3/config/os/haiku/ctype_base.h     |  61 ++++
 .../config/os/haiku/ctype_configure_char.cc   |  99 +++++++
 libstdc++-v3/config/os/haiku/ctype_inline.h   | 168 +++++++++++
 .../config/os/haiku/error_constants.h         | 178 ++++++++++++
 libstdc++-v3/config/os/haiku/os_defines.h     |  48 ++++
 libstdc++-v3/configure                        |  85 +++++-
 libstdc++-v3/configure.host                   |   2 +-
 libstdc++-v3/crossconfig.m4                   |  40 +++
 libtool.m4                                    |   8 +-
 30 files changed, 1883 insertions(+), 74 deletions(-)
 create mode 100644 gcc/config/arm/haiku.h
 create mode 100644 gcc/config/arm/t-haiku
 create mode 100644 gcc/config/haiku-spec.h
 create mode 100644 gcc/config/haiku-stdint.h
 create mode 100644 gcc/config/haiku.h
 create mode 100644 gcc/config/i386/haiku.h
 create mode 100644 gcc/config/i386/haiku64.h
 create mode 100644 gcc/config/i386/t-haiku64
 create mode 100644 gcc/config/m68k/haiku.h
 create mode 100644 gcc/config/mips/haiku.h
 create mode 100644 gcc/config/rs6000/haiku.h
 create mode 100644 gcc/config/t-haiku
 create mode 100644 libgcc/config/t-haiku
 create mode 100644 libstdc++-v3/config/os/haiku/ctype_base.h
 create mode 100644 libstdc++-v3/config/os/haiku/ctype_configure_char.cc
 create mode 100644 libstdc++-v3/config/os/haiku/ctype_inline.h
 create mode 100644 libstdc++-v3/config/os/haiku/error_constants.h
 create mode 100644 libstdc++-v3/config/os/haiku/os_defines.h

-- 
2.17.1

Comments

Joseph Myers July 26, 2018, 5:26 p.m. | #1
On Mon, 16 Jul 2018, Alexander von Gluck IV wrote:

> * We have been dragging these around since gcc 4.x.

> * Some tweaks will likely be needed, but this gets our foot

>   in the door.

> 

> Authors:

>   Fredrik Holmqvist

>   Jerome Duval

>   Augustin Cavalier

>   François Revol

>   Simon South

>   Jessica Hamilton

>   Ithamar R. Adema

>   Oliver Tappe

>   Jonathan Schleifer

>   .. and maybe more!


Before this can be reviewed, we'll need copyright assignments (with 
employer disclaimers where applicable) on file at the FSF from everyone 
who contributed a legally significant amount of code (more than around 15 
lines).  Without those, reviewers can't safely look at the changes in 
detail.

https://gcc.gnu.org/contribute.html

https://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/Copyright/request-assign.future

Then, please make sure that only substantive changes are included - that 
there are no diff lines that are purely changing trailing whitespace in 
existing code, for example.  Please ensure that all copyright and license 
notices follow current standards (which means using ranges of years ending 
in 2018, GPLv3 notices and a URL not an FSF postal address).  For changes 
to existing code, especially, please make sure to include sufficient 
rationale in the patch submission to explain those changes, why they are 
needed and the approach taken to them.

For new target OS support, I'd expect details to be provided of the test 
results on that OS for the various architectures supported by GCC.  Are 
you planning, if the support is accepted in GCC, to maintain a bot that 
keeps running the GCC testsuite for GCC mainline for this OS for the 
various target architectures supported, at least daily or thereabouts, and 
posts the results to the gcc-testresults list, and to keep monitoring the 
test results and fixing OS-specific issues that show up?  It's much better 
for issues to be identified within a day or two of the commit causing them 
than many months later, possibly only after a release has come out with 
the issue - but that requires an ongoing commitment to keep monitoring 
test results, posting them to gcc-testresults and keeping them in good 
shape.

> diff --git a/libtool.m4 b/libtool.m4


If this an exact backport of a change from upstream libtool git?  If so, 
please give the commit reference.  If not, give the URL of the submission 
to upstream libtool.  We don't want local libtool changes that aren't 
backports or at least proposed upstream without objections, to avoid 
making future updates from upstream libtool harder.

-- 
Joseph S. Myers
joseph@codesourcery.com
Ramana Radhakrishnan July 27, 2018, 11:59 a.m. | #2
On Thu, Jul 26, 2018 at 6:26 PM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Mon, 16 Jul 2018, Alexander von Gluck IV wrote:

>

>> * We have been dragging these around since gcc 4.x.

>> * Some tweaks will likely be needed, but this gets our foot

>>   in the door.

>>

>> Authors:

>>   Fredrik Holmqvist

>>   Jerome Duval

>>   Augustin Cavalier

>>   François Revol

>>   Simon South

>>   Jessica Hamilton

>>   Ithamar R. Adema

>>   Oliver Tappe

>>   Jonathan Schleifer

>>   .. and maybe more!

>

> Before this can be reviewed, we'll need copyright assignments (with

> employer disclaimers where applicable) on file at the FSF from everyone

> who contributed a legally significant amount of code (more than around 15

> lines).  Without those, reviewers can't safely look at the changes in

> detail.

>

> https://gcc.gnu.org/contribute.html

>

> https://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/Copyright/request-assign.future

>

> Then, please make sure that only substantive changes are included - that

> there are no diff lines that are purely changing trailing whitespace in

> existing code, for example.  Please ensure that all copyright and license

> notices follow current standards (which means using ranges of years ending

> in 2018, GPLv3 notices and a URL not an FSF postal address).  For changes

> to existing code, especially, please make sure to include sufficient

> rationale in the patch submission to explain those changes, why they are

> needed and the approach taken to them.

>

> For new target OS support, I'd expect details to be provided of the test

> results on that OS for the various architectures supported by GCC.  Are

> you planning, if the support is accepted in GCC, to maintain a bot that

> keeps running the GCC testsuite for GCC mainline for this OS for the

> various target architectures supported, at least daily or thereabouts, and

> posts the results to the gcc-testresults list, and to keep monitoring the

> test results and fixing OS-specific issues that show up?  It's much better

> for issues to be identified within a day or two of the commit causing them

> than many months later, possibly only after a release has come out with

> the issue - but that requires an ongoing commitment to keep monitoring

> test results, posting them to gcc-testresults and keeping them in good

> shape.


Joseph,

A lot of such information seems to come out from a number of reviewers
only during patch review from new contributors.  Would you mind
improving https://gcc.gnu.org/contribute.html and especially around
"Testing patches" or start something like the glibc contribution
checklist on the wiki that actually makes a lot of this easy to find
rather than searching in mailing list archives for new contributors ?

regards
Ramana

>

>> diff --git a/libtool.m4 b/libtool.m4

>

> If this an exact backport of a change from upstream libtool git?  If so,

> please give the commit reference.  If not, give the URL of the submission

> to upstream libtool.  We don't want local libtool changes that aren't

> backports or at least proposed upstream without objections, to avoid

> making future updates from upstream libtool harder.

>

> --

> Joseph S. Myers

> joseph@codesourcery.com
Alexander von Gluck IV July 27, 2018, 1:08 p.m. | #3
July 27, 2018 6:59 AM, "Ramana Radhakrishnan" <ramana.gcc@googlemail.com> wrote:
> On Thu, Jul 26, 2018 at 6:26 PM, Joseph Myers <joseph@codesourcery.com> wrote:

> 

>> On Mon, 16 Jul 2018, Alexander von Gluck IV wrote:

>> 

>>> * We have been dragging these around since gcc 4.x.

>>> * Some tweaks will likely be needed, but this gets our foot

>>> in the door.

>>> 

>>> Authors:

>>> .

>>> .. and maybe more!

>> 

>> Before this can be reviewed, we'll need copyright assignments (with

>> employer disclaimers where applicable) on file at the FSF from everyone

>> who contributed a legally significant amount of code (more than around 15

>> lines). Without those, reviewers can't safely look at the changes in

>> detail.

>>

>> https://gcc.gnu.org/contribute.html


Can-do.  I'll reach out to those involved.
None of these commits are coorporate sponsored.

>> https://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/Copyright/request-assign.future

>> 

>> Then, please make sure that only substantive changes are included - that

>> there are no diff lines that are purely changing trailing whitespace in

>> existing code, for example. Please ensure that all copyright and license

>> notices follow current standards (which means using ranges of years ending

>> in 2018, GPLv3 notices and a URL not an FSF postal address).


>> For changes to existing code, especially, please make sure to include

>> sufficient rationale in the patch submission to explain those changes,

>> why they are needed and the approach taken to them.


Can-do.  The white-space issues definitely need to be corrected.

>> 

>> For new target OS support, I'd expect details to be provided of the test

>> results on that OS for the various architectures supported by GCC. Are

>> you planning, if the support is accepted in GCC, to maintain a bot that

>> keeps running the GCC testsuite for GCC mainline for this OS for the

>> various target architectures supported, at least daily or thereabouts, and

>> posts the results to the gcc-testresults list, and to keep monitoring the

>> test results and fixing OS-specific issues that show up?


We have some (limited) space reserved on our core infrastructure for such
builders. We also have a global network of physical builders managed by
project volunteers and sponsored by Mozilla. (hand-me-downs builders :-))

>> It's much better for issues to be identified within a day or two of the

>> commit causing them than many months later, possibly only after a release

>> has come out with the issue - but that requires an ongoing commitment to

>> keep monitoring test results, posting them to gcc-testresults and keeping

>> them in good shape.


This is good information, however, does GCC have docs for this? We are a
small team of open source developers with maybe a few man-hours a month
available to dedicate to gcc maintainership. (no excuses, just trying
to set the expectations)

These steps seem like what's needed on a first-class platform (Linux, OS X,
etc). So the same requirements apply to all new GCC platforms code?

I'd assume when introducing new platform support, some leeway would be
provided until the platform could be flagged as stable (or jump up a
more "supported" level).  Of course, any changes which would present
risk to unrelated platforms (Linux, etc) would need increased scrutiny.

On a side / unrelated note, we have been upstream in clang / llvm for
quite some time... my goals here are to get gcc to the same level
of support.

> A lot of such information seems to come out from a number of reviewers

> only during patch review from new contributors. Would you mind

> improving https://gcc.gnu.org/contribute.html and especially around

> "Testing patches" or start something like the glibc contribution

> checklist on the wiki that actually makes a lot of this easy to find

> rather than searching in mailing list archives for new contributors ?


+1.  It would be nice to have expectations posted. I came into this 
a little blind based on that article.

>>> diff --git a/libtool.m4 b/libtool.m4

>> 

>> If this an exact backport of a change from upstream libtool git? If so,

>> please give the commit reference. If not, give the URL of the submission

>> to upstream libtool. We don't want local libtool changes that aren't

>> backports or at least proposed upstream without objections, to avoid

>> making future updates from upstream libtool harder.


Yeah, I wasn't 100% on what the best process was here.

We have been in upstream autotools for quite a few years... i'll see
if this needs to be moved to libtool upstream.


 -- Alexander von Gluck IV
Joseph Myers July 27, 2018, 5:05 p.m. | #4
On Fri, 27 Jul 2018, Ramana Radhakrishnan wrote:

> Joseph,

> 

> A lot of such information seems to come out from a number of reviewers

> only during patch review from new contributors.  Would you mind

> improving https://gcc.gnu.org/contribute.html and especially around

> "Testing patches" or start something like the glibc contribution

> checklist on the wiki that actually makes a lot of this easy to find

> rather than searching in mailing list archives for new contributors ?


I think the information in my comments about proper contents of the patch 
submission is generally already present in contribute.html.

There may be less information about expectations for target architecture / 
OS maintainers running tests on an ongoing basis.  Perhaps at the Cauldron 
we should discuss whether we wish to move towards a requirement of bots 
posting test results for all new architecture and OS ports?

-- 
Joseph S. Myers
joseph@codesourcery.com
Joseph Myers July 27, 2018, 5:22 p.m. | #5
On Fri, 27 Jul 2018, Alexander von Gluck IV wrote:

> >> It's much better for issues to be identified within a day or two of the

> >> commit causing them than many months later, possibly only after a release

> >> has come out with the issue - but that requires an ongoing commitment to

> >> keep monitoring test results, posting them to gcc-testresults and keeping

> >> them in good shape.

> 

> This is good information, however, does GCC have docs for this? We are a

> small team of open source developers with maybe a few man-hours a month

> available to dedicate to gcc maintainership. (no excuses, just trying

> to set the expectations)


Well, install.texi documents the use of contrib/test_summary to post test 
results.

I think the documentation is better for one-off requirements for a patch, 
than for expectations for maintainers on an ongoing basis (in that 
maintainers would typically have been following development for some time, 
and so have seen what maintainers of other architectures and OSes do - for 
example, have seen how AIX people promptly raise issues when a patch 
breaks things for AIX, which is the sort of thing I'd expect target OS 
maintainers to do in general).

> These steps seem like what's needed on a first-class platform (Linux, OS X,

> etc). So the same requirements apply to all new GCC platforms code?


Requirements for OS and architecture ports aren't well-defined and seem 
like a good topic for Cauldron discussion.  But generically, it's 
important that new architecture and OS ports don't get in the way of 
global changes.  This means it's important to have sufficient 
documentation available for architectures for the use of people doing 
global changes, that it's valuable to have simulators (with OS images as 
applicable) with information (e.g. DejaGnu board files) available for 
people wishing to test on the architecture or OS (or hardware systems 
available in the GCC Compile Farm, for architectures and OSes for which 
that works better), and that it's valuable if people can tell at a glance 
at recent gcc-testresults posts what shape the port is in.

And, as a matter of working well with other developers, it's much better 
to find and point out breakage promptly rather than long after the patch 
that broke something went in (and, in particular, in the same development 
stage; if there's a design issue with a patch going in during stage 1 
which requires design changes for some architectures or OSes, it's very 
unhelpful if that's only found much later when trunk is in 
regression-fixes-only mode for the next release).

Also, unmaintained features and unused ports are liable to be removed, and 
having test results posted is important evidence of whether the port is in 
good shape or should be considered for removal.

-- 
Joseph S. Myers
joseph@codesourcery.com

Patch

diff --git a/config.rpath b/config.rpath
index 4dea75957c2..5bcc5be17e4 100755
--- a/config.rpath
+++ b/config.rpath
@@ -161,6 +161,8 @@  if test "$with_gnu_ld" = yes; then
       ;;
     netbsd*)
       ;;
+    haiku*)
+      ;;
     solaris* | sysv5*)
       if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
         ld_shlibs=no
diff --git a/config/acx.m4 b/config/acx.m4
index 87c1b5e2932..7a511a9a1c0 100644
--- a/config/acx.m4
+++ b/config/acx.m4
@@ -428,24 +428,30 @@  dnl for the parameter format "cmp file1 file2 skip1 skip2" which is
 dnl accepted by cmp on some systems.
 AC_DEFUN([ACX_PROG_CMP_IGNORE_INITIAL],
 [AC_CACHE_CHECK([how to compare bootstrapped objects], gcc_cv_prog_cmp_skip,
-[ echo abfoo >t1
-  echo cdfoo >t2
-  gcc_cv_prog_cmp_skip='tail -c +17 $$f1 > tmp-foo1; tail -c +17 $$f2 > tmp-foo2; cmp tmp-foo1 tmp-foo2'
-  if cmp t1 t2 2 2 > /dev/null 2>&1; then
-    if cmp t1 t2 1 1 > /dev/null 2>&1; then
-      :
-    else
-      gcc_cv_prog_cmp_skip='cmp $$f1 $$f2 16 16'
+[# comparing object files via cmp doesn't work on haiku (files will seemingly
+  # always differ), so we disassemble both files and compare the results:
+  if uname -o | grep -iq haiku; then
+    gcc_cv_prog_cmp_skip='objdump -Dz $$f1 | tail +6 >tmp-foo1; objdump -Dz $$f2 | tail +6 >tmp-foo2; cmp tmp-foo1 tmp-foo2'
+  else
+    echo abfoo >t1
+    echo cdfoo >t2
+    gcc_cv_prog_cmp_skip='tail -c +17 $$f1 > tmp-foo1; tail -c +17 $$f2 > tmp-foo2; cmp tmp-foo1 tmp-foo2'
+    if cmp t1 t2 2 2 > /dev/null 2>&1; then
+      if cmp t1 t2 1 1 > /dev/null 2>&1; then
+        :
+      else
+        gcc_cv_prog_cmp_skip='cmp $$f1 $$f2 16 16'
+      fi
     fi
-  fi
-  if cmp --ignore-initial=2 t1 t2 > /dev/null 2>&1; then
-    if cmp --ignore-initial=1 t1 t2 > /dev/null 2>&1; then
-      :
-    else
-      gcc_cv_prog_cmp_skip='cmp --ignore-initial=16 $$f1 $$f2'
+    if cmp --ignore-initial=2 t1 t2 > /dev/null 2>&1; then
+      if cmp --ignore-initial=1 t1 t2 > /dev/null 2>&1; then
+        :
+      else
+        gcc_cv_prog_cmp_skip='cmp --ignore-initial=16 $$f1 $$f2'
+      fi
     fi
+    rm t1 t2
   fi
-  rm t1 t2
 ])
 do_compare="$gcc_cv_prog_cmp_skip"
 AC_SUBST(do_compare)
diff --git a/configure b/configure
index dd9fbe4d322..7804c2f0a5c 100755
--- a/configure
+++ b/configure
@@ -3052,6 +3052,9 @@  case "${host}" in
   i[3456789]86-*-msdosdjgpp*)
     noconfigdirs="$noconfigdirs tcl tk itcl"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs tk itcl libgui gdb"
+    ;;
 esac
 
 
@@ -3157,7 +3160,7 @@  if test x$enable_libgomp = x ; then
 	;;
     *-*-solaris2* | *-*-hpux11*)
 	;;
-    *-*-darwin* | *-*-aix*)
+    *-*-darwin* | *-*-aix* | *-*-haiku*)
 	;;
     nvptx*-*-*)
 	;;
@@ -3358,6 +3361,9 @@  case "${target}" in
   *-*-darwin*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs ${libgcj}"
+    ;;
   *-*-netware*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
@@ -3536,6 +3542,9 @@  case "${target}" in
   *-*-freebsd*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+    ;;
   *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu | *-*-kopensolaris*-gnu)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
@@ -3597,6 +3606,9 @@  case "${target}" in
       with_gmp=/usr/local
     fi
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs gdb target-libiberty"
+    ;;
   *-*-kaos*)
     # Remove unsupported stuff on all kaOS configurations.
     noconfigdirs="$noconfigdirs target-libgloss"
@@ -5249,25 +5261,31 @@  $as_echo_n "checking how to compare bootstrapped objects... " >&6; }
 if test "${gcc_cv_prog_cmp_skip+set}" = set; then :
   $as_echo_n "(cached) " >&6
 else
-   echo abfoo >t1
-  echo cdfoo >t2
-  gcc_cv_prog_cmp_skip='tail -c +17 $$f1 > tmp-foo1; tail -c +17 $$f2 > tmp-foo2; cmp tmp-foo1 tmp-foo2'
-  if cmp t1 t2 2 2 > /dev/null 2>&1; then
-    if cmp t1 t2 1 1 > /dev/null 2>&1; then
-      :
-    else
-      gcc_cv_prog_cmp_skip='cmp $$f1 $$f2 16 16'
+  # comparing object files via cmp doesn't work on haiku (files will seemingly
+  # always differ), so we disassemble both files and compare the results:
+  if uname -o | grep -iq haiku; then
+    gcc_cv_prog_cmp_skip='objdump -Dz $$f1 | tail +6 >tmp-foo1; objdump -Dz $$f2 | tail +6 >tmp-foo2; cmp tmp-foo1 tmp-foo2'
+  else
+    echo abfoo >t1
+    echo cdfoo >t2
+    gcc_cv_prog_cmp_skip='tail -c +17 $$f1 > tmp-foo1; tail -c +17 $$f2 > tmp-foo2; cmp tmp-foo1 tmp-foo2'
+    if cmp t1 t2 2 2 > /dev/null 2>&1; then
+      if cmp t1 t2 1 1 > /dev/null 2>&1; then
+        :
+      else
+        gcc_cv_prog_cmp_skip='cmp $$f1 $$f2 16 16'
+      fi
     fi
-  fi
-  if cmp --ignore-initial=2 t1 t2 > /dev/null 2>&1; then
-    if cmp --ignore-initial=1 t1 t2 > /dev/null 2>&1; then
-      :
-    else
-      gcc_cv_prog_cmp_skip='cmp --ignore-initial=16 $$f1 $$f2'
+
+    if cmp --ignore-initial=2 t1 t2 > /dev/null 2>&1; then
+      if cmp --ignore-initial=1 t1 t2 > /dev/null 2>&1; then
+        :
+      else
+        gcc_cv_prog_cmp_skip='cmp --ignore-initial=16 $$f1 $$f2'
+      fi
     fi
+    rm t1 t2
   fi
-  rm t1 t2
-
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_prog_cmp_skip" >&5
 $as_echo "$gcc_cv_prog_cmp_skip" >&6; }
@@ -15832,4 +15850,3 @@  if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
-
diff --git a/configure.ac b/configure.ac
index a0b0917dd55..9eb4e7b682f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -112,11 +112,11 @@  extra_host_args=
 ### or a host dependent tool.  Then put it into the appropriate list
 ### (library or tools, host or target), doing a dependency sort.
 
-# Subdirs will be configured in the order listed in build_configdirs, 
+# Subdirs will be configured in the order listed in build_configdirs,
 # configdirs, or target_configdirs; see the serialization section below.
 
-# Dependency sorting is only needed when *configuration* must be done in 
-# a particular order.  In all cases a dependency should be specified in 
+# Dependency sorting is only needed when *configuration* must be done in
+# a particular order.  In all cases a dependency should be specified in
 # the Makefile, whether or not it's implicitly specified here.
 
 # Double entries in build_configdirs, configdirs, or target_configdirs may
@@ -208,7 +208,7 @@  if test x"${host}" = x"${target}" ; then
   is_cross_compiler=no
 else
   is_cross_compiler=yes
-fi	
+fi
 
 # Find the build and target subdir names.
 GCC_TOPLEV_SUBDIRS
@@ -246,7 +246,7 @@  if test x$with_system_zlib = xyes ; then
   noconfigdirs="$noconfigdirs zlib"
 fi
 
-# some tools are so dependent upon X11 that if we're not building with X, 
+# some tools are so dependent upon X11 that if we're not building with X,
 # it's not even worth trying to configure, much less build, that tool.
 
 case ${with_x} in
@@ -254,7 +254,7 @@  case ${with_x} in
   no)
     skipdirs="${skipdirs} tk itcl libgui"
     # We won't be able to build gdbtk without X.
-    enable_gdbtk=no 
+    enable_gdbtk=no
     ;;
   *)  echo "*** bad value \"${with_x}\" for -with-x flag; ignored" 1>&2 ;;
 esac
@@ -410,7 +410,7 @@  esac
 # Only spaces may be used in this macro; not newlines or tabs.
 unsupported_languages=
 
-# Remove more programs from consideration, based on the host or 
+# Remove more programs from consideration, based on the host or
 # target this usually means that a port of the program doesn't
 # exist yet.
 
@@ -418,6 +418,9 @@  case "${host}" in
   i[[3456789]]86-*-msdosdjgpp*)
     noconfigdirs="$noconfigdirs tcl tk itcl"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs tk itcl libgui gdb"
+    ;;
 esac
 
 
@@ -509,7 +512,7 @@  if test x$enable_libgomp = x ; then
 	;;
     *-*-solaris2* | *-*-hpux11*)
 	;;
-    *-*-darwin* | *-*-aix*)
+    *-*-darwin* | *-*-aix* | *-*-haiku*)
 	;;
     nvptx*-*-*)
 	;;
@@ -692,6 +695,9 @@  case "${target}" in
   *-*-darwin*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs ${libgcj}"
+    ;;
   *-*-netware*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
@@ -870,12 +876,15 @@  case "${target}" in
   *-*-freebsd*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+    ;;
   *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu | *-*-kopensolaris*-gnu)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
   *-*-lynxos*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
-    ;; 
+    ;;
   *-*-mingw*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
     ;;
@@ -931,6 +940,9 @@  case "${target}" in
       with_gmp=/usr/local
     fi
     ;;
+  *-*-haiku*)
+    noconfigdirs="$noconfigdirs gdb target-libiberty"
+    ;;
   *-*-kaos*)
     # Remove unsupported stuff on all kaOS configurations.
     noconfigdirs="$noconfigdirs target-libgloss"
@@ -1213,7 +1225,7 @@  case "${host}" in
   hppa*-hp-hpux*)
     host_makefile_frag="config/mh-pa"
     ;;
-  hppa*-*)	
+  hppa*-*)
     host_makefile_frag="config/mh-pa"
     ;;
   *-*-darwin*)
@@ -1871,7 +1883,7 @@  if test -d ${srcdir}/gcc; then
       # an apparent bug in bash 1.12 on linux.
       ${srcdir}/gcc/[[*]]/config-lang.in) ;;
       *)
-        # From the config-lang.in, get $language, $target_libs, 
+        # From the config-lang.in, get $language, $target_libs,
         # $lang_dirs, $boot_language, and $build_by_default
         language=
         target_libs=
@@ -2104,7 +2116,7 @@  AC_ARG_WITH([target-bdw-gc-include],
 AC_ARG_WITH([target-bdw-gc-lib],
 [AS_HELP_STRING([--with-target-bdw-gc-lib=PATHLIST],
 		[specify directories for installed bdw-gc library])])
-		  
+
 case ,${enable_languages},:${enable_objc_gc} in *,objc,*:yes|*,objc,*:auto)
   AC_MSG_CHECKING([for bdw garbage collector])
   if test "x$with_target_bdw_gc$with_target_bdw_gc_include$with_target_bdw_gc_lib" = x; then
@@ -2183,7 +2195,7 @@  done
 build_configdirs_all="$build_configdirs"
 build_configdirs=
 for i in ${build_configdirs_all} ; do
-  j=`echo $i | sed -e s/build-//g` 
+  j=`echo $i | sed -e s/build-//g`
   if test -f ${srcdir}/$j/configure ; then
     build_configdirs="${build_configdirs} $i"
   fi
@@ -2200,7 +2212,7 @@  done
 target_configdirs_all="$target_configdirs"
 target_configdirs=
 for i in ${target_configdirs_all} ; do
-  j=`echo $i | sed -e s/target-//g` 
+  j=`echo $i | sed -e s/target-//g`
   if test -f ${srcdir}/$j/configure ; then
     target_configdirs="${target_configdirs} $i"
   fi
@@ -2286,7 +2298,7 @@  ACX_TOOL_DIRS
 
 copy_dirs=
 
-AC_ARG_WITH([build-sysroot], 
+AC_ARG_WITH([build-sysroot],
   [AS_HELP_STRING([--with-build-sysroot=SYSROOT],
 		  [use sysroot as the system root during the build])],
   [if test x"$withval" != x ; then
@@ -2385,11 +2397,11 @@  fi
 # This is done by determining whether or not the appropriate directory
 # is available, and by checking whether or not specific configurations
 # have requested that this magic not happen.
-# 
-# The command line options always override the explicit settings in 
+#
+# The command line options always override the explicit settings in
 # configure.ac, and the settings in configure.ac override this magic.
 #
-# If the default for a toolchain is to use GNU as and ld, and you don't 
+# If the default for a toolchain is to use GNU as and ld, and you don't
 # want to do that, then you should use the --without-gnu-as and
 # --without-gnu-ld options for the configure script.  Similarly, if
 # the default is to use the included zlib and you don't want to do that,
@@ -2496,7 +2508,7 @@  case "${target}" in
     target_makefile_frag="config/mt-gnu"
     ;;
   *-*-aix4.[[3456789]]* | *-*-aix[[56789]].*)
-    # nm and ar from AIX 4.3 and above require -X32_64 flag to all ar and nm 
+    # nm and ar from AIX 4.3 and above require -X32_64 flag to all ar and nm
     # commands to handle both 32-bit and 64-bit objects.  These flags are
     # harmless if we're using GNU nm or ar.
     extra_arflags_for_target=" -X32_64"
@@ -2566,7 +2578,7 @@  if test $? = 0 ; then
   if test -s conftest || test -s conftest.exe ; then
     we_are_ok=yes
   fi
-fi 
+fi
 case $we_are_ok in
   no)
     echo 1>&2 "*** The command '${CC} -o conftest ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} conftest.c' failed."
@@ -2981,7 +2993,7 @@  baseargs=`echo "x$baseargs" | sed -e 's/^x *//' -e 's,\\$,$$,g'`
 # --program-suffix have been applied to it.  Autoconf has already
 # doubled dollar signs and backslashes in program_transform_name; we want
 # the backslashes un-doubled, and then the entire thing wrapped in single
-# quotes, because this will be expanded first by make and then by the shell. 
+# quotes, because this will be expanded first by make and then by the shell.
 # Also, because we want to override the logic in subdir configure scripts to
 # choose program_transform_name, replace any s,x,x, with s,y,y,.
 sed -e "s,\\\\\\\\,\\\\,g; s,','\\\\'',g; s/s,x,x,/s,y,y,/" <<EOF_SED > conftestsed.out
@@ -3050,7 +3062,7 @@  case "$target:$have_compiler:$host:$target:$enable_multilib" in
       if test -s conftest || test -s conftest.exe ; then
 	dev64=yes
       fi
-    fi 
+    fi
     rm -f conftest*
     if test x${dev64} != xyes ; then
       AC_MSG_ERROR([I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.])
@@ -3327,7 +3339,7 @@  AC_SUBST(CFLAGS)
 AC_SUBST(CXXFLAGS)
 
 # Target tools.
-AC_ARG_WITH([build-time-tools], 
+AC_ARG_WITH([build-time-tools],
   [AS_HELP_STRING([--with-build-time-tools=PATH],
 		  [use given path to find target tools during the build])],
   [case x"$withval" in
@@ -3431,7 +3443,7 @@  if test "$USE_MAINTAINER_MODE" = yes; then
 else
   MAINTAINER_MODE_TRUE='#'
   MAINTAINER_MODE_FALSE=
-fi	
+fi
 MAINT=$MAINTAINER_MODE_TRUE
 AC_SUBST(MAINT)dnl
 
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 78e84c2b864..4d0fa3f5074 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -174,7 +174,7 @@ 
 #			the --with-sysroot configure option or the
 #			--sysroot command line option is used this
 #			will be relative to the sysroot.
-# target_type_format_char 
+# target_type_format_char
 # 			The default character to be used for formatting
 #			the attribute in a
 #			.type symbol_name, ${t_t_f_c}<property>
@@ -759,6 +759,18 @@  case ${target} in
 *-*-fuchsia*)
   native_system_header_dir=/include
   ;;
+*-*-haiku*)
+  # This is the generic ELF configuration of Haiku.  Later
+  # machine-specific sections may refine and add to this
+  # configuration.
+  gas=yes
+  gnu_ld=yes
+  tmake_file="t-slibgcc"
+  case ${enable_threads} in
+    "" | yes | posix) thread_file='posix' ;;
+  esac
+  default_use_cxa_atexit=yes
+  ;;
 *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
   extra_options="$extra_options gnu-user.opt"
   gas=yes
@@ -1135,6 +1147,16 @@  arm*-*-netbsdelf*)
 	tmake_file="${tmake_file} arm/t-arm"
 	target_cpu_cname="arm6"
 	;;
+arm*-*-haiku*)
+    tmake_file="${tmake_file} t-haiku arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-haiku"
+    tm_file="dbxelf.h elfos.h haiku.h arm/elf.h arm/bpabi.h arm/haiku.h haiku-stdint.h"
+    # The BPABI long long divmod functions return a 128-bit value in
+    # registers r0-r3.  Correctly modeling that requires the use of
+    # TImode.
+    need_64bit_hwint=yes
+    default_use_cxa_atexit=yes
+    tm_file="${tm_file} arm/aout.h arm/arm.h"
+    ;;
 arm*-*-linux-*)			# ARM GNU/Linux with ELF
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
 	extra_options="${extra_options} linux-android.opt"
@@ -1527,6 +1549,14 @@  i[34567]86-*-freebsd*)
 x86_64-*-freebsd*)
 	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h ${fbsd_tm_file} i386/x86-64.h i386/freebsd.h i386/freebsd64.h"
 	;;
+i[34567]86-*-haiku*)
+    tmake_file="${tmake_file} t-haiku i386/t-crtpic"
+    tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h haiku.h i386/haiku.h haiku-stdint.h"
+    ;;
+x86_64-*-haiku*)
+    tmake_file="${tmake_file} t-haiku i386/t-haiku64"
+    tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h haiku.h i386/haiku64.h haiku-stdint.h"
+    ;;
 i[34567]86-*-netbsdelf*)
 	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h ${nbsd_tm_file} i386/netbsd-elf.h"
 	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
@@ -1995,6 +2025,13 @@  m68k-*-uclinux*)		# Motorola m68k/ColdFire running uClinux
  	tm_defines="${tm_defines} MOTOROLA=1"
 	tmake_file="m68k/t-floatlib m68k/t-uclinux m68k/t-mlibs"
 	;;
+m68k-*-haiku*)
+    default_m68k_cpu=68020
+    default_cf_cpu=5206
+    tmake_file="${tmake_file} m68k/t-m68kbare m68k/t-crtstuff t-haiku" #??
+    tm_file="${tm_file} dbxelf.h elfos.h haiku.h m68k/haiku.h"
+    tm_defines="${tm_defines} MOTOROLA=1"
+    ;;
 m68k-*-linux*)			# Motorola m68k's running GNU/Linux
 				# with ELF format using glibc 2
 				# aka the GNU/Linux C library 6.
@@ -2133,6 +2170,11 @@  mips*-mti-linux*)
 	gnu_ld=yes
 	gas=yes
 	;;
+mipsel-*-haiku*)
+    target_cpu_default="MASK_ABICALLS"
+    tm_file="elfos.h ${tm_file} haiku.h mips/haiku.h"
+    tmake_file="${tmake_file} mips/t-elf t-haiku"
+    ;;
 mips*-*-linux*)				# Linux MIPS, either endian.
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h"
 	extra_options="${extra_options} linux-android.opt"
@@ -2496,6 +2538,11 @@  powerpc-*-rtems*)
 	extra_options="${extra_options} rs6000/sysv4.opt rs6000/linux64.opt"
 	tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-rtems rs6000/t-ppccomm"
 	;;
+powerpc-*-haiku*)
+    tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-ppcos rs6000/t-ppccomm t-haiku"
+    tm_file="${tm_file} dbxelf.h elfos.h freebsd-spec.h rs6000/sysv4.h haiku.h rs6000/haiku.h"
+    extra_options="${extra_options} rs6000/sysv4.opt"
+    ;;
 powerpc*-*-linux*spe*)
 	tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h freebsd-spec.h powerpcspe/sysv4.h"
 	extra_options="${extra_options} powerpcspe/sysv4.opt"
diff --git a/gcc/config.host b/gcc/config.host
index c65569da2e9..80cb5d971b5 100644
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -61,7 +61,7 @@ 
 #			different from the default "liblto_plugin.so".
 
 # When setting any of these variables, check to see if a corresponding
-# variable is present in config.build; if so, you will likely want to 
+# variable is present in config.build; if so, you will likely want to
 # set it in both places.
 
 # Default settings.
@@ -107,7 +107,7 @@  case ${host} in
 	;;
     esac
     ;;
-  arm*-*-freebsd* | arm*-*-linux* | arm*-*-fuchsia*)
+  arm*-*-freebsd* | arm*-*-haiku* | arm*-*-linux* | arm*-*-fuchsia*)
     case ${target} in
       arm*-*-*)
 	host_extra_gcc_objs="driver-arm.o"
@@ -133,9 +133,11 @@  case ${host} in
 	;;
     esac
     ;;
-  mips*-*-linux*)
+  mips*-*-linux* \
+  | mips*-*-haiku*)
     case ${target} in
-      mips*-*-linux*)
+      mips*-*-linux* \
+      | mips*-*-haiku*)
 	host_extra_gcc_objs="driver-native.o"
 	host_xmake_file="${host_xmake_file} mips/x-native"
       ;;
diff --git a/gcc/config/arm/haiku.h b/gcc/config/arm/haiku.h
new file mode 100644
index 00000000000..f0c0d63264c
--- /dev/null
+++ b/gcc/config/arm/haiku.h
@@ -0,0 +1,80 @@ 
+/*	Definitions for ARM running Haiku systems using ELF
+	Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+	2005 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.  */
+
+/* Unsigned chars produces much better code than signed.  */
+#define DEFAULT_SIGNED_CHAR  0
+
+#undef  TARGET_DEFAULT_FLOAT_ABI
+#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
+
+/* We default to the "aapcs-linux" ABI so that enums are int-sized by
+   default.  */
+#undef  ARM_DEFAULT_ABI
+#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
+
+/* bpabi.h sets FPUTYPE_DEFAULT to VFP */
+
+#undef  MULTILIB_DEFAULTS
+#define MULTILIB_DEFAULTS \
+  { "marm", "mlittle-endian", "msoft-float", "mno-thumb-interwork" }
+
+/* Default is set by bpabi.h */
+/*
+#undef TARGET_DEFAULT
+*/
+
+#undef SUBTARGET_CPU_DEFAULT
+#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+
+/* Now we define the strings used to build the spec file.  */
+/* interestingly, bpabi defines __GXX_TYPEINFO_EQUALITY_INLINE=0 too as we do. */
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()		\
+  do									\
+    {									\
+      builtin_define ("__HAIKU__");					\
+      builtin_define ("__ARM__");					\
+      builtin_define ("__arm__");					\
+      builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+      builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+      builtin_define ("__STDC_ISO_10646__=201103L"); \
+      builtin_assert ("system=haiku");					\
+      /* Haiku apparently doesn't support merging of symbols across shared \
+		 object boundaries. Hence we need to explicitly specify that \
+         type_infos are not merged, so that they get compared by name \
+         instead of by pointer. */ \
+      builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \
+      /*builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); done in bpabi: */\
+      TARGET_BPABI_CPP_BUILTINS();					\
+    }									\
+  while (0)
+
+/* Use the default LIBGCC_SPEC, not the empty version in haiku.h, as we
+   do not use multilib (needed ??).  */
+#undef LIBGCC_SPEC
+
+/* If ELF is the default format, we should not use /lib/elf.  */
+
+#undef	LINK_SPEC
+#define LINK_SPEC "%{!o*:-o %b} -m armelf %{!r:-shared} %{nostart:-e 0} %{shared:-e 0} %{!shared: %{!nostart: -no-undefined}}\
+  %{mbig-endian:-EB} %{mlittle-endian:-EL} -X"
+
diff --git a/gcc/config/arm/t-haiku b/gcc/config/arm/t-haiku
new file mode 100644
index 00000000000..3f7f488fe21
--- /dev/null
+++ b/gcc/config/arm/t-haiku
@@ -0,0 +1,21 @@ 
+# build multilib for soft float and VFP 
+# (unsure about how it should be done...)
+# mix from t-symbian & t-wince-pe
+
+#LIB1ASMSRC = arm/lib1funcs.asm
+#LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX
+
+
+#MULTILIB_OPTIONS    += mhard-float
+#MULTILIB_DIRNAMES   += fpu
+
+MULTILIB_OPTIONS    += msoft-float
+MULTILIB_DIRNAMES   += fpu soft
+MULTILIB_EXCEPTIONS += *mthumb/*mhard-float*
+
+MULTILIB_OPTIONS    += mfloat-abi=softfp
+MULTILIB_DIRNAMES   += softfp
+
+#LIBGCC = stmp-multilib
+#INSTALL_LIBGCC = install-multilib
+#TARGET_LIBGCC2_CFLAGS = 
diff --git a/gcc/config/haiku-spec.h b/gcc/config/haiku-spec.h
new file mode 100644
index 00000000000..5ca898509e1
--- /dev/null
+++ b/gcc/config/haiku-spec.h
@@ -0,0 +1,38 @@ 
+#define HAIKU_TARGET_OS_CPP_BUILTINS()							\
+  do															\
+    {															\
+	builtin_define ("__HAIKU__");								\
+	builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+    builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+    builtin_assert ("system=haiku");							\
+	/* Haiku apparently doesn't support merging of symbols across shared \
+	 object boundaries. Hence we need to explicitly specify that \
+	 type_infos are not merged, so that they get compared by name \
+	 instead of by pointer. */ 									\
+	builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); 			\
+	HAIKU_TARGET_CPU_CPP_BUILTINS();							\
+    }															\
+  while (0)
+
+/* Define the default Haiku-specific per-CPU hook code.  */
+#define HAIKU_TARGET_CPU_CPP_BUILTINS() do {} while (0)
+
+/* Provide a CPP_SPEC appropriate for Haiku.  We just deal with the GCC 
+   option `-posix', and PIC issues.  */
+
+#define HAIKU_CPP_SPEC "					\
+  %(cpp_cpu)								\
+  %(cpp_arch)								\
+  %{posix:-D_POSIX_SOURCE}"
+
+#define HAIKU_STARTFILE_SPEC 				\
+  "crti.o%s crtbeginS.o%s %{!shared:%{!nostart:start_dyn.o%s}} init_term_dyn.o%s"
+
+#define HAIKU_ENDFILE_SPEC 					\
+  "crtendS.o%s crtn.o%s"
+
+#define HAIKU_LIB_SPEC 						\
+  "-lroot"
+
+#define HAIKU_DYNAMIC_LINKER				\
+  "/system/runtime_loader"
diff --git a/gcc/config/haiku-stdint.h b/gcc/config/haiku-stdint.h
new file mode 100644
index 00000000000..19f141296a6
--- /dev/null
+++ b/gcc/config/haiku-stdint.h
@@ -0,0 +1,55 @@ 
+/* Definitions for <stdint.h> types on Haiku.
+   Copyright (C) 2014 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.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+#define SIG_ATOMIC_TYPE "int"
+
+#define INT8_TYPE "signed char"
+#define INT16_TYPE "short int"
+#define INT32_TYPE "int"
+#define INT64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
+#define UINT8_TYPE "unsigned char"
+#define UINT16_TYPE "short unsigned int"
+#define UINT32_TYPE "unsigned int"
+#define UINT64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
+
+#define INT_LEAST8_TYPE "signed char"
+#define INT_LEAST16_TYPE "short int"
+#define INT_LEAST32_TYPE "int"
+#define INT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
+#define UINT_LEAST8_TYPE "unsigned char"
+#define UINT_LEAST16_TYPE "short unsigned int"
+#define UINT_LEAST32_TYPE "unsigned int"
+#define UINT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
+
+#define INT_FAST8_TYPE "int"
+#define INT_FAST16_TYPE "int"
+#define INT_FAST32_TYPE "int"
+#define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
+#define UINT_FAST8_TYPE "unsigned int"
+#define UINT_FAST16_TYPE "unsigned int"
+#define UINT_FAST32_TYPE "unsigned int"
+#define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
+
+#define INTPTR_TYPE "long int"
+#define UINTPTR_TYPE "long unsigned int"
diff --git a/gcc/config/haiku.h b/gcc/config/haiku.h
new file mode 100644
index 00000000000..e3a9c7e8210
--- /dev/null
+++ b/gcc/config/haiku.h
@@ -0,0 +1,217 @@ 
+/* Definitions of target machine for GCC.
+   Common Haiku definitions for all architectures.
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
+   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.  */
+
+
+/* Change debugging to Dwarf2.  */
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
+
+#undef MCOUNT_NAME
+#define MCOUNT_NAME "_mcount"
+
+#define TARGET_DECLSPEC 1
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+/* 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 \
+  "%{fpic|fPIC|fpie|fPIE|fno-pic|fno-PIC|fno-pie|fno-PIE:;:-fPIC} \
+   %{!Wmultichar: -Wno-multichar} %(cc1_cpu) %{profile:-p}"
+
+#undef CC1PLUS_SPEC
+#define CC1PLUS_SPEC "%{!Wctor-dtor-privacy:-Wno-ctor-dtor-privacy}"
+
+/* LIB_SPEC for Haiku */
+#undef LIB_SPEC
+#define LIB_SPEC "-lroot"
+
+/* Use --as-needed -lgcc_s for eh support.  */
+#ifdef HAVE_LD_AS_NEEDED
+#define USE_LD_AS_NEEDED 1
+#endif
+
+#undef  STARTFILE_SPEC
+#define STARTFILE_SPEC "crti.o%s crtbeginS.o%s %{!shared:%{!nostart:start_dyn.o%s}} init_term_dyn.o%s"
+
+#undef  ENDFILE_SPEC
+#define ENDFILE_SPEC "crtendS.o%s crtn.o%s"
+
+/* Every program on Haiku links against libroot which contains the pthread
+   routines, so there's no need to explicitly call out when doing threaded
+   work.  */
+#undef GOMP_SELF_SPECS
+#define GOMP_SELF_SPECS ""
+#undef GTM_SELF_SPECS
+#define GTM_SELF_SPECS ""
+
+#ifdef HYBRID_SECONDARY
+/* For a secondary compiler on a hybrid system, use alternative search paths.*/
+#define INCLUDE_DEFAULTS \
+{ \
+    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GCC_INCLUDE_DIR, "GCC", 0, 0, 0, 0 }, \
+    { FIXED_INCLUDE_DIR, "GCC", 0, 0, 0, 0 }, \
+    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0 }, \
+    { "/boot/system/non-packaged/develop/headers/" HYBRID_SECONDARY, 0, 0, 0, 1, 0 }, \
+    { "/boot/system/develop/headers/os", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/app", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/device", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/drivers", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/game", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/interface", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/kernel", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/locale", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/mail", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/media", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/midi", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/midi2", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/net", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/opengl", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/storage", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/support", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/translation", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/graphics", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/input_server", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/mail_daemon", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/registrar", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/screen_saver", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/tracker", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/Deskbar", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/NetPositive", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/Tracker", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/3rdparty", 0, 0, 0, 1, 0 }, \
+    { "/boot/system/develop/headers/bsd", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/glibc", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/gnu", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/posix", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/" HYBRID_SECONDARY, 0, 0, 0, 1, 0 }, \
+        /* Hybrid secondary folders for os kits not in base haiku package */\
+    { "/boot/system/develop/headers/" HYBRID_SECONDARY "/os", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/" HYBRID_SECONDARY "/os/opengl", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers", 0, 0, 0, 1, 0 }, \
+    { 0, 0, 0, 0, 0, 0 } \
+}
+#else /* HYBRID_SECONDARY */
+/* For both native and cross compiler, use standard Haiku include file
+   search paths.
+   For a cross compiler, it is expected that an appropriate sysroot has
+   been configured (e.g. /boot/system/develop/cross/x86) which will
+   be appended to each search folder given below. */
+#define INCLUDE_DEFAULTS \
+{ \
+    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, 0, 0 }, \
+    { GCC_INCLUDE_DIR, "GCC", 0, 0, 0, 0 }, \
+    { FIXED_INCLUDE_DIR, "GCC", 0, 0, 0, 0 }, \
+    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0 }, \
+    { "/boot/system/non-packaged/develop/headers", 0, 0, 0, 1, 0 }, \
+    { "/boot/system/develop/headers/os", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/app", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/device", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/drivers", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/game", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/interface", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/kernel", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/locale", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/mail", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/media", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/midi", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/midi2", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/net", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/opengl", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/storage", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/support", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/translation", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/graphics", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/input_server", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/mail_daemon", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/registrar", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/screen_saver", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/add-ons/tracker", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/Deskbar", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/NetPositive", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/os/be_apps/Tracker", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/3rdparty", 0, 0, 0, 1, 0 }, \
+    	/* TODO: To be removed when libtiff has been outsourced. */\
+    { "/boot/system/develop/headers/bsd", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/glibc", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/gnu", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers/posix", 0, 0, 1, 1, 0 }, \
+    { "/boot/system/develop/headers", 0, 0, 0, 1, 0 }, \
+    { 0, 0, 0, 0, 0, 0 } \
+}
+#endif /* HYBRID_SECONDARY */
+
+/* Whee.  LIBRARY_PATH is Be's LD_LIBRARY_PATH, which of course will
+   cause nasty problems if we override it.  */
+#define LIBRARY_PATH_ENV        "BELIBRARIES"
+
+/* Set STANDARD_STARTFILE_PREFIX_1 set to "/boot/system/develop/lib/", or the
+   respective secondary architecture path. The user specific paths are set via
+   LIBRARY_PATH_ENV. */
+#undef STANDARD_STARTFILE_PREFIX_1
+#undef STANDARD_STARTFILE_PREFIX_2
+#undef MD_STARTFILE_PREFIX
+#undef STARTFILE_PREFIX_SPEC
+#ifdef HYBRID_SECONDARY
+/* For a secondary compiler on a hybrid system, use alternative search paths.*/
+#define STANDARD_STARTFILE_PREFIX_1 \
+  "/boot/system/non-packaged/develop/lib/" HYBRID_SECONDARY "/"
+#define STANDARD_STARTFILE_PREFIX_2 \
+  "/boot/system/develop/lib/" HYBRID_SECONDARY "/"
+#else /* HYBRID_SECONDARY */
+#define STANDARD_STARTFILE_PREFIX_1   "/boot/system/non-packaged/develop/lib/"
+#define STANDARD_STARTFILE_PREFIX_2   "/boot/system/develop/lib/"
+#endif /* HYBRID_SECONDARY */
+
+/* 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
+
+/* Only allow -lssp for SSP, as -lssp_nonshared is problematic in Haiku */
+#ifndef TARGET_LIBC_PROVIDES_SSP
+#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp}"
+#endif
+
+/* Do not use JCR_SECTION_NAME default definition for Haiku */
+#define TARGET_NO_JCR_SECTION_NAME 1
+
+/* Do not use TM clone registry in Haiku for now */
+#define USE_TM_CLONE_REGISTRY 0
diff --git a/gcc/config/i386/haiku.h b/gcc/config/i386/haiku.h
new file mode 100644
index 00000000000..3379e19f546
--- /dev/null
+++ b/gcc/config/i386/haiku.h
@@ -0,0 +1,77 @@ 
+/* 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.  */
+
+
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START " #"
+
+/* 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 DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) \
+  (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
+
+#define TARGET_OS_CPP_BUILTINS()					\
+  do									\
+    {									\
+	builtin_define ("__HAIKU__");					\
+	builtin_define ("__INTEL__");					\
+	builtin_define ("_X86_");					\
+	builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+	builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+    builtin_define ("__STDC_ISO_10646__=201103L"); \
+	builtin_assert ("system=haiku");					\
+    }									\
+  while (0)
+
+/* Provide a LINK_SPEC appropriate for Haiku.  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 "-m elf_i386_haiku %{!r:-shared} %{nostart:-e 0} %{shared:-e 0} %{!shared: %{!nostart: -no-undefined}}"
+
+/* 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) \
+  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))
+#endif
diff --git a/gcc/config/i386/haiku64.h b/gcc/config/i386/haiku64.h
new file mode 100644
index 00000000000..8c434983384
--- /dev/null
+++ b/gcc/config/i386/haiku64.h
@@ -0,0 +1,135 @@ 
+/* Definitions for AMD x86_64 running Haiku with ELF format.
+   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.  */
+
+
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START " #"
+
+/* The SVR4 ABI for the i386 says that records and unions are returned
+ * in memory. For 64-bit compilation this definition is ignored, however
+ * it is necessary for correct 32-bit code generation.
+ */
+#undef DEFAULT_PCC_STRUCT_RETURN
+#define DEFAULT_PCC_STRUCT_RETURN 1
+
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) \
+  (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
+
+#define TARGET_OS_CPP_BUILTINS()					\
+  do									\
+    {									\
+      builtin_define ("__HAIKU__");					\
+      if (!TARGET_64BIT)						\
+        {								\
+          builtin_define ("__INTEL__");					\
+          builtin_define ("__X86__");					\
+        }								\
+      builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+      builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+      builtin_define ("__STDC_ISO_10646__=201103L");			\
+      builtin_assert ("system=haiku");					\
+    }									\
+  while (0)
+
+/* Provide a LINK_SPEC appropriate for Haiku.  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 TARGET_64BIT_DEFAULT
+#define SPEC_32 "m32"
+#define SPEC_64 "!m32"
+#else
+#define SPEC_32 "!m64"
+#define SPEC_64 "m64"
+#endif
+
+#undef	LINK_SPEC
+#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64_haiku} %{" SPEC_32 ":-m elf_i386_haiku} \
+	%{!r:-shared} %{nostart:-e 0} %{shared:-e 0} %{!shared: %{!nostart: -no-undefined}}"
+
+/* 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 x86_output_aligned_bss to implement this macro.  */
+
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+  x86_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+
+/* 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));	\
+        /* Make sure that we have at least 8 byte alignment if > 8 byte	\
+           alignment is preferred.  */					\
+        if ((LOG) > 3							\
+            && (1 << (LOG)) > ((MAX_SKIP) + 1)				\
+            && (MAX_SKIP) >= 7)						\
+          fputs ("\t.p2align 3\n", (FILE));				\
+      }									\
+    }									\
+  } while (0)
+#undef  ASM_OUTPUT_MAX_SKIP_PAD
+#define ASM_OUTPUT_MAX_SKIP_PAD(FILE, LOG, MAX_SKIP)			\
+  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));	\
+    }
+#endif
+
+
+/* Output assembler code to FILE to call the profiler.  */
+#define NO_PROFILE_COUNTERS 1
+
+#undef ASM_SPEC
+#define ASM_SPEC "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \
+ %{Wa,*:%*} %{" SPEC_32 ":--32} %{" SPEC_64 ":--64}"
+
+#undef  ASM_OUTPUT_ALIGNED_DECL_COMMON
+#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN)		\
+  x86_elf_aligned_decl_common (FILE, DECL, NAME, SIZE, ALIGN);
+
+
+/* i386 System V Release 4 uses DWARF debugging info.
+   x86-64 ABI specifies DWARF2.  */
+
+#define DWARF2_DEBUGGING_INFO 1
+#define DWARF2_UNWIND_INFO 1
+
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
+
+#undef TARGET_ASM_SELECT_SECTION
+#define TARGET_ASM_SELECT_SECTION  x86_64_elf_select_section
+
+#undef TARGET_ASM_UNIQUE_SECTION
+#define TARGET_ASM_UNIQUE_SECTION  x86_64_elf_unique_section
+
+#define USE_X86_64_FRAME_POINTER 1
diff --git a/gcc/config/i386/t-haiku64 b/gcc/config/i386/t-haiku64
new file mode 100644
index 00000000000..9c8f8e62e60
--- /dev/null
+++ b/gcc/config/i386/t-haiku64
@@ -0,0 +1,16 @@ 
+MULTILIB_OPTIONS = m32 
+MULTILIB_DIRNAMES = 32
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o
+
+# The pushl in CTOR initialization interferes with frame pointer elimination.
+# crtend*.o cannot be compiled without -fno-asynchronous-unwind-tables,
+# because then __FRAME_END__ might not be the last thing in .eh_frame
+# section.
+CRTSTUFF_T_CFLAGS = -fno-omit-frame-pointer -fno-asynchronous-unwind-tables
+
+# Compile libgcc2.a with pic.
+TARGET_LIBGCC2_CFLAGS = -fPIC
diff --git a/gcc/config/m68k/haiku.h b/gcc/config/m68k/haiku.h
new file mode 100644
index 00000000000..84ee17aca88
--- /dev/null
+++ b/gcc/config/m68k/haiku.h
@@ -0,0 +1,268 @@ 
+/* Definitions for Motorola 68k running Haiku
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007
+   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, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+/* Default target comes from config.gcc.  */
+
+#undef TARGET_DEFAULT
+#ifdef TARGET_CPU_DEFAULT
+#define TARGET_DEFAULT TARGET_CPU_DEFAULT
+#else
+#define TARGET_DEFAULT (MASK_BITFIELD|MASK_68881|MASK_68020)
+#endif
+
+/* for 68k machines this only needs to be TRUE for the 68000 */
+
+#undef STRICT_ALIGNMENT
+#define STRICT_ALIGNMENT 0
+
+/* Here are four prefixes that are used by asm_fprintf to
+   facilitate customization for alternate assembler syntaxes.
+   Machines with no likelihood of an alternate syntax need not
+   define these and need not use asm_fprintf.  */
+
+/* The prefix for register names.  Note that REGISTER_NAMES
+   is supposed to include this prefix. Also note that this is NOT an
+   fprintf format string, it is a literal string */
+
+#undef REGISTER_PREFIX
+#define REGISTER_PREFIX "%"
+
+/* The prefix for local (compiler generated) labels.
+   These labels will not appear in the symbol table.  */
+
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
+/* The prefix to add to user-visible assembler symbols.  */
+
+#undef USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX ""
+
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START "|"
+
+/* Target OS builtins.  */
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()					\
+  do									\
+    {									\
+	builtin_define ("__HAIKU__");					\
+	builtin_define ("__M68K__");					\
+	builtin_define_std ("mc68000");					\
+	builtin_define_std ("mc68020");					\
+	builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+	builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+    builtin_define ("__STDC_ISO_10646__=201103L"); \
+	builtin_assert ("system=haiku");				\
+    }									\
+  while (0)
+
+#define TARGET_OBJFMT_CPP_BUILTINS()		\
+  do						\
+    {						\
+	builtin_define ("__ELF__");		\
+    }						\
+  while (0)
+
+#undef CPP_SPEC
+#if TARGET_DEFAULT & MASK_68881
+#define CPP_SPEC \
+  "%{fPIC|fpic|fPIE|fpie:-D__PIC__ -D__pic__} %{!msoft-float:-D__HAVE_68881__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
+#else
+#define CPP_SPEC \
+  "%{fPIC|fpic|fPIE|fpie:-D__PIC__ -D__pic__} %{m68881:-D__HAVE_68881__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
+#endif
+
+/* We override the ASM_SPEC from svr4.h because we must pass -m68040 down
+   to the assembler.  */
+#undef ASM_SPEC
+#define ASM_SPEC \
+  "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
+%{m68040} %{m68060:-m68040}"
+
+/* Provide a LINK_SPEC appropriate for Haiku.  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_m68k_haiku -shared -no-undefined %{nostart:-e 0}"*/
+#define LINK_SPEC "%{!o*:-o %b} -m m68kelf %{!r:-shared} %{nostart:-e 0} %{shared:-e 0} %{!shared: %{!nostart: -no-undefined}}"
+
+/* XXX: not sure for the rest there... */
+
+/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
+   keep switch tables in the text section.  */
+
+#define JUMP_TABLES_IN_TEXT_SECTION 1
+
+/* This is how to output an assembler line that says to advance the
+   location counter to a multiple of 2**LOG bytes.  */
+
+/* Use the default action for outputting the case label.  */
+#undef ASM_OUTPUT_CASE_LABEL
+#define ASM_RETURN_CASE_JUMP				\
+  do {							\
+    if (TARGET_COLDFIRE)				\
+      {							\
+	if (ADDRESS_REG_P (operands[0]))		\
+	  return "jmp %%pc@(2,%0:l)";			\
+	else						\
+	  return "ext%.l %0\n\tjmp %%pc@(2,%0:l)";	\
+      }							\
+    else						\
+      return "jmp %%pc@(2,%0:w)";			\
+  } while (0)
+
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG)				\
+  if ((LOG) > 0)						\
+    fprintf ((FILE), "%s%u\n", ALIGN_ASM_OP, 1 << (LOG));
+
+/* If defined, a C expression whose value is a string containing the
+   assembler operation to identify the following data as uninitialized global
+   data.  */
+
+#define BSS_SECTION_ASM_OP "\t.section\t.bss"
+
+/* 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)
+
+/* Output assembler code to FILE to increment profiler label # LABELNO
+   for profiling a function entry.  */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+{									\
+  asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO));		\
+  if (flag_pic)								\
+    fprintf (FILE, "\tbsr.l _mcount@PLTPC\n");				\
+  else									\
+    fprintf (FILE, "\tjbsr _mcount\n");					\
+}
+
+/* How to renumber registers for dbx and gdb.
+   On the Sun-3, the floating point registers have numbers
+   18 to 25, not 16 to 23 as they do in the compiler.  */
+
+#define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)
+
+/* Do not break .stabs pseudos into continuations.  */
+
+#define DBX_CONTIN_LENGTH 0
+
+/* 1 if N is a possible register number for a function value.  For
+   m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
+   pointer, or floating types, respectively.  Reject fp0 if not using
+   a 68881 coprocessor.  */
+
+#undef FUNCTION_VALUE_REGNO_P
+#define FUNCTION_VALUE_REGNO_P(N) \
+  ((N) == 0 || (N) == 8 || (TARGET_68881 && (N) == 16))
+
+/* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
+   more than one register.  */
+
+#undef NEEDS_UNTYPED_CALL
+#define NEEDS_UNTYPED_CALL 1
+
+/* Define how to generate (in the callee) the output value of a
+   function and how to find (in the caller) the value returned by a
+   function.  VALTYPE is the data type of the value (as a tree).  If
+   the precise function being called is known, FUNC is its
+   FUNCTION_DECL; otherwise, FUNC is 0.  For m68k/SVR4 generate the
+   result in d0, a0, or fp0 as appropriate.  */
+
+#undef FUNCTION_VALUE
+#define FUNCTION_VALUE(VALTYPE, FUNC)					\
+  (TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_68881			\
+   ? gen_rtx_REG (TYPE_MODE (VALTYPE), 16)				\
+   : (POINTER_TYPE_P (VALTYPE)						\
+      ? gen_rtx_REG (TYPE_MODE (VALTYPE), 8)				\
+      : gen_rtx_REG (TYPE_MODE (VALTYPE), 0)))
+
+/* For compatibility with the large body of existing code which does
+   not always properly declare external functions returning pointer
+   types, the m68k/SVR4 convention is to copy the value returned for
+   pointer functions from a0 to d0 in the function epilogue, so that
+   callers that have neglected to properly declare the callee can
+   still find the correct return value.  */
+
+#define FUNCTION_EXTRA_EPILOGUE(FILE, SIZE)				\
+do {									\
+  if (current_function_returns_pointer					\
+      && ! find_equiv_reg (0, get_last_insn (), 0, 0, 0, 8, Pmode))	\
+    asm_fprintf (FILE, "\tmove.l %Ra0,%Rd0\n");				\
+} while (0);
+
+/* Define how to find the value returned by a library function
+   assuming the value has mode MODE.
+   For m68k/SVR4 look for integer values in d0, pointer values in d0
+   (returned in both d0 and a0), and floating values in fp0.  */
+
+#undef LIBCALL_VALUE
+#define LIBCALL_VALUE(MODE)						\
+  ((((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)		\
+    && TARGET_68881)							\
+   ? gen_rtx_REG ((MODE), 16)						\
+   : gen_rtx_REG ((MODE), 0))
+
+/* For m68k SVR4, structures are returned using the reentrant
+   technique.  */
+#undef PCC_STATIC_STRUCT_RETURN
+#define DEFAULT_PCC_STRUCT_RETURN 0
+
+/* Finalize the trampoline by flushing the insn cache.  */
+
+#undef FINALIZE_TRAMPOLINE
+#define FINALIZE_TRAMPOLINE(TRAMP)					\
+  emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),	\
+		     LCT_NORMAL, VOIDmode, 2, TRAMP, Pmode,			\
+		     plus_constant (Pmode, TRAMP, TRAMPOLINE_SIZE), \
+		     Pmode);
+
+/* Clear the instruction cache from `beg' to `end'.  This makes an
+   inline system call to SYS_cacheflush.  The arguments are as
+   follows:
+
+	cacheflush (addr, scope, cache, len)
+
+   addr	  - the start address for the flush
+   scope  - the scope of the flush (see the cpush insn)
+   cache  - which cache to flush (see the cpush insn)
+   len    - a factor relating to the number of flushes to perform:
+	    len/16 lines, or len/4096 pages.  */
+
+#define CLEAR_INSN_CACHE(BEG, END)					\
+{									\
+extern void clear_caches(void *address, int length, unsigned long flags); \
+  void *ptr = BEG;							\
+  int len = (END - BEG + 32);						\
+  clear_caches(ptr, len, 0x0005);					\
+}
diff --git a/gcc/config/mips/haiku.h b/gcc/config/mips/haiku.h
new file mode 100644
index 00000000000..f6d2efb9797
--- /dev/null
+++ b/gcc/config/mips/haiku.h
@@ -0,0 +1,44 @@ 
+/* Definitions for MIPS 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.  */
+
+
+#define TARGET_OS_CPP_BUILTINS()					\
+  do									\
+    {									\
+	builtin_define ("__HAIKU__");					\
+	builtin_define ("__MIPS__");					\
+	builtin_define ("__MIPSEL__");					\
+	builtin_define ("_MIPSEL_");					\
+	builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+	builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+    builtin_define ("__STDC_ISO_10646__=201103L"); \
+	builtin_assert ("system=haiku");					\
+	if (flag_pic)							\
+	  {								\
+	    builtin_define ("__PIC__");					\
+	    builtin_define ("__pic__");					\
+	  }								\
+    }									\
+  while (0)
+
+#undef	LINK_SPEC
+#define LINK_SPEC "%{!o*:-o %b} -m elf_mipsel_haiku %{!r:-shared} %{nostart:-e 0}"
+
diff --git a/gcc/config/rs6000/haiku.h b/gcc/config/rs6000/haiku.h
new file mode 100644
index 00000000000..4dff89e5c73
--- /dev/null
+++ b/gcc/config/rs6000/haiku.h
@@ -0,0 +1,56 @@ 
+/* Definitions for PowerPC running Haiku
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
+   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.  */
+
+
+/* long double is 128 bits wide; the documentation claims
+   LIBGCC2_LONG_DOUBLE_TYPE_SIZE to default to LONG_DOUBLE_TYPE_SIZE, but
+   it apparently does not */
+/*#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 128
+#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128*/
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()					\
+  do									\
+    {									\
+	builtin_define ("__HAIKU__");					\
+	builtin_define ("__POWERPC__");					\
+	builtin_define ("__powerpc__");					\
+	builtin_define ("__stdcall=__attribute__((__stdcall__))");	\
+	builtin_define ("__cdecl=__attribute__((__cdecl__))");		\
+    builtin_define ("__STDC_ISO_10646__=201103L"); \
+	builtin_assert ("system=haiku");					\
+	builtin_assert ("cpu=powerpc");					\
+	builtin_assert ("machine=powerpc");					\
+	TARGET_OS_SYSV_CPP_BUILTINS ();					\
+    }									\
+  while (0)
+
+/* Provide a LINK_SPEC appropriate for Haiku.  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 elf32ppchaiku %{!r:-shared} %{nostart:-e 0} %{shared:-e 0} %{!shared: %{!nostart: -no-undefined}}"
diff --git a/gcc/config/t-haiku b/gcc/config/t-haiku
new file mode 100644
index 00000000000..587d1fb01a5
--- /dev/null
+++ b/gcc/config/t-haiku
@@ -0,0 +1,4 @@ 
+# There are system headers elsewhere, but these are the ones that
+# we are most likely to want to apply any fixes to.
+NATIVE_SYSTEM_HEADER_DIR = /boot/system/develop/headers
+LIMITS_H_TEST = [ -f $(SYSTEM_HEADER_DIR)/posix/limits.h ]
\ No newline at end of file
diff --git a/gcc/configure b/gcc/configure
index 80ac4a3d478..cac7a920113 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -750,6 +750,7 @@  LDEXP_LIB
 EXTRA_GCC_LIBS
 GNAT_LIBEXC
 COLLECT2_LIBS
+build_math_library
 CXXDEPMODE
 DEPDIR
 am__leading_dot
@@ -7398,6 +7399,7 @@  else
 fi
 
 
+
 # Determine whether or not multilibs are enabled.
 # Check whether --enable-multilib was given.
 if test "${enable_multilib+set}" = set; then :
@@ -9403,6 +9405,15 @@  fi
 # UNSORTED
 # --------
 
+# Configure -lm usage for host tools that need it
+build_math_library="-lm"
+case $build in
+  *-*-haiku*)
+    # no separate math library needed
+    build_math_library=
+    ;;
+esac
+
 
 # These libraries may be used by collect2.
 # We may need a special search path to get them linked.
@@ -11704,7 +11715,7 @@  case ${enable_threads} in
     # default
     target_thread_file='single'
     ;;
-  aix | dce | lynx | mipssde | posix | rtems | \
+  aix | dce | haiku | lynx | mipssde | posix | rtems | \
   single | tpf | vxworks | win32)
     target_thread_file=${enable_threads}
     ;;
@@ -15551,8 +15562,6 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
 
     haiku*)
       # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
       ;;
 
     hpux*)
@@ -17664,8 +17673,9 @@  haiku*)
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
+  sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib'
+  sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib'
+  hardcode_into_libs=no
   ;;
 
 hpux9* | hpux10* | hpux11*)
@@ -18182,7 +18192,7 @@  else
   lt_cv_dlopen_libs=
 
   case $host_os in
-  beos*)
+  beos* | haiku*)
     lt_cv_dlopen="load_add_on"
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
diff --git a/libgcc/config.host b/libgcc/config.host
index 18cabaf24f6..6e81121eecf 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -235,6 +235,11 @@  case ${host} in
   tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia"
   extra_parts="crtbegin.o crtend.o"
   ;;
+*-*-haiku*)
+  tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-haiku t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver"
+  tmake_file="$tmake_file t-slibgcc-libgcc t-slibgcc-nolc-override"
+  extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+  ;;
 *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
   tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
   extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
@@ -418,6 +423,13 @@  arm*-*-fuchsia*)
 	tm_file="${tm_file} arm/bpabi-lib.h"
 	unwind_header=config/arm/unwind-arm.h
 	;;
+arm*-*-haiku*)
+    tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix arm/t-elf"
+    tmake_file="${tmake_file} arm/t-bpabi"
+    tm_file="${tm_file} arm/bpabi-lib.h"
+    unwind_header=config/arm/unwind-arm.h
+    tmake_file="${tmake_file} t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
+    ;;
 arm*-*-netbsdelf*)
 	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
 	;;
@@ -636,6 +648,12 @@  x86_64-*-freebsd*)
 	tmake_file="${tmake_file} i386/t-freebsd i386/t-crtstuff"
 	md_unwind_header=i386/freebsd-unwind.h
 	;;
+i[34567]86-*-haiku*)
+	tmake_file="${tmake_file} i386/t-crtstuff i386/t-eh-dw2"
+    ;;
+x86_64-*-haiku*)
+	tmake_file="${tmake_file} i386/t-crtstuff i386/t-eh-dw2"
+	;;
 i[34567]86-*-netbsdelf*)
 	tmake_file="${tmake_file} i386/t-crtstuff"
 	;;
@@ -844,6 +862,8 @@  m32r-*-linux*)
 m32rle-*-linux*)
 	tmake_file="$tmake_file m32r/t-linux t-fdpbit"
 	;;
+m68k-*-haiku*)
+	;;
 m68k-*-elf* | fido-*-elf)
 	tmake_file="$tmake_file m68k/t-floatlib"
 	;;
@@ -1057,6 +1077,8 @@  powerpc*-*-freebsd*)
 	  ;;
 	esac
 	;;
+powerpc-*-haiku*)
+	;;
 powerpc-*-netbsd*)
 	tmake_file="$tmake_file rs6000/t-netbsd rs6000/t-crtstuff"
 	;;
diff --git a/libgcc/config/t-haiku b/libgcc/config/t-haiku
new file mode 100644
index 00000000000..b4fff2d8f06
--- /dev/null
+++ b/libgcc/config/t-haiku
@@ -0,0 +1,3 @@ 
+# Use unwind-dw2-fde
+LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \
+  $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c
diff --git a/libstdc++-v3/config/os/haiku/ctype_base.h b/libstdc++-v3/config/os/haiku/ctype_base.h
new file mode 100644
index 00000000000..86e15cb47ff
--- /dev/null
+++ b/libstdc++-v3/config/os/haiku/ctype_base.h
@@ -0,0 +1,61 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 1997-2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+
+// Default information, may not be appropriate for specific host.
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /// @brief  Base class for ctype.
+  struct ctype_base
+  {
+    // Non-standard typedefs.
+    typedef const int* 		__to_type;
+
+    // NB: Offsets into ctype<char>::_M_table force a particular size
+    // on the mask type. Because of this, we don't use an enum.
+    typedef unsigned int 	mask;
+    static const mask upper    	= 1 << 0;
+    static const mask lower 	= 1 << 1;
+    static const mask alpha 	= 1 << 2;
+    static const mask digit 	= 1 << 3;
+    static const mask xdigit 	= 1 << 4;
+    static const mask space 	= 1 << 5;
+    static const mask print 	= 1 << 6;
+    static const mask graph 	= (1 << 2) | (1 << 3) | (1 << 9); // alnum|punct
+    static const mask cntrl 	= 1 << 8;
+    static const mask punct 	= 1 << 9;
+    static const mask alnum 	= (1 << 2) | (1 << 3);  // alpha|digit
+#if __cplusplus >= 201103L
+    static const mask blank         = 1 << 10;
+#endif
+  };
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
diff --git a/libstdc++-v3/config/os/haiku/ctype_configure_char.cc b/libstdc++-v3/config/os/haiku/ctype_configure_char.cc
new file mode 100644
index 00000000000..35e6b80f020
--- /dev/null
+++ b/libstdc++-v3/config/os/haiku/ctype_configure_char.cc
@@ -0,0 +1,99 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 2011-2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file ctype_configure_char.cc */
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+
+#include <locale>
+#include <cstdlib>
+#include <cstring>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+// Information as gleaned from /usr/include/ctype.h
+
+  const ctype_base::mask*
+  ctype<char>::classic_table() throw()
+  { return 0; }
+
+  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
+		     size_t __refs) 
+  : facet(__refs), _M_del(__table != 0 && __del), 
+  _M_toupper(NULL), _M_tolower(NULL), 
+  _M_table(__table ? __table : classic_table()) 
+  { 
+    memset(_M_widen, 0, sizeof(_M_widen));
+    _M_widen_ok = 0;
+    memset(_M_narrow, 0, sizeof(_M_narrow));
+    _M_narrow_ok = 0;
+  }
+
+  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 
+  : facet(__refs), _M_del(__table != 0 && __del), 
+  _M_toupper(NULL), _M_tolower(NULL), 
+  _M_table(__table ? __table : classic_table())
+  { 
+    memset(_M_widen, 0, sizeof(_M_widen));
+    _M_widen_ok = 0;
+    memset(_M_narrow, 0, sizeof(_M_narrow));
+    _M_narrow_ok = 0;
+  }
+
+  char
+  ctype<char>::do_toupper(char __c) const
+  { return ::toupper((int) __c); }
+
+  const char*
+  ctype<char>::do_toupper(char* __low, const char* __high) const
+  {
+    while (__low < __high)
+      {
+	*__low = ::toupper((int) *__low);
+	++__low;
+      }
+    return __high;
+  }
+
+  char
+  ctype<char>::do_tolower(char __c) const
+  { return ::tolower((int) __c); }
+
+  const char* 
+  ctype<char>::do_tolower(char* __low, const char* __high) const
+  {
+    while (__low < __high)
+      {
+	*__low = ::tolower((int) *__low);
+	++__low;
+      }
+    return __high;
+  }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
diff --git a/libstdc++-v3/config/os/haiku/ctype_inline.h b/libstdc++-v3/config/os/haiku/ctype_inline.h
new file mode 100644
index 00000000000..0419139626b
--- /dev/null
+++ b/libstdc++-v3/config/os/haiku/ctype_inline.h
@@ -0,0 +1,168 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 2000-2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/ctype_inline.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{locale}
+ */
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+  
+// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
+// functions go in ctype.cc
+  
+// The following definitions are portable, but insanely slow. If one
+// cares at all about performance, then specialized ctype
+// functionality should be added for the native os in question: see
+// the config/os/bits/ctype_*.h files.
+
+// Constructing a synthetic "C" table should be seriously considered...
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  bool
+  ctype<char>::
+  is(mask __m, char __c) const
+  { 
+    if (_M_table)
+      return _M_table[static_cast<unsigned char>(__c)] & __m;
+    else
+      {
+	bool __ret = false;
+	const size_t __bitmasksize = 15; 
+	size_t __bitcur = 0; // Lowest bitmask in ctype_base == 0
+	for (; __bitcur <= __bitmasksize; ++__bitcur)
+	  {
+	    const mask __bit = static_cast<mask>(1 << __bitcur);
+	    if (__m & __bit)
+	      {
+		bool __testis;
+		switch (__bit)
+		  {
+		  case space:
+		    __testis = isspace(__c);
+		    break;
+		  case print:
+		    __testis = isprint(__c);
+		    break;
+		  case cntrl:
+		    __testis = iscntrl(__c);
+		    break;
+		  case upper:
+		    __testis = isupper(__c);
+		    break;
+		  case lower:
+		    __testis = islower(__c);
+		    break;
+		  case alpha:
+		    __testis = isalpha(__c);
+		    break;
+		  case digit:
+		    __testis = isdigit(__c);
+		    break;
+		  case punct:
+		    __testis = ispunct(__c);
+		    break;
+		  case xdigit:
+		    __testis = isxdigit(__c);
+		    break;
+		  case alnum:
+		    __testis = isalnum(__c);
+		    break;
+		  case graph:
+		    __testis = isgraph(__c);
+		    break;
+		  default:
+		    __testis = false;
+		    break;
+		  }
+		__ret |= __testis;
+	      }
+	  }
+	return __ret;
+      }
+  }
+   
+  const char*
+  ctype<char>::
+  is(const char* __low, const char* __high, mask* __vec) const
+  {
+    if (_M_table)
+      while (__low < __high)
+	*__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
+    else
+      {
+	// Highest bitmask in ctype_base == 10.
+	const size_t __bitmasksize = 15; 
+	for (;__low < __high; ++__vec, ++__low)
+	  {
+	    mask __m = 0;
+	    // Lowest bitmask in ctype_base == 0
+	    size_t __i = 0; 
+	    for (;__i <= __bitmasksize; ++__i)
+	      {
+		const mask __bit = static_cast<mask>(1 << __i);
+		if (this->is(__bit, *__low))
+		  __m |= __bit;
+	      }
+	    *__vec = __m;
+	  }
+      }
+    return __high;
+  }
+
+  const char*
+  ctype<char>::
+  scan_is(mask __m, const char* __low, const char* __high) const
+  {
+    if (_M_table)
+      while (__low < __high
+	     && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
+	++__low;
+    else
+      while (__low < __high && !this->is(__m, *__low))
+	++__low;
+    return __low;
+  }
+
+  const char*
+  ctype<char>::
+  scan_not(mask __m, const char* __low, const char* __high) const
+  {
+    if (_M_table)
+      while (__low < __high
+	     && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
+	++__low;
+    else
+      while (__low < __high && this->is(__m, *__low) != 0)
+	++__low;
+    return __low;
+  }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
diff --git a/libstdc++-v3/config/os/haiku/error_constants.h b/libstdc++-v3/config/os/haiku/error_constants.h
new file mode 100644
index 00000000000..fa6d889192a
--- /dev/null
+++ b/libstdc++-v3/config/os/haiku/error_constants.h
@@ -0,0 +1,178 @@ 
+// Specific definitions for generic platforms  -*- C++ -*-
+
+// Copyright (C) 2007-2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/error_constants.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{system_error}
+ */
+
+#ifndef _GLIBCXX_ERROR_CONSTANTS
+#define _GLIBCXX_ERROR_CONSTANTS 1
+
+#include <bits/c++config.h>
+#include <cerrno>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  enum class errc
+    {
+      address_family_not_supported = 		EAFNOSUPPORT,
+      address_in_use = 				EADDRINUSE,
+      address_not_available = 			EADDRNOTAVAIL,
+      already_connected = 			EISCONN,
+      argument_list_too_long = 			E2BIG,
+      argument_out_of_domain = 			EDOM,
+      bad_address = 				EFAULT,
+      bad_file_descriptor = 			EBADF,
+
+#ifdef _GLIBCXX_HAVE_EBADMSG
+      bad_message = 				EBADMSG,
+#endif
+
+      broken_pipe = 				EPIPE,
+      connection_aborted = 			ECONNABORTED,
+      connection_already_in_progress = 		EALREADY,
+      connection_refused = 			ECONNREFUSED,
+      connection_reset = 			ECONNRESET,
+      cross_device_link = 			EXDEV,
+      destination_address_required = 		EDESTADDRREQ,
+      device_or_resource_busy = 		EBUSY,
+      directory_not_empty = 			ENOTEMPTY,
+      executable_format_error = 		ENOEXEC,
+      file_exists = 	       			EEXIST,
+      file_too_large = 				EFBIG,
+      filename_too_long = 			ENAMETOOLONG,
+      function_not_supported = 			ENOSYS,
+      host_unreachable = 			EHOSTUNREACH,
+
+#ifdef _GLIBCXX_HAVE_EIDRM
+      identifier_removed = 			EIDRM,
+#endif
+
+      illegal_byte_sequence = 			EILSEQ,
+      inappropriate_io_control_operation = 	ENOTTY,
+      interrupted = 				EINTR,
+      invalid_argument = 			EINVAL,
+      invalid_seek = 				ESPIPE,
+      io_error = 				EIO,
+      is_a_directory = 				EISDIR,
+      message_size = 				EMSGSIZE,
+      network_down = 				ENETDOWN,
+      network_reset = 				ENETRESET,
+      network_unreachable = 			ENETUNREACH,
+      no_buffer_space = 			ENOBUFS,
+      no_child_process = 			ECHILD,
+
+#ifdef _GLIBCXX_HAVE_ENOLINK
+      no_link = 				ENOLINK,
+#endif
+
+      no_lock_available = 			ENOLCK,
+
+#ifdef _GLIBCXX_HAVE_ENODATA
+      no_message_available = 			ENODATA, 
+#endif
+
+      no_message = 				ENOMSG, 
+      no_protocol_option = 			ENOPROTOOPT,
+      no_space_on_device = 			ENOSPC,
+
+#ifdef _GLIBCXX_HAVE_ENOSR
+      no_stream_resources = 			ENOSR,
+#endif
+
+      no_such_device_or_address = 		ENXIO,
+      no_such_device = 				ENODEV,
+      no_such_file_or_directory = 		ENOENT,
+      no_such_process = 			ESRCH,
+      not_a_directory = 			ENOTDIR,
+      not_a_socket = 				ENOTSOCK,
+
+#ifdef _GLIBCXX_HAVE_ENOSTR
+      not_a_stream = 				ENOSTR,
+#endif
+
+      not_connected = 				ENOTCONN,
+      not_enough_memory = 			ENOMEM,
+
+#ifdef _GLIBCXX_HAVE_ENOTSUP
+      not_supported = 				ENOTSUP,
+#endif
+
+#ifdef _GLIBCXX_HAVE_ECANCELED
+      operation_canceled = 			ECANCELED,
+#endif
+
+      operation_in_progress = 			EINPROGRESS,
+      operation_not_permitted = 		EPERM,
+      operation_not_supported = 		EOPNOTSUPP,
+      operation_would_block = 			EWOULDBLOCK,
+
+#ifdef _GLIBCXX_HAVE_EOWNERDEAD
+      owner_dead = 				EOWNERDEAD,
+#endif
+
+      permission_denied = 			EACCES,
+
+#ifdef _GLIBCXX_HAVE_EPROTO
+      protocol_error = 				EPROTO,
+#endif
+
+      protocol_not_supported = 			EPROTONOSUPPORT,
+      read_only_file_system = 			EROFS,
+      resource_deadlock_would_occur = 		EDEADLK,
+      resource_unavailable_try_again = 		EAGAIN,
+      result_out_of_range = 			ERANGE,
+
+#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE
+      state_not_recoverable = 			ENOTRECOVERABLE,
+#endif
+
+#ifdef _GLIBCXX_HAVE_ETIME
+      stream_timeout = 				ETIME,
+#endif
+
+#ifdef _GLIBCXX_HAVE_ETXTBSY
+      text_file_busy = 				ETXTBSY,
+#endif
+
+      timed_out = 				ETIMEDOUT,
+      too_many_files_open_in_system = 		ENFILE,
+      too_many_files_open = 			EMFILE,
+      too_many_links = 				EMLINK,
+      too_many_symbolic_link_levels = 		ELOOP,
+
+#ifdef _GLIBCXX_HAVE_EOVERFLOW
+      value_too_large = 			EOVERFLOW,
+#endif
+
+      wrong_protocol_type = 			EPROTOTYPE
+    };
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+
+#endif
diff --git a/libstdc++-v3/config/os/haiku/os_defines.h b/libstdc++-v3/config/os/haiku/os_defines.h
new file mode 100644
index 00000000000..02c869321e5
--- /dev/null
+++ b/libstdc++-v3/config/os/haiku/os_defines.h
@@ -0,0 +1,48 @@ 
+// Specific definitions for generic platforms  -*- C++ -*-
+
+// Copyright (C) 2000-2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/os_defines.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{iosfwd}
+ */
+
+#ifndef _GLIBCXX_OS_DEFINES
+#define _GLIBCXX_OS_DEFINES 1
+
+// System-specific #define, typedefs, corrections, etc, go here.  This
+// file will come before all others.
+
+// On Haiku, nanosleep and sched_yield are always available except for the
+// kernel and the bootloader, so use them.
+#if !defined(_KERNEL_MODE) && !defined(_LOADER_MODE)
+	#define _GLIBCXX_USE_NANOSLEEP 1
+	#define _GLIBCXX_USE_SCHED_YIELD 1
+	#define _GLIBCXX_USE_CLOCK_MONOTONIC 1
+	#define _GLIBCXX_USE_CLOCK_REALTIME 1
+#endif
+
+// See libstdc++/69506
+#define _GLIBCXX_USE_WEAK_REF 0
+
+#endif
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index d126addd40a..04482e91f9b 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -11315,7 +11315,7 @@  else
   lt_cv_dlopen_libs=
 
   case $host_os in
-  beos*)
+  beos* | haiku*)
     lt_cv_dlopen="load_add_on"
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
@@ -53380,6 +53380,89 @@  done
 
     ;;
 
+  *-haiku*)
+    for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h \
+      machine/endian.h machine/param.h sys/machine.h sys/types.h \
+      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+    SECTION_FLAGS='-ffunction-sections -fdata-sections'
+
+    $as_echo "#define HAVE_INT64_T 1" >>confdefs.h
+
+
+    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ASINF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ATANF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h
+
+    $as_echo "#define HAVE_CEILF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_COSF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_COSHF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_EXPF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FABSF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FINITE 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FINITEF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FLOORF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FMODF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h
+
+    $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ISINF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ISINFF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h
+
+    $as_echo "#define HAVE_ISNANF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_LOGF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h
+
+    $as_echo "#define HAVE_MODFF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_SINF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_SINHF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_TANF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_TANHF 1" >>confdefs.h
+
+    $as_echo "#define HAVE_TLS 1" >>confdefs.h
+
+    ;;
+
+
   *-hpux*)
     SECTION_FLAGS='-ffunction-sections -fdata-sections'
 
diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
index caea9de9c76..c0ee97af458 100644
--- a/libstdc++-v3/configure.host
+++ b/libstdc++-v3/configure.host
@@ -360,7 +360,7 @@  case "${host}" in
 	;;
     esac
     ;;
-  arm*-*-freebsd*)
+  arm*-*-freebsd* | arm*-*-haiku*)
      port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
      ;;
   powerpc*-*-darwin*)
diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4
index 0dbfe4057bd..3f8958b5f61 100644
--- a/libstdc++-v3/crossconfig.m4
+++ b/libstdc++-v3/crossconfig.m4
@@ -141,6 +141,46 @@  case "${host}" in
     AC_SUBST(SECTION_FLAGS)
     ;;
 
+  *-haiku*)
+    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+      machine/endian.h machine/param.h sys/machine.h sys/types.h \
+      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
+    SECTION_FLAGS='-ffunction-sections -fdata-sections'
+    AC_SUBST(SECTION_FLAGS)
+
+    AC_DEFINE(HAVE_INT64_T)
+
+    AC_DEFINE(HAVE_ACOSF)
+    AC_DEFINE(HAVE_ASINF)
+    AC_DEFINE(HAVE_ATANF)
+    AC_DEFINE(HAVE_ATAN2F)
+    AC_DEFINE(HAVE_CEILF)
+    AC_DEFINE(HAVE_COSF)
+    AC_DEFINE(HAVE_COSHF)
+    AC_DEFINE(HAVE_EXPF)
+    AC_DEFINE(HAVE_FABSF)
+    AC_DEFINE(HAVE_FINITE)
+    AC_DEFINE(HAVE_FINITEF)
+    AC_DEFINE(HAVE_FLOORF)
+    AC_DEFINE(HAVE_FMODF)
+    AC_DEFINE(HAVE_FREXPF)
+    AC_DEFINE(HAVE_HYPOT)
+    AC_DEFINE(HAVE_HYPOTF)
+    AC_DEFINE(HAVE_ISINF)
+    AC_DEFINE(HAVE_ISINFF)
+    AC_DEFINE(HAVE_ISNAN)
+    AC_DEFINE(HAVE_ISNANF)
+    AC_DEFINE(HAVE_LOGF)
+    AC_DEFINE(HAVE_LOG10F)
+    AC_DEFINE(HAVE_MODFF)
+    AC_DEFINE(HAVE_SINF)
+    AC_DEFINE(HAVE_SINHF)
+    AC_DEFINE(HAVE_SQRTF)
+    AC_DEFINE(HAVE_TANF)
+    AC_DEFINE(HAVE_TANHF)
+    AC_DEFINE(HAVE_TLS)
+    ;;
+
   *-hpux*)
     SECTION_FLAGS='-ffunction-sections -fdata-sections'
     AC_SUBST(SECTION_FLAGS)
diff --git a/libtool.m4 b/libtool.m4
index 940faaa161d..72931dda5e0 100644
--- a/libtool.m4
+++ b/libtool.m4
@@ -1722,7 +1722,7 @@  else
   lt_cv_dlopen_libs=
 
   case $host_os in
-  beos*)
+  beos* | haiku*)
     lt_cv_dlopen="load_add_on"
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
@@ -2343,7 +2343,9 @@  haiku*)
   shlibpath_var=LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
+  sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib'
+  sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib'
+  hardcode_into_libs=no
   ;;
 
 hpux9* | hpux10* | hpux11*)
@@ -3626,8 +3628,6 @@  m4_if([$1], [CXX], [
       ;;
     haiku*)
       # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
       ;;
     interix[[3-9]]*)
       # Interix 3.x gcc -fpic/-fPIC options generate broken code.