summaryrefslogtreecommitdiff
path: root/lang/gcc47
diff options
context:
space:
mode:
authormarino <marino>2012-06-23 22:13:02 +0000
committermarino <marino>2012-06-23 22:13:02 +0000
commite1dc5cfc573dffc72bb38c0c164ddcba3facd12c (patch)
tree136ceed5b006d4c48fe18f438a6ef451ee24a889 /lang/gcc47
parente163c7a33dafd99c64316724a1dd05af58944918 (diff)
downloadpkgsrc-e1dc5cfc573dffc72bb38c0c164ddcba3facd12c.tar.gz
lang/gcc47: Add support for DragonFly
GCC47 was marked NOT-FOR-DRAGONFLY, so support has been added. * DragonFly-specific files added via patch mechanism * Some existing patches modified to add DragonFly configuration items * dl_iterate_phdr error handling support added (FreeBSD support was altered, NetBSD and OpenBSD support is commented out) * The java language is taken off as a default option On the i386 platform, the compiler will build from a full bootstrap, but one of the later stages fails on x86_64. It fails to find libstdc++.so.6 even though the previous stage library was built and -B, -L flags point to it. The cause of the platform-specific build failure isn't clear -- The workaround is to disable the bootstrap on DragonFly so that the compiler is built in one stage instead of three. This workaround could have been limited to the x86_64-DragonFly platform only, but currently is applied to i386-DragonFly too.
Diffstat (limited to 'lang/gcc47')
-rw-r--r--lang/gcc47/Makefile9
-rw-r--r--lang/gcc47/distinfo27
-rw-r--r--lang/gcc47/options.mk4
-rw-r--r--lang/gcc47/patches/patch-configure6
-rw-r--r--lang/gcc47/patches/patch-gcc_config.gcc58
-rw-r--r--lang/gcc47/patches/patch-gcc_config_dragonfly-stdint.h61
-rw-r--r--lang/gcc47/patches/patch-gcc_config_dragonfly.h140
-rw-r--r--lang/gcc47/patches/patch-gcc_config_dragonfly.opt70
-rw-r--r--lang/gcc47/patches/patch-gcc_config_i386_dragonfly.h106
-rw-r--r--lang/gcc47/patches/patch-gcc_configure29
-rw-r--r--lang/gcc47/patches/patch-gcc_ginclude_stddef.h53
-rw-r--r--lang/gcc47/patches/patch-include_libiberty.h22
-rw-r--r--lang/gcc47/patches/patch-libgcc_config.host47
-rw-r--r--lang/gcc47/patches/patch-libgcc_config_i386_dragonfly-unwind.h163
-rw-r--r--lang/gcc47/patches/patch-libgcc_crtstuff.c29
-rw-r--r--lang/gcc47/patches/patch-libgcc_unwind-dw2-fde-dip.c29
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc305
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc179
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h65
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc104
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h132
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h46
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_configure47
-rw-r--r--lang/gcc47/patches/patch-libstdc++-v3_configure.host14
24 files changed, 1729 insertions, 16 deletions
diff --git a/lang/gcc47/Makefile b/lang/gcc47/Makefile
index f3913bb98b8..ac6920b3490 100644
--- a/lang/gcc47/Makefile
+++ b/lang/gcc47/Makefile
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile,v 1.2 2012/06/08 15:42:29 joerg Exp $
+# $NetBSD: Makefile,v 1.3 2012/06/23 22:13:02 marino Exp $
GCC_PKGNAME= gcc47
.include "version.mk"
DISTNAME= gcc-${GCC_DIST_VERSION}
PKGNAME= ${GCC_PKGNAME}-${GCC_DIST_VERSION}
-PKGREVISION= 1
+PKGREVISION= 2
CATEGORIES= lang
MASTER_SITES= ${MASTER_SITE_GNU:=gcc/gcc-${GCC_DIST_VERSION}/}
EXTRACT_SUFX= .tar.bz2
@@ -18,7 +18,7 @@ LICENSE= gnu-gpl-v2 AND gnu-gpl-v3 AND gnu-lgpl-v2 AND gnu-lgpl-v3
DISTFILES= ${DEFAULT_DISTFILES}
EXTRACT_ONLY= ${DEFAULT_DISTFILES}
-NOT_FOR_PLATFORM= Interix-*-* DragonFly-*-*
+NOT_FOR_PLATFORM= Interix-*-*
USE_TOOLS+= gmake makeinfo sed:run
@@ -64,6 +64,9 @@ CONFIGURE_ARGS+= --with-gnu-ld --with-ld=/usr/bin/ld
CONFIGURE_ARGS+= --with-gnu-as --with-as=/usr/bin/as
MAKE_ENV+= ac_cv_func_clock_gettime=yes
.endif
+.if ${OPSYS} == "DragonFly"
+CONFIGURE_ARGS+= --disable-bootstrap
+.endif
.include "options.mk"
diff --git a/lang/gcc47/distinfo b/lang/gcc47/distinfo
index e3b802fde94..75208c7b043 100644
--- a/lang/gcc47/distinfo
+++ b/lang/gcc47/distinfo
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.6 2012/06/22 03:52:26 marino Exp $
+$NetBSD: distinfo,v 1.7 2012/06/23 22:13:02 marino Exp $
SHA1 (ecj-4.5.jar) = 58c1d79c64c8cd718550f32a932ccfde8d1e6449
RMD160 (ecj-4.5.jar) = d3f4da657f086b6423f74e93f001132f4855368a
@@ -6,16 +6,35 @@ Size (ecj-4.5.jar) = 1470676 bytes
SHA1 (gcc-4.7.0.tar.bz2) = 03b8241477a9f8a34f6efe7273d92b9b6dd9fe82
RMD160 (gcc-4.7.0.tar.bz2) = 4ed660b281cdb9bcf98f5c2cf2da105c71db5be4
Size (gcc-4.7.0.tar.bz2) = 82518546 bytes
-SHA1 (patch-configure) = 3482c45096a3c100c68c1b56947a12197b141292
+SHA1 (patch-configure) = 51c0978c60baddd90ef7e512445fdef913c04e6c
SHA1 (patch-gcc_Makefile.in) = 2372899a37259c89281e6bd1223e39df9b53a7e3
-SHA1 (patch-gcc_config.gcc) = 0fd91e83b97886589280d94457a71c0c551e93a3
+SHA1 (patch-gcc_config.gcc) = efa4ecabd71bdec14d5dd1f8bb836116c7a9d6e9
+SHA1 (patch-gcc_config_dragonfly-stdint.h) = 740dc819b446d5f1476506322c4b280ffdb5a6c0
+SHA1 (patch-gcc_config_dragonfly.h) = 82f549cdc7543b4bf413a44d481ef42b10f59c82
+SHA1 (patch-gcc_config_dragonfly.opt) = 92f615c73c2e94664bae5b5935ab8b09bca15f73
+SHA1 (patch-gcc_config_i386_dragonfly.h) = f2c46d1b6b51316aa774c2453a69ff2571778dbd
SHA1 (patch-gcc_config_netbsd-stdint.h) = 025fc883101a187e84ed4c0772406720d645d550
+SHA1 (patch-gcc_configure) = a4b670d0c54c410d38715b7a2a572a7048e3ec5e
SHA1 (patch-gcc_fortran_f95-lang.c) = 06470dbee79f8c762675d3060a870b7dd9ba38f8
SHA1 (patch-gcc_gcc.c) = f23ddf1ad4decd086dd41a70046b4a870a39516f
-SHA1 (patch-gcc_ginclude_stddef.h) = 635e3e7579e9395fa017ac38e8b768d98937a80e
+SHA1 (patch-gcc_ginclude_stddef.h) = 87d7c2ff4400ad0719b2351d2f4c4b05bd257db3
+SHA1 (patch-include_libiberty.h) = ad2c64e9a14405c89b02ff68811b1c889405d0a1
+SHA1 (patch-libgcc_config.host) = 6b54e18c6348c4aeb3fda3093fbe990b59456af7
+SHA1 (patch-libgcc_config_i386_dragonfly-unwind.h) = 9d77252dd982495e90f95b82706bab29e581df9f
+SHA1 (patch-libgcc_crtstuff.c) = 88500ea895cd683608f8f2b7177149f11947e3b4
+SHA1 (patch-libgcc_unwind-dw2-fde-dip.c) = 2a0b8c6d2f86d985506578b4e74947d3fb1766a5
SHA1 (patch-libgfortran_configure) = b3bbc7d9201073a1bed0b7e10141465bab52c8be
SHA1 (patch-libgo_Makefile.in) = c06e3f0deb9f906d2c158262cffdc3fb7af95602
SHA1 (patch-libjava_boehm.cc) = b18bc9d410a62543583c77e011f50b86f41ca18a
SHA1 (patch-libjava_configure) = 48ea2baffe87e09dda8133d286bd9b1bfe4c3f8a
SHA1 (patch-libjava_contrib_rebuild-gcj-db.in) = bb01d738fc7db05046ae37e8ade32574de1d8297
+SHA1 (patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc) = 5c0ccc6b90e3508b03ed399e8e9e300a6aa9cbb7
+SHA1 (patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc) = 876a754c7fcb1c4a362ca7b2655da6cdbb784ccc
+SHA1 (patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h) = 1c8ee3ea80bd8869222dcb7beb050bf33ff4d3b6
+SHA1 (patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc) = d5649f42b61ff3c27d60e813cc844b820525aee4
+SHA1 (patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h) = fecd20146d8e0bdebb073c8d64886e36293416fd
+SHA1 (patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h) = 9a45ecb4309c50ca90008b2fc7d3b44d002698b4
+SHA1 (patch-libstdc++-v3_config_os_bsd_netbsd_ctype__base.h) = 94879703659b960c7b61122b4b4173e01cec1afc
+SHA1 (patch-libstdc++-v3_configure) = 4846c93afac42e4fdd20141234d601517cab7175
+SHA1 (patch-libstdc++-v3_configure.host) = 7426ea4a9735e5f886f4a3ffb4a9ba62734178c4
SHA1 (patch-libstdc++-v3_config_os_bsd_netbsd_ctype__base.h) = 94879703659b960c7b61122b4b4173e01cec1afc
diff --git a/lang/gcc47/options.mk b/lang/gcc47/options.mk
index 62cb3491104..d01e8cb73a0 100644
--- a/lang/gcc47/options.mk
+++ b/lang/gcc47/options.mk
@@ -1,4 +1,4 @@
-# $NetBSD: options.mk,v 1.6 2012/04/30 04:17:39 sbd Exp $
+# $NetBSD: options.mk,v 1.7 2012/06/23 22:13:02 marino Exp $
PKG_OPTIONS_VAR= PKG_OPTIONS.${GCC_PKGNAME}
PKG_SUPPORTED_OPTIONS= nls gcc-inplace-math gcc-c++ gcc-fortran gcc-java \
@@ -7,6 +7,8 @@ PKG_SUGGESTED_OPTIONS= gcc-c++ gcc-fortran gcc-objc gcc-objc++
.if ${OPSYS} == "NetBSD" || ${OPSYS} == "Linux"
PKG_SUGGESTED_OPTIONS+= nls gcc-java
+.elif ${OPSYS} == "DragonFly"
+PKG_SUGGESTED_OPTIONS+= nls
.elif ${OPSYS} == "SunOS"
PKG_SUGGESTED_OPTIONS+= gcc-inplace-math
.else
diff --git a/lang/gcc47/patches/patch-configure b/lang/gcc47/patches/patch-configure
index 08a5be9848e..d20f8a80e52 100644
--- a/lang/gcc47/patches/patch-configure
+++ b/lang/gcc47/patches/patch-configure
@@ -1,8 +1,8 @@
-$NetBSD: patch-configure,v 1.1 2012/05/03 12:20:19 hans Exp $
+$NetBSD: patch-configure,v 1.2 2012/06/23 22:13:02 marino Exp $
---- configure.orig 2011-03-16 18:27:36.000000000 +0000
+--- configure.orig 2012-02-02 10:20:32.000000000 +0000
+++ configure
-@@ -5279,9 +5279,11 @@ if test "x$with_mpfr_lib" != x; then
+@@ -5191,9 +5191,11 @@ if test "x$with_mpfr_lib" != x; then
gmplibs="-L$with_mpfr_lib $gmplibs"
fi
if test "x$with_mpfr$with_mpfr_include$with_mpfr_lib" = x && test -d ${srcdir}/mpfr; then
diff --git a/lang/gcc47/patches/patch-gcc_config.gcc b/lang/gcc47/patches/patch-gcc_config.gcc
index 608f79534e7..ab600a76ca5 100644
--- a/lang/gcc47/patches/patch-gcc_config.gcc
+++ b/lang/gcc47/patches/patch-gcc_config.gcc
@@ -1,12 +1,40 @@
-$NetBSD: patch-gcc_config.gcc,v 1.2 2012/04/17 04:11:12 sbd Exp $
+$NetBSD: patch-gcc_config.gcc,v 1.3 2012/06/23 22:13:02 marino Exp $
* Add t-crtstuff to tmake_file on NetBSD.
* Add netbsd-stdint.h to tm_file on NetBSD.
* wrap the system stdint.h on NetBSD.
+* Add DragonFly support.
--- gcc/config.gcc.orig 2012-03-05 10:43:22.000000000 +0000
+++ gcc/config.gcc
-@@ -644,6 +644,7 @@ case ${target} in
+@@ -589,6 +589,26 @@ case ${target} in
+ # need_64bit_hwint=yes # system compiler has this for all arch!
+ use_gcc_stdint=wrap
+ ;;
++*-*-dragonfly*)
++ gas=yes
++ gnu_ld=yes
++ tmake_file="t-slibgcc"
++ case ${enable_threads} in
++ "" | yes | posix)
++ thread_file='posix'
++ ;;
++ no | gnat | single)
++ # Let these non-posix thread selections fall through if requested
++ ;;
++ *)
++ echo 'Unknown thread configuration for DragonFly BSD'
++ exit 1
++ ;;
++ esac
++ extra_options="$extra_options rpath.opt dragonfly.opt"
++ default_use_cxa_atexit=yes
++ use_gcc_stdint=wrap
++ ;;
+ *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
+ extra_options="$extra_options gnu-user.opt"
+ gas=yes
+@@ -644,6 +664,7 @@ case ${target} in
esac
;;
*-*-netbsd*)
@@ -14,7 +42,22 @@ $NetBSD: patch-gcc_config.gcc,v 1.2 2012/04/17 04:11:12 sbd Exp $
tmake_file="t-slibgcc"
gas=yes
gnu_ld=yes
-@@ -1203,12 +1204,14 @@ x86_64-*-freebsd*)
+@@ -1196,6 +1217,14 @@ i[34567]86-*-elf*)
+ x86_64-*-elf*)
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h"
+ ;;
++i[34567]86-*-dragonfly*)
++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h dragonfly.h dragonfly-stdint.h i386/dragonfly.h"
++ tmake_file="${tmake_file} i386/t-crtstuff"
++ ;;
++x86_64-*-dragonfly*)
++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h dragonfly.h dragonfly-stdint.h i386/x86-64.h i386/dragonfly.h"
++ tmake_file="${tmake_file} i386/t-crtstuff"
++ ;;
+ i[34567]86-*-freebsd*)
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h ${fbsd_tm_file} i386/freebsd.h"
+ ;;
+@@ -1203,12 +1232,14 @@ 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-*-netbsdelf*)
@@ -31,3 +74,12 @@ $NetBSD: patch-gcc_config.gcc,v 1.2 2012/04/17 04:11:12 sbd Exp $
;;
i[34567]86-*-openbsd2.*|i[34567]86-*openbsd3.[0123])
tm_file="i386/i386.h i386/unix.h i386/bsd.h i386/gas.h i386/gstabs.h openbsd-oldgas.h openbsd.h i386/openbsd.h"
+@@ -3518,6 +3549,8 @@ case ${target} in
+ ;;
+ i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw*)
+ ;;
++ i[34567]86-*-dragonfly* | x86_64-*-dragonfly*)
++ ;;
+ i[34567]86-*-freebsd* | x86_64-*-freebsd*)
+ ;;
+ ia64*-*-linux*)
diff --git a/lang/gcc47/patches/patch-gcc_config_dragonfly-stdint.h b/lang/gcc47/patches/patch-gcc_config_dragonfly-stdint.h
new file mode 100644
index 00000000000..94ebe5cd57f
--- /dev/null
+++ b/lang/gcc47/patches/patch-gcc_config_dragonfly-stdint.h
@@ -0,0 +1,61 @@
+$NetBSD: patch-gcc_config_dragonfly-stdint.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- gcc/config/dragonfly-stdint.h.orig 2012-06-22 10:35:29.000000000 +0000
++++ gcc/config/dragonfly-stdint.h
+@@ -0,0 +1,56 @@
++/* Definitions for <stdint.h> types for DragonFly systems.
++ Copyright (C) 2009 Free Software Foundation, Inc.
++ Contributed by Gerald Pfeifer <gerald@pfeifer.com>.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++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 INT8_TYPE
++#define INT_LEAST16_TYPE INT16_TYPE
++#define INT_LEAST32_TYPE INT32_TYPE
++#define INT_LEAST64_TYPE INT64_TYPE
++#define UINT_LEAST8_TYPE UINT8_TYPE
++#define UINT_LEAST16_TYPE UINT16_TYPE
++#define UINT_LEAST32_TYPE UINT32_TYPE
++#define UINT_LEAST64_TYPE UINT64_TYPE
++
++#define INT_FAST8_TYPE INT32_TYPE
++#define INT_FAST16_TYPE INT32_TYPE
++#define INT_FAST32_TYPE INT32_TYPE
++#define INT_FAST64_TYPE INT64_TYPE
++#define UINT_FAST8_TYPE UINT32_TYPE
++#define UINT_FAST16_TYPE UINT32_TYPE
++#define UINT_FAST32_TYPE UINT32_TYPE
++#define UINT_FAST64_TYPE UINT64_TYPE
++
++#define INTPTR_TYPE (LONG_TYPE_SIZE == 64 ? INT64_TYPE : INT32_TYPE)
++#define UINTPTR_TYPE (LONG_TYPE_SIZE == 64 ? UINT64_TYPE : UINT32_TYPE)
diff --git a/lang/gcc47/patches/patch-gcc_config_dragonfly.h b/lang/gcc47/patches/patch-gcc_config_dragonfly.h
new file mode 100644
index 00000000000..9ace60547f7
--- /dev/null
+++ b/lang/gcc47/patches/patch-gcc_config_dragonfly.h
@@ -0,0 +1,140 @@
+$NetBSD: patch-gcc_config_dragonfly.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- gcc/config/dragonfly.h.orig 2012-06-22 10:35:29.000000000 +0000
++++ gcc/config/dragonfly.h
+@@ -0,0 +1,135 @@
++/* Base configuration file for all DragonFly targets.
++ Copyright (C) 1999, 2000, 2001, 2007, 2008 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3. If not see
++<http://www.gnu.org/licenses/>. */
++
++/* Common DragonFly configuration.
++ All DragonFly architectures should include this file, which will specify
++ their commonalities.
++ Adapted from gcc/config/i386/freebsd-elf.h by
++ David O'Brien <obrien@FreeBSD.org>.
++ Further work by David O'Brien <obrien@FreeBSD.org> and
++ Loren J. Rittle <ljrittle@acm.org>. */
++
++#undef TARGET_OS_CPP_BUILTINS
++#define TARGET_OS_CPP_BUILTINS() \
++ do \
++ { \
++ builtin_define_std ("unix"); \
++ builtin_define ("__DragonFly__"); \
++ builtin_assert ("system=unix"); \
++ builtin_assert ("system=bsd"); \
++ builtin_assert ("system=DragonFly"); \
++ } \
++ while (0)
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "%(cpp_cpu) %(cpp_arch) %{posix:-D_POSIX_SOURCE}"
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC \
++ "%{!shared: \
++ %{pg:gcrt1.o%s} \
++ %{!pg: \
++ %{p:gcrt1.o%s} \
++ %{!p: \
++ %{profile: gcrt1.o%s} \
++ %{!profile: \
++ %{pie: Scrt1.o%s;:crt1.o%s}}}}} \
++ crti.o%s \
++ %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC \
++ "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
++
++#undef LIB_SPEC
++#define LIB_SPEC \
++ "%{pthread:-lpthread} -lc"
++
++#if defined(HAVE_LD_EH_FRAME_HDR)
++#define LINK_EH_SPEC "--eh-frame-hdr"
++#endif
++
++/* Provide a LINK_SPEC appropriate for DragonFly. 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.
++
++ When the -shared link option is used a final link is not being
++ done. */
++
++#define DFBSD_LINK_SPEC \
++ "%{p:%nconsider using '-pg' instead of '-p' with gprof(1)} \
++ %{v:-V} \
++ %{assert*} %{R*} %{rpath*} %{defsym*} \
++ %{shared:-Bshareable %{h*} %{soname*}} \
++ %{!shared: \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ -dynamic-linker %(dfbsd_dynamic_linker) \
++ } \
++ %{static:-Bstatic}} \
++ %{!static:--hash-style=both} \
++ %{symbolic:-Bsymbolic}"
++
++#undef LINK_SPEC
++#define LINK_SPEC DFBSD_LINK_SPEC
++
++#define DFBSD_DYNAMIC_LINKER "/usr/libexec/ld-elf.so.2"
++
++
++/* Use --as-needed -lgcc_s for eh support. */
++#ifdef HAVE_LD_AS_NEEDED
++#define USE_LD_AS_NEEDED 1
++#endif
++
++/************************[ Target stuff ]***********************************/
++
++/* All DragonFly Architectures support the ELF object file format. */
++#undef OBJECT_FORMAT_ELF
++#define OBJECT_FORMAT_ELF
++
++/* Don't assume anything about the header files. */
++#undef NO_IMPLICIT_EXTERN_C
++#define NO_IMPLICIT_EXTERN_C 1
++
++/* Follow DragonFly's standard headers (<machine/stdint.h>, etc...). */
++
++#undef WCHAR_TYPE
++#define WCHAR_TYPE "int"
++
++#undef WINT_TYPE
++#define WINT_TYPE "int"
++
++/*
++ * Profile libraries are found at /usr/lib/profile with standard names
++ * #define MATH_LIBRARY_PROFILE "m_p"
++ */
++
++/* Code generation parameters. */
++
++/* Use periods rather than dollar signs in special g++ assembler names.
++ This ensures the configuration knows our system correctly so we can link
++ with libraries compiled with the native cc. */
++#undef NO_DOLLAR_IN_LABEL
++
++/* Used by libgcc2.c. We support file locking with fcntl / F_SETLKW.
++ This enables the test coverage code to use file locking when exiting a
++ program, which avoids race conditions if the program has forked. */
++#define TARGET_POSIX_IO
diff --git a/lang/gcc47/patches/patch-gcc_config_dragonfly.opt b/lang/gcc47/patches/patch-gcc_config_dragonfly.opt
new file mode 100644
index 00000000000..eb8816dd046
--- /dev/null
+++ b/lang/gcc47/patches/patch-gcc_config_dragonfly.opt
@@ -0,0 +1,70 @@
+$NetBSD: patch-gcc_config_dragonfly.opt,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- gcc/config/dragonfly.opt.orig 2012-06-22 10:35:29.000000000 +0000
++++ gcc/config/dragonfly.opt
+@@ -0,0 +1,65 @@
++; DragonFlyBSD options.
++
++; Copyright (C) 2010, 2011
++; Free Software Foundation, Inc.
++;
++; This file is part of GCC.
++;
++; GCC is free software; you can redistribute it and/or modify it under
++; the terms of the GNU General Public License as published by the Free
++; Software Foundation; either version 3, or (at your option) any later
++; version.
++;
++; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++; WARRANTY; without even the implied warranty of MERCHANTABILITY or
++; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++; for more details.
++;
++; You should have received a copy of the GNU General Public License
++; along with GCC; see the file COPYING3. If not see
++; <http://www.gnu.org/licenses/>.
++
++; See the GCC internals manual (options.texi) for a description of this file's format.
++
++; Please try to keep this file in ASCII collating order.
++
++assert
++Driver Separate
++
++assert=
++Driver JoinedOrMissing
++
++defsym
++Driver Separate
++
++defsym=
++Driver JoinedOrMissing
++
++posix
++Driver
++
++profile
++Driver
++
++pthread
++Driver
++
++rdynamic
++Driver
++
++rpath-link
++Driver Separate
++
++rpath-link=
++Driver JoinedOrMissing
++
++rpath=
++Driver JoinedOrMissing
++
++soname
++Driver Separate
++
++soname=
++Driver JoinedOrMissing
++
++; This comment is to ensure we retain the blank line above.
diff --git a/lang/gcc47/patches/patch-gcc_config_i386_dragonfly.h b/lang/gcc47/patches/patch-gcc_config_i386_dragonfly.h
new file mode 100644
index 00000000000..c360093a5b8
--- /dev/null
+++ b/lang/gcc47/patches/patch-gcc_config_i386_dragonfly.h
@@ -0,0 +1,106 @@
+$NetBSD: patch-gcc_config_i386_dragonfly.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- gcc/config/i386/dragonfly.h.orig 2012-06-22 10:35:29.000000000 +0000
++++ gcc/config/i386/dragonfly.h
+@@ -0,0 +1,101 @@
++/* Definitions for Intel 386 running DragonFly with ELF format
++ Copyright (C) 1996, 2000, 2002, 2004, 2007 Free Software Foundation, Inc.
++ Contributed by Eric Youngdale.
++ Modified for stabs-in-ELF by H.J. Lu.
++ Adapted from GNU/Linux version by John Polstra.
++ Continued development by David O'Brien <obrien@freebsd.org>
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3. If not see
++<http://www.gnu.org/licenses/>. */
++
++
++/* Override the default comment-starter of "/". */
++#undef ASM_COMMENT_START
++#define ASM_COMMENT_START "#"
++
++#undef ASM_APP_ON
++#define ASM_APP_ON "#APP\n"
++
++#undef ASM_APP_OFF
++#define ASM_APP_OFF "#NO_APP\n"
++
++#undef DBX_REGISTER_NUMBER
++#define DBX_REGISTER_NUMBER(n) \
++ (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
++
++#undef NO_PROFILE_COUNTERS
++#define NO_PROFILE_COUNTERS 1
++
++/* Tell final.c that we don't need a label passed to mcount. */
++
++#undef MCOUNT_NAME
++#define MCOUNT_NAME ".mcount"
++
++/* Make gcc agree with <machine/ansi.h>. */
++
++#undef SIZE_TYPE
++#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int")
++
++#undef PTRDIFF_TYPE
++#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
++
++#undef WCHAR_TYPE_SIZE
++#define WCHAR_TYPE_SIZE (TARGET_64BIT ? 32 : BITS_PER_WORD)
++
++#undef SUBTARGET_EXTRA_SPECS /* i386.h bogusly defines it. */
++#define SUBTARGET_EXTRA_SPECS \
++ { "dfbsd_dynamic_linker", DFBSD_DYNAMIC_LINKER }
++
++
++/* 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
++#undef ASM_OUTPUT_MAX_SKIP_ALIGN
++#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
++
++/* Don't default to pcc-struct-return, we want to retain compatibility with
++ older gcc versions AND pcc-struct-return is nonreentrant.
++ (even though 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 0
++
++/* DragonFly sets the rounding precision of the FPU to 53 bits, but GNAT
++ resets it to full precision. */
++#undef TARGET_96_ROUND_53_LONG_DOUBLE
++#define TARGET_96_ROUND_53_LONG_DOUBLE 0
++
++/* Put all *tf routines in libgcc. */
++#undef LIBGCC2_HAS_TF_MODE
++#define LIBGCC2_HAS_TF_MODE 1
++#define LIBGCC2_TF_CEXT q
++#define TF_SIZE 113
++
++/* Static stack checking is supported by means of probes. */
++#define STACK_CHECK_STATIC_BUILTIN 1
++
++/* Support for i386 has been removed from DragonFly for several releases */
++#define SUBTARGET32_DEFAULT_CPU "i486"
diff --git a/lang/gcc47/patches/patch-gcc_configure b/lang/gcc47/patches/patch-gcc_configure
new file mode 100644
index 00000000000..0ef815b0154
--- /dev/null
+++ b/lang/gcc47/patches/patch-gcc_configure
@@ -0,0 +1,29 @@
+$NetBSD: patch-gcc_configure,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+Add dl_iterate_phdr detection for FreeBSD and DragonFly.
+Detection for NetBSD and OpenBSD is added but commented out in case this
+error handling mechanism is activated for these platforms later.
+
+--- gcc/configure.orig 2012-03-08 13:54:54.000000000 +0000
++++ gcc/configure
+@@ -26802,6 +26802,20 @@ case "$target" in
+ gcc_cv_target_dl_iterate_phdr=no
+ fi
+ ;;
++ *-*-dragonfly* | *-*-freebsd*)
++ if grep dl_iterate_phdr $target_header_dir/sys/link_elf.h > /dev/null 2>&1; then
++ gcc_cv_target_dl_iterate_phdr=yes
++ else
++ gcc_cv_target_dl_iterate_phdr=no
++ fi
++ ;;
++# *-*-netbsd* | *-*-openbsd*)
++# if grep dl_iterate_phdr $target_header_dir/link_elf.h > /dev/null 2>&1; then
++# gcc_cv_target_dl_iterate_phdr=yes
++# else
++# gcc_cv_target_dl_iterate_phdr=no
++# fi
++# ;;
+ esac
+
+ if test x$gcc_cv_target_dl_iterate_phdr = xyes; then
diff --git a/lang/gcc47/patches/patch-gcc_ginclude_stddef.h b/lang/gcc47/patches/patch-gcc_ginclude_stddef.h
index ebcb6643ff7..a7c8511c92e 100644
--- a/lang/gcc47/patches/patch-gcc_ginclude_stddef.h
+++ b/lang/gcc47/patches/patch-gcc_ginclude_stddef.h
@@ -1,11 +1,12 @@
-$NetBSD: patch-gcc_ginclude_stddef.h,v 1.1.1.1 2012/04/16 04:27:18 sbd Exp $
+$NetBSD: patch-gcc_ginclude_stddef.h,v 1.2 2012/06/23 22:13:02 marino Exp $
Fix build on NetBSD i386/amd64 after the ansi.h header include protection
name change.
+Add DragonFly support.
--- gcc/ginclude/stddef.h.orig 2012-02-12 01:06:04.000000000 +0000
+++ gcc/ginclude/stddef.h
-@@ -53,6 +53,11 @@ see the files COPYING3 and COPYING.RUNTI
+@@ -53,12 +53,21 @@ see the files COPYING3 and COPYING.RUNTI
one less case to deal with in the following. */
#if defined (__BSD_NET2__) || defined (____386BSD____) || (defined (__FreeBSD__) && (__FreeBSD__ < 5)) || defined(__NetBSD__)
#include <machine/ansi.h>
@@ -17,3 +18,51 @@ name change.
#endif
/* On FreeBSD 5, machine/ansi.h does not exist anymore... */
#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
+ #include <sys/_types.h>
+ #endif
+
++#if defined(__DragonFly__)
++#include <sys/types.h>
++#endif
++
+ /* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are
+ defined if the corresponding type is *not* defined.
+ FreeBSD-2.1 defines _MACHINE_ANSI_H_ instead of _ANSI_H_.
+@@ -136,6 +145,7 @@ _TYPE_wchar_t;
+ #ifndef _BSD_PTRDIFF_T_
+ #ifndef ___int_ptrdiff_t_h
+ #ifndef _GCC_PTRDIFF_T
++#ifndef _PTRDIFF_T_DECLARED /* DragonFly */
+ #define _PTRDIFF_T
+ #define _T_PTRDIFF_
+ #define _T_PTRDIFF
+@@ -144,10 +154,12 @@ _TYPE_wchar_t;
+ #define _BSD_PTRDIFF_T_
+ #define ___int_ptrdiff_t_h
+ #define _GCC_PTRDIFF_T
++#define _PTRDIFF_T_DECLARED
+ #ifndef __PTRDIFF_TYPE__
+ #define __PTRDIFF_TYPE__ long int
+ #endif
+ typedef __PTRDIFF_TYPE__ ptrdiff_t;
++#endif /* _PTRDIFF_T_DECLARED */
+ #endif /* _GCC_PTRDIFF_T */
+ #endif /* ___int_ptrdiff_t_h */
+ #endif /* _BSD_PTRDIFF_T_ */
+@@ -201,6 +213,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+ #define _GCC_SIZE_T
+ #define _SIZET_
+ #if (defined (__FreeBSD__) && (__FreeBSD__ >= 5)) \
++ || defined(__DragonFly__) \
+ || defined(__FreeBSD_kernel__)
+ /* __size_t is a typedef on FreeBSD 5, must not trash it. */
+ #else
+@@ -307,7 +320,7 @@ typedef _BSD_RUNE_T_ rune_t;
+ /* FreeBSD 5 can't be handled well using "traditional" logic above
+ since it no longer defines _BSD_RUNE_T_ yet still desires to export
+ rune_t in some cases... */
+-#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
++#if defined (__DragonFly__) || (defined (__FreeBSD__) && (__FreeBSD__ >= 5))
+ #if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE)
+ #if __BSD_VISIBLE
+ #ifndef _RUNE_T_DECLARED
diff --git a/lang/gcc47/patches/patch-include_libiberty.h b/lang/gcc47/patches/patch-include_libiberty.h
new file mode 100644
index 00000000000..95328d21d1a
--- /dev/null
+++ b/lang/gcc47/patches/patch-include_libiberty.h
@@ -0,0 +1,22 @@
+$NetBSD: patch-include_libiberty.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- include/libiberty.h.orig 2011-09-28 19:04:30.000000000 +0000
++++ include/libiberty.h
+@@ -106,7 +106,16 @@ extern int countargv (char**);
+ to find the declaration so provide a fully prototyped one. If it
+ is 1, we found it so don't provide any declaration at all. */
+ #if !HAVE_DECL_BASENAME
+-#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME)
++#if defined (__GNU_LIBRARY__ ) \
++ || defined (__linux__) \
++ || defined (__DragonFly__) \
++ || defined (__FreeBSD__) \
++ || defined (__OpenBSD__) \
++ || defined (__NetBSD__) \
++ || defined (__CYGWIN__) \
++ || defined (__CYGWIN32__) \
++ || defined (__MINGW32__) \
++ || defined (HAVE_DECL_BASENAME)
+ extern char *basename (const char *);
+ #else
+ /* Do not allow basename to be used if there is no prototype seen. We
diff --git a/lang/gcc47/patches/patch-libgcc_config.host b/lang/gcc47/patches/patch-libgcc_config.host
new file mode 100644
index 00000000000..a6af4dfef88
--- /dev/null
+++ b/lang/gcc47/patches/patch-libgcc_config.host
@@ -0,0 +1,47 @@
+$NetBSD: patch-libgcc_config.host,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libgcc/config.host.orig 2012-02-20 21:19:55.000000000 +0000
++++ libgcc/config.host
+@@ -174,6 +174,11 @@ case ${host} in
+ tmake_file="$tmake_file t-darwin ${cpu_type}/t-darwin t-libgcc-pic t-slibgcc-darwin"
+ extra_parts="crt3.o crttms.o crttme.o"
+ ;;
++*-*-dragonfly*)
++ tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip"
++ tmake_file="$tmake_file t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver"
++ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o"
++ ;;
+ *-*-freebsd*)
+ # This is the generic ELF configuration of FreeBSD. Later
+ # machine-specific sections may refine and add to this
+@@ -267,6 +272,7 @@ esac
+
+ case ${host} in
+ *-*-darwin* | *-*-freebsd* | *-*-netbsd* | *-*-openbsd* | *-*-solaris2* | \
++ *-*-dragonfly* | \
+ alpha*-dec-osf5.1*)
+ enable_execute_stack=enable-execute-stack-mprotect.c
+ ;;
+@@ -523,6 +529,14 @@ i[34567]86-*-elf*)
+ x86_64-*-elf*)
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic"
+ ;;
++i[34567]86-*-dragonfly*)
++ tmake_file="${tmake_file} i386/t-dragonfly i386/t-crtstuff"
++ md_unwind_header=i386/dragonfly-unwind.h
++ ;;
++x86_64-*-dragonfly*)
++ tmake_file="${tmake_file} i386/t-dragonfly i386/t-crtstuff"
++ md_unwind_header=i386/dragonfly-unwind.h
++ ;;
+ i[34567]86-*-freebsd*)
+ tmake_file="${tmake_file} i386/t-freebsd i386/t-crtstuff"
+ ;;
+@@ -1156,6 +1170,7 @@ i[34567]86-*-darwin* | x86_64-*-darwin*
+ i[34567]86-*-gnu* | \
+ i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]* | \
+ i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw* | \
++ i[34567]86-*-dragonfly* | x86_64-*-dragonfly* | \
+ i[34567]86-*-freebsd* | x86_64-*-freebsd*)
+ tmake_file="${tmake_file} t-softfp-tf"
+ if test "${host_address}" = 32; then
diff --git a/lang/gcc47/patches/patch-libgcc_config_i386_dragonfly-unwind.h b/lang/gcc47/patches/patch-libgcc_config_i386_dragonfly-unwind.h
new file mode 100644
index 00000000000..ec95c3e73b0
--- /dev/null
+++ b/lang/gcc47/patches/patch-libgcc_config_i386_dragonfly-unwind.h
@@ -0,0 +1,163 @@
+$NetBSD: patch-libgcc_config_i386_dragonfly-unwind.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libgcc/config/i386/dragonfly-unwind.h.orig 2012-06-22 10:35:29.000000000 +0000
++++ libgcc/config/i386/dragonfly-unwind.h
+@@ -0,0 +1,158 @@
++/* DWARF2 EH unwinding support for DragonFly BSD: AMD x86-64 and x86.
++ Copyright (C) 2010 John Marino <draco@marino.st> */
++
++/* Do code reading to identify a signal frame, and set the frame
++ state data appropriately. See unwind-dw2.c for the structs. */
++
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#include <signal.h>
++#include <sys/ucontext.h>
++#include <machine/sigframe.h>
++
++
++#define REG_NAME(reg) sf_uc.uc_mcontext.mc_## reg
++
++#ifdef __x86_64__
++#define MD_FALLBACK_FRAME_STATE_FOR x86_64_dragonfly_fallback_frame_state
++
++
++static void
++x86_64_sigtramp_range (unsigned char **start, unsigned char **end)
++{
++ unsigned long ps_strings;
++ int mib[2];
++ size_t len;
++
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PS_STRINGS;
++ len = sizeof (ps_strings);
++ sysctl (mib, 2, &ps_strings, &len, NULL, 0);
++
++ *start = (unsigned char *)ps_strings - 32;
++ *end = (unsigned char *)ps_strings;
++}
++
++
++static _Unwind_Reason_Code
++x86_64_dragonfly_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ unsigned char *pc = context->ra;
++ unsigned char *sigtramp_start, *sigtramp_end;
++ struct sigframe *sf;
++ long new_cfa;
++
++ x86_64_sigtramp_range(&sigtramp_start, &sigtramp_end);
++ if (pc >= sigtramp_end || pc < sigtramp_start)
++ return _URC_END_OF_STACK;
++
++ sf = (struct sigframe *) context->cfa;
++ new_cfa = sf->REG_NAME(rsp);
++ fs->regs.cfa_how = CFA_REG_OFFSET;
++ /* Register 7 is rsp */
++ fs->regs.cfa_reg = 7;
++ fs->regs.cfa_offset = new_cfa - (long) context->cfa;
++
++ /* The SVR4 register numbering macros aren't usable in libgcc. */
++ fs->regs.reg[0].how = REG_SAVED_OFFSET;
++ fs->regs.reg[0].loc.offset = (long)&sf->REG_NAME(rax) - new_cfa;
++ fs->regs.reg[1].how = REG_SAVED_OFFSET;
++ fs->regs.reg[1].loc.offset = (long)&sf->REG_NAME(rdx) - new_cfa;
++ fs->regs.reg[2].how = REG_SAVED_OFFSET;
++ fs->regs.reg[2].loc.offset = (long)&sf->REG_NAME(rcx) - new_cfa;
++ fs->regs.reg[3].how = REG_SAVED_OFFSET;
++ fs->regs.reg[3].loc.offset = (long)&sf->REG_NAME(rbx) - new_cfa;
++ fs->regs.reg[4].how = REG_SAVED_OFFSET;
++ fs->regs.reg[4].loc.offset = (long)&sf->REG_NAME(rsi) - new_cfa;
++ fs->regs.reg[5].how = REG_SAVED_OFFSET;
++ fs->regs.reg[5].loc.offset = (long)&sf->REG_NAME(rdi) - new_cfa;
++ fs->regs.reg[6].how = REG_SAVED_OFFSET;
++ fs->regs.reg[6].loc.offset = (long)&sf->REG_NAME(rbp) - new_cfa;
++ fs->regs.reg[8].how = REG_SAVED_OFFSET;
++ fs->regs.reg[8].loc.offset = (long)&sf->REG_NAME(r8) - new_cfa;
++ fs->regs.reg[9].how = REG_SAVED_OFFSET;
++ fs->regs.reg[9].loc.offset = (long)&sf->REG_NAME(r9) - new_cfa;
++ fs->regs.reg[10].how = REG_SAVED_OFFSET;
++ fs->regs.reg[10].loc.offset = (long)&sf->REG_NAME(r10) - new_cfa;
++ fs->regs.reg[11].how = REG_SAVED_OFFSET;
++ fs->regs.reg[11].loc.offset = (long)&sf->REG_NAME(r11) - new_cfa;
++ fs->regs.reg[12].how = REG_SAVED_OFFSET;
++ fs->regs.reg[12].loc.offset = (long)&sf->REG_NAME(r12) - new_cfa;
++ fs->regs.reg[13].how = REG_SAVED_OFFSET;
++ fs->regs.reg[13].loc.offset = (long)&sf->REG_NAME(r13) - new_cfa;
++ fs->regs.reg[14].how = REG_SAVED_OFFSET;
++ fs->regs.reg[14].loc.offset = (long)&sf->REG_NAME(r14) - new_cfa;
++ fs->regs.reg[15].how = REG_SAVED_OFFSET;
++ fs->regs.reg[15].loc.offset = (long)&sf->REG_NAME(r15) - new_cfa;
++ fs->regs.reg[16].how = REG_SAVED_OFFSET;
++ fs->regs.reg[16].loc.offset = (long)&sf->REG_NAME(rip) - new_cfa;
++ fs->retaddr_column = 16;
++ fs->signal_frame = 1;
++ return _URC_NO_REASON;
++}
++
++#else /* Next section is for i386 */
++
++#define MD_FALLBACK_FRAME_STATE_FOR x86_dragonfly_fallback_frame_state
++
++
++static void
++x86_sigtramp_range (unsigned char **start, unsigned char **end)
++{
++ unsigned long ps_strings;
++ int mib[2];
++ size_t len;
++
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PS_STRINGS;
++ len = sizeof (ps_strings);
++ sysctl (mib, 2, &ps_strings, &len, NULL, 0);
++
++ *start = (unsigned char *)ps_strings - 128;
++ *end = (unsigned char *)ps_strings;
++}
++
++
++static _Unwind_Reason_Code
++x86_dragonfly_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ unsigned char *pc = context->ra;
++ unsigned char *sigtramp_start, *sigtramp_end;
++ struct sigframe *sf;
++ long new_cfa;
++
++ x86_sigtramp_range(&sigtramp_start, &sigtramp_end);
++
++ if (pc >= sigtramp_end || pc < sigtramp_start)
++ return _URC_END_OF_STACK;
++
++ sf = (struct sigframe *) context->cfa;
++ new_cfa = sf->REG_NAME(esp);
++ fs->regs.cfa_how = CFA_REG_OFFSET;
++ fs->regs.cfa_reg = 4;
++ fs->regs.cfa_offset = new_cfa - (long) context->cfa;
++
++ /* The SVR4 register numbering macros aren't usable in libgcc. */
++ fs->regs.reg[0].how = REG_SAVED_OFFSET;
++ fs->regs.reg[0].loc.offset = (long)&sf->REG_NAME(eax) - new_cfa;
++ fs->regs.reg[3].how = REG_SAVED_OFFSET;
++ fs->regs.reg[3].loc.offset = (long)&sf->REG_NAME(ebx) - new_cfa;
++ fs->regs.reg[1].how = REG_SAVED_OFFSET;
++ fs->regs.reg[1].loc.offset = (long)&sf->REG_NAME(ecx) - new_cfa;
++ fs->regs.reg[2].how = REG_SAVED_OFFSET;
++ fs->regs.reg[2].loc.offset = (long)&sf->REG_NAME(edx) - new_cfa;
++ fs->regs.reg[6].how = REG_SAVED_OFFSET;
++ fs->regs.reg[6].loc.offset = (long)&sf->REG_NAME(esi) - new_cfa;
++ fs->regs.reg[7].how = REG_SAVED_OFFSET;
++ fs->regs.reg[7].loc.offset = (long)&sf->REG_NAME(edi) - new_cfa;
++ fs->regs.reg[5].how = REG_SAVED_OFFSET;
++ fs->regs.reg[5].loc.offset = (long)&sf->REG_NAME(ebp) - new_cfa;
++ fs->regs.reg[8].how = REG_SAVED_OFFSET;
++ fs->regs.reg[8].loc.offset = (long)&sf->REG_NAME(eip) - new_cfa;
++ fs->retaddr_column = 8;
++ fs->signal_frame = 1;
++ return _URC_NO_REASON;
++}
++#endif /* ifdef __x86_64__ */
diff --git a/lang/gcc47/patches/patch-libgcc_crtstuff.c b/lang/gcc47/patches/patch-libgcc_crtstuff.c
new file mode 100644
index 00000000000..ee6e2fbf5f6
--- /dev/null
+++ b/lang/gcc47/patches/patch-libgcc_crtstuff.c
@@ -0,0 +1,29 @@
+$NetBSD: patch-libgcc_crtstuff.c,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+Currently dl_iterate_phdr error handling is hardcoded for FreeBSD 7+
+Expand code to handle all BSDs even though detection is only active for
+FreeBSD and DragonFly currently.
+
+--- libgcc/crtstuff.c.orig 2011-12-06 21:35:41.000000000 +0000
++++ libgcc/crtstuff.c
+@@ -81,11 +81,19 @@ call_ ## FUNC (void) \
+ }
+ #endif
+
++#if defined(TARGET_DL_ITERATE_PHDR) && \
++ ( defined(__FreeBSD__) \
++ || defined(__OpenBSD__) \
++ || defined(__NetBSD__) \
++ || defined(__DragonFly__))
++#define BSD_DL_ITERATE_PHDR_AVAILABLE
++#endif
++
+ #if defined(OBJECT_FORMAT_ELF) \
+ && !defined(OBJECT_FORMAT_FLAT) \
+ && defined(HAVE_LD_EH_FRAME_HDR) \
+ && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
+- && defined(__FreeBSD__) && __FreeBSD__ >= 7
++ && defined(BSD_DL_ITERATE_PHDR_AVAILABLE)
+ #include <link.h>
+ # define USE_PT_GNU_EH_FRAME
+ #endif
diff --git a/lang/gcc47/patches/patch-libgcc_unwind-dw2-fde-dip.c b/lang/gcc47/patches/patch-libgcc_unwind-dw2-fde-dip.c
new file mode 100644
index 00000000000..d48bffc3c7d
--- /dev/null
+++ b/lang/gcc47/patches/patch-libgcc_unwind-dw2-fde-dip.c
@@ -0,0 +1,29 @@
+$NetBSD: patch-libgcc_unwind-dw2-fde-dip.c,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+Add dl_iterate_phdr error handling support for all BSDs. The NetBSD and
+OpenBSD code will not run until dl_iterate_phdr detection in the configure
+script is uncommented.
+
+--- libgcc/unwind-dw2-fde-dip.c.orig 2011-11-02 15:26:35.000000000 +0000
++++ libgcc/unwind-dw2-fde-dip.c
+@@ -54,11 +54,19 @@
+ #endif
+
+ #if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \
+- && defined(__FreeBSD__) && __FreeBSD__ >= 7
++ && defined(TARGET_DL_ITERATE_PHDR) \
++ && (defined(__FreeBSD__) || defined(__DragonFly__))
+ # define ElfW __ElfN
+ # define USE_PT_GNU_EH_FRAME
+ #endif
+
++#if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \
++ && defined(TARGET_DL_ITERATE_PHDR) \
++ && (defined(__OpenBSD__) || defined(__NetBSD__))
++# define ElfW(n) Elf_##n
++# define USE_PT_GNU_EH_FRAME
++#endif
++
+ #if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \
+ && defined(TARGET_DL_ITERATE_PHDR) \
+ && defined(__sun__) && defined(__svr4__)
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc b/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc
new file mode 100644
index 00000000000..2815686e13c
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc
@@ -0,0 +1,305 @@
+$NetBSD: patch-libstdc++-v3_config_locale_dragonfly_c__locale.cc,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/locale/dragonfly/c_locale.cc.orig 2012-06-22 10:35:30.000000000 +0000
++++ libstdc++-v3/config/locale/dragonfly/c_locale.cc
+@@ -0,0 +1,300 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
++// 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.8 Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno> // For errno
++#include <cmath> // For isinf, finite, finitef, fabs
++#include <cstdlib> // For strof, strtold
++#include <cstring>
++#include <cstdio>
++#include <locale>
++#include <limits>
++
++#ifdef _GLIBCXX_HAVE_IEEEFP_H
++#include <ieeefp.h>
++#endif
++
++namespace std _GLIBCXX_VISIBILITY(default)
++{
++_GLIBCXX_BEGIN_NAMESPACE_VERSION
++
++ template<>
++ void
++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
++ const __c_locale&) throw()
++ {
++ // Assumes __s formatted for "C" locale.
++ char* __old = setlocale(LC_ALL, 0);
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++ char* __sanity;
++ bool __overflow = false;
++
++#if !__FLT_HAS_INFINITY__
++ errno = 0;
++#endif
++
++#ifdef _GLIBCXX_HAVE_STRTOF
++ __v = strtof(__s, &__sanity);
++#else
++ double __d = strtod(__s, &__sanity);
++ __v = static_cast<float>(__d);
++#ifdef _GLIBCXX_HAVE_FINITEF
++ if (!finitef (__v))
++ __overflow = true;
++#elif defined (_GLIBCXX_HAVE_FINITE)
++ if (!finite (static_cast<double> (__v)))
++ __overflow = true;
++#elif defined (_GLIBCXX_HAVE_ISINF)
++ if (isinf (static_cast<double> (__v)))
++ __overflow = true;
++#else
++ if (fabs(__d) > numeric_limits<float>::max())
++ __overflow = true;
++#endif
++#endif // _GLIBCXX_HAVE_STRTOF
++
++ // _GLIBCXX_RESOLVE_LIB_DEFECTS
++ // 23. Num_get overflow result.
++ if (__sanity == __s || *__sanity != '\0')
++ {
++ __v = 0.0f;
++ __err = ios_base::failbit;
++ }
++ else if (__overflow
++#if __FLT_HAS_INFINITY__
++ || __v == numeric_limits<float>::infinity()
++ || __v == -numeric_limits<float>::infinity()
++#else
++ || ((__v > 1.0f || __v < -1.0f) && errno == ERANGE)
++#endif
++ )
++ {
++ if (__v > 0.0f)
++ __v = numeric_limits<float>::max();
++ else
++ __v = -numeric_limits<float>::max();
++ __err = ios_base::failbit;
++ }
++
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
++
++ template<>
++ void
++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
++ const __c_locale&) throw()
++ {
++ // Assumes __s formatted for "C" locale.
++ char* __old = setlocale(LC_ALL, 0);
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++ char* __sanity;
++
++#if !__DBL_HAS_INFINITY__
++ errno = 0;
++#endif
++
++ __v = strtod(__s, &__sanity);
++
++ // _GLIBCXX_RESOLVE_LIB_DEFECTS
++ // 23. Num_get overflow result.
++ if (__sanity == __s || *__sanity != '\0')
++ {
++ __v = 0.0;
++ __err = ios_base::failbit;
++ }
++ else if (
++#if __DBL_HAS_INFINITY__
++ __v == numeric_limits<double>::infinity()
++ || __v == -numeric_limits<double>::infinity())
++#else
++ (__v > 1.0 || __v < -1.0) && errno == ERANGE)
++#endif
++ {
++ if (__v > 0.0)
++ __v = numeric_limits<double>::max();
++ else
++ __v = -numeric_limits<double>::max();
++ __err = ios_base::failbit;
++ }
++
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
++
++ template<>
++ void
++ __convert_to_v(const char* __s, long double& __v,
++ ios_base::iostate& __err, const __c_locale&) throw()
++ {
++ // Assumes __s formatted for "C" locale.
++ char* __old = setlocale(LC_ALL, 0);
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++
++#if !__LDBL_HAS_INFINITY__
++ errno = 0;
++#endif
++
++#if defined(_GLIBCXX_HAVE_STRTOLD) && !defined(_GLIBCXX_HAVE_BROKEN_STRTOLD)
++ char* __sanity;
++ __v = strtold(__s, &__sanity);
++
++ // _GLIBCXX_RESOLVE_LIB_DEFECTS
++ // 23. Num_get overflow result.
++ if (__sanity == __s || *__sanity != '\0')
++#else
++ typedef char_traits<char>::int_type int_type;
++ int __p = sscanf(__s, "%Lf", &__v);
++
++ if (!__p || static_cast<int_type>(__p) == char_traits<char>::eof())
++#endif
++ {
++ __v = 0.0l;
++ __err = ios_base::failbit;
++ }
++ else if (
++#if __LDBL_HAS_INFINITY__
++ __v == numeric_limits<long double>::infinity()
++ || __v == -numeric_limits<long double>::infinity())
++#else
++ (__v > 1.0l || __v < -1.0l) && errno == ERANGE)
++#endif
++ {
++ if (__v > 0.0l)
++ __v = numeric_limits<long double>::max();
++ else
++ __v = -numeric_limits<long double>::max();
++ __err = ios_base::failbit;
++ }
++
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
++
++
++ /* DragonFly's implementation of setlocale won't accept something like
++ "de_DE". According to nls manpage, the expected format is:
++ language[_territory][.codeset][@modifier], but it seems that both
++ the _territory and .codeset components are required.
++
++ As an attempt to correct for this, we'll tack on ".UTF-8" if
++ a period is not detected in the locale string.
++
++ There are no locales with modifiers on DragonFly so if found, they
++ will just be stripped off silently. e.g "de_DE@euro" will be reduced
++ to "de_DE". The UTF-8 default would be added after that.
++ */
++
++ void
++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,
++ __c_locale)
++ {
++ const size_t size__s = (__s == NULL) ? 1 : strlen (__s);
++ const char UTF8[] = ".UTF-8";
++ char localspec[size__s + 6 + 1];
++
++ if (__s == NULL) {
++ localspec[0] = NULL;
++ } else {
++ strcpy (localspec, __s);
++ char * pch = strchr (localspec, '@');
++ if (pch != NULL)
++ *pch = 0;
++
++ if ( (strchr (__s, '.') == NULL)
++ && (strcmp (__s, "C") != 0)
++ && (strcmp (__s, "POSIX") != 0))
++ strncat (localspec, UTF8, 6);
++ }
++
++ const char * result = std::setlocale(LC_ALL, localspec);
++
++ if ((strcmp(result, "C") != 0) && (strcmp (result, localspec) != 0))
++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++ "name not valid"));
++ __cloc = 0;
++ }
++
++ void
++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++ { __cloc = 0; }
++
++ __c_locale
++ locale::facet::_S_clone_c_locale(__c_locale&) throw()
++ { return __c_locale(); }
++
++ __c_locale
++ locale::facet::_S_lc_ctype_c_locale(__c_locale, const char*)
++ { return __c_locale(); }
++
++_GLIBCXX_END_NAMESPACE_VERSION
++} // namespace
++
++namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
++{
++_GLIBCXX_BEGIN_NAMESPACE_VERSION
++
++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++ {
++ "LC_CTYPE",
++ "LC_NUMERIC",
++ "LC_TIME",
++ "LC_COLLATE",
++ "LC_MONETARY",
++ "LC_MESSAGES"
++ };
++
++_GLIBCXX_END_NAMESPACE_VERSION
++} // namespace
++
++namespace std _GLIBCXX_VISIBILITY(default)
++{
++_GLIBCXX_BEGIN_NAMESPACE_VERSION
++
++ const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++
++_GLIBCXX_END_NAMESPACE_VERSION
++} // namespace
++
++// XXX GLIBCXX_ABI Deprecated
++#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
++#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
++ extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
++_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi);
++#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc b/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc
new file mode 100644
index 00000000000..814736dae37
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc
@@ -0,0 +1,179 @@
+$NetBSD: patch-libstdc++-v3_config_locale_dragonfly_ctype__members.cc,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/locale/dragonfly/ctype_members.cc.orig 2012-06-22 11:15:15.000000000 +0000
++++ libstdc++-v3/config/locale/dragonfly/ctype_members.cc
+@@ -0,0 +1,174 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
++// 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.2.1.1.2 ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++#include <cstdlib>
++#include <cstring>
++#include <cstdio>
++
++namespace std _GLIBCXX_VISIBILITY(default)
++{
++ // NB: The other ctype<char> specializations are in src/locale.cc and
++ // various /config/os/* files.
++
++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++ : ctype<char>(0, false, __refs)
++ {
++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++ {
++ this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
++ }
++ }
++
++ ctype_byname<char>::~ctype_byname()
++ { }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++ ctype<wchar_t>::__wmask_type
++ ctype<wchar_t>::_M_convert_to_wmask(
++ const mask __attribute__((__unused__)) __m) const throw()
++ {
++ // DragonFly uses the same codes for 'char' as 'wchar_t', so this routine
++ // never gets called.
++ return __wmask_type();
++ };
++
++ wchar_t
++ ctype<wchar_t>::do_toupper(wchar_t __c) const
++ { return towupper(__c); }
++
++ const wchar_t*
++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++ {
++ while (__lo < __hi)
++ {
++ *__lo = towupper(*__lo);
++ ++__lo;
++ }
++ return __hi;
++ }
++
++ wchar_t
++ ctype<wchar_t>::do_tolower(wchar_t __c) const
++ { return towlower(__c); }
++
++ const wchar_t*
++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++ {
++ while (__lo < __hi)
++ {
++ *__lo = towlower(*__lo);
++ ++__lo;
++ }
++ return __hi;
++ }
++
++ wchar_t
++ ctype<wchar_t>::
++ do_widen(char __c) const
++ { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++ const char*
++ ctype<wchar_t>::
++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++ {
++ while (__lo < __hi)
++ {
++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++ ++__lo;
++ ++__dest;
++ }
++ return __hi;
++ }
++
++ char
++ ctype<wchar_t>::
++ do_narrow(wchar_t __wc, char __dfault) const
++ {
++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++ return _M_narrow[__wc];
++ const int __c = wctob(__wc);
++ return (__c == EOF ? __dfault : static_cast<char>(__c));
++ }
++
++ const wchar_t*
++ ctype<wchar_t>::
++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
++ char* __dest) const
++ {
++ if (_M_narrow_ok)
++ while (__lo < __hi)
++ {
++ if (*__lo >= 0 && *__lo < 128)
++ *__dest = _M_narrow[*__lo];
++ else
++ {
++ const int __c = wctob(*__lo);
++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++ }
++ ++__lo;
++ ++__dest;
++ }
++ else
++ while (__lo < __hi)
++ {
++ const int __c = wctob(*__lo);
++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++ ++__lo;
++ ++__dest;
++ }
++ return __hi;
++ }
++
++ void
++ ctype<wchar_t>::_M_initialize_ctype() throw()
++ {
++ wint_t __i;
++ for (__i = 0; __i < 128; ++__i)
++ {
++ const int __c = wctob(__i);
++ if (__c == EOF)
++ break;
++ else
++ _M_narrow[__i] = static_cast<char>(__c);
++ }
++ if (__i == 128)
++ _M_narrow_ok = true;
++ else
++ _M_narrow_ok = false;
++ for (size_t __i = 0;
++ __i < sizeof(_M_widen) / sizeof(wint_t); ++__i)
++ _M_widen[__i] = btowc(__i);
++ }
++#endif // _GLIBCXX_USE_WCHAR_T
++}
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h
new file mode 100644
index 00000000000..02bc029bd28
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h
@@ -0,0 +1,65 @@
+$NetBSD: patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__base.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/os/bsd/dragonfly/ctype_base.h.orig 2012-06-22 10:35:30.000000000 +0000
++++ libstdc++-v3/config/os/bsd/dragonfly/ctype_base.h
+@@ -0,0 +1,60 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2003, 2009, 2010 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
++//
++
++// Information as gleaned from /usr/include/ctype.h on DragonFly.
++// Full details can be found from git repo at:
++// http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/ctype.h
++
++namespace std _GLIBCXX_VISIBILITY(default)
++{
++_GLIBCXX_BEGIN_NAMESPACE_VERSION
++
++ /// @brief Base class for ctype.
++ struct ctype_base
++ {
++ // Non-standard typedefs.
++ typedef const unsigned char* __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 uint16_t mask;
++ static const mask upper = _CTYPEMASK_U;
++ static const mask lower = _CTYPEMASK_L;
++ static const mask alpha = _CTYPEMASK_A;
++ static const mask digit = _CTYPEMASK_D;
++ static const mask xdigit = _CTYPEMASK_X;
++ static const mask space = _CTYPEMASK_S;
++ static const mask print = _CTYPEMASK_R;
++ static const mask graph = _CTYPEMASK_G;
++ static const mask cntrl = _CTYPEMASK_C;
++ static const mask punct = _CTYPEMASK_P;
++ static const mask alnum = _CTYPEMASK_A | _CTYPEMASK_D;
++ };
++
++_GLIBCXX_END_NAMESPACE_VERSION
++} // namespace
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc
new file mode 100644
index 00000000000..2c32ed60695
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc
@@ -0,0 +1,104 @@
+$NetBSD: patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__configure__char.cc,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc.orig 2012-06-22 10:35:30.000000000 +0000
++++ libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc
+@@ -0,0 +1,99 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2011 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/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h
new file mode 100644
index 00000000000..c0d6ebf406f
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h
@@ -0,0 +1,132 @@
+$NetBSD: patch-libstdc++-v3_config_os_bsd_dragonfly_ctype__inline.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/os/bsd/dragonfly/ctype_inline.h.orig 2012-06-22 10:35:30.000000000 +0000
++++ libstdc++-v3/config/os/bsd/dragonfly/ctype_inline.h
+@@ -0,0 +1,127 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2003, 2004, 2005, 2009, 2010
++// 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
++
++namespace std _GLIBCXX_VISIBILITY(default)
++{
++_GLIBCXX_BEGIN_NAMESPACE_VERSION
++
++ bool
++ ctype<char>::
++ is(mask __m, char __c) const
++ { return _M_table[(unsigned char)(__c)] & __m; }
++
++ const char*
++ ctype<char>::
++ is(const char* __low, const char* __high, mask* __vec) const
++ {
++ while (__low < __high)
++ *__vec++ = _M_table[*__low++];
++ return __high;
++ }
++
++ const char*
++ ctype<char>::
++ scan_is(mask __m, const char* __low, const char* __high) const
++ {
++ 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
++ {
++ while (__low < __high && this->is(__m, *__low) != 0)
++ ++__low;
++ return __low;
++ }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++ inline bool
++ ctype<wchar_t>::
++ do_is(mask __m, wchar_t __c) const
++ {
++ return __libc_ctype_ [__c + 1] & __m;
++ }
++
++ inline const wchar_t*
++ ctype<wchar_t>::
++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++ {
++ for (; __lo < __hi; ++__vec, ++__lo)
++ {
++ mask __m = 0;
++ if (isupper (*__lo)) __m |= _CTYPEMASK_U;
++ if (islower (*__lo)) __m |= _CTYPEMASK_L;
++ if (isdigit (*__lo)) __m |= _CTYPEMASK_D;
++ if (isspace (*__lo)) __m |= _CTYPEMASK_S;
++ if (ispunct (*__lo)) __m |= _CTYPEMASK_P;
++ if (isblank (*__lo)) __m |= _CTYPEMASK_B;
++ if (iscntrl (*__lo)) __m |= _CTYPEMASK_C;
++ if (isalpha (*__lo)) __m |= _CTYPEMASK_A;
++ if (isgraph (*__lo)) __m |= _CTYPEMASK_G;
++ if (isprint (*__lo)) __m |= _CTYPEMASK_R;
++ if (isxdigit(*__lo)) __m |= _CTYPEMASK_X;
++ /* alnum already covered = alpha | digit */
++
++ *__vec = __m;
++ }
++ return __hi;
++ }
++
++ inline const wchar_t*
++ ctype<wchar_t>::
++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++ {
++ while (__lo < __hi && !(__libc_ctype_ [*__lo + 1] & __m))
++ ++__lo;
++ return __lo;
++ }
++
++ inline const wchar_t*
++ ctype<wchar_t>::
++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++ {
++ while (__lo < __hi && (__libc_ctype_ [*__lo + 1] & __m))
++ ++__lo;
++ return __lo;
++ }
++#endif
++
++_GLIBCXX_END_NAMESPACE_VERSION
++} // namespace
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h
new file mode 100644
index 00000000000..16b7b5d69c9
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h
@@ -0,0 +1,46 @@
+$NetBSD: patch-libstdc++-v3_config_os_bsd_dragonfly_os__defines.h,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/config/os/bsd/dragonfly/os_defines.h.orig 2012-06-22 10:35:30.000000000 +0000
++++ libstdc++-v3/config/os/bsd/dragonfly/os_defines.h
+@@ -0,0 +1,41 @@
++// Specific definitions for BSD -*- C++ -*-
++
++// Copyright (C) 2000, 2009, 2010 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/>.
++
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here. This
++// file will come before all others.
++
++/* FreeBSD approach, likely a mistake for DragonFly.
++#define _GLIBCXX_USE_C99_CHECK 1
++#define _GLIBCXX_USE_C99_DYNAMIC (!(__ISO_C_VISIBLE >= 1999))
++#define _GLIBCXX_USE_C99_LONG_LONG_CHECK 1
++#define _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC (_GLIBCXX_USE_C99_DYNAMIC || !defined __LONG_LONG_SUPPORTED)
++#define _GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_CHECK 1
++#define _GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC defined _XOPEN_SOURCE
++*/
++
++#endif
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_configure b/lang/gcc47/patches/patch-libstdc++-v3_configure
new file mode 100644
index 00000000000..283ccb05a86
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_configure
@@ -0,0 +1,47 @@
+$NetBSD: patch-libstdc++-v3_configure,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/configure.orig 2012-03-02 07:13:55.000000000 +0000
++++ libstdc++-v3/configure
+@@ -15704,7 +15704,7 @@ $as_echo "stdio" >&6; }
+ if test "${enable_clocale+set}" = set; then :
+ enableval=$enable_clocale;
+ case "$enableval" in
+- generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto) ;;
++ generic|gnu|ieee_1003.1-2001|newlib|darwin|dragonfly|yes|no|auto) ;;
+ *) as_fn_error "Unknown argument to enable/disable clocale" "$LINENO" 5 ;;
+ esac
+
+@@ -15742,6 +15742,9 @@ fi
+ darwin* | freebsd*)
+ enable_clocale_flag=darwin
+ ;;
++ dragonfly*)
++ enable_clocale_flag=dragonfly
++ ;;
+ *)
+ if test x"$with_newlib" = x"yes"; then
+ enable_clocale_flag=newlib
+@@ -15883,6 +15886,23 @@ $as_echo "darwin or freebsd" >&6; }
+ CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+ ;;
++ dragonfly)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: dragonfly" >&5
++$as_echo "dragonfly" >&6; }
++
++ CLOCALE_H=config/locale/generic/c_locale.h
++ CLOCALE_CC=config/locale/dragonfly/c_locale.cc
++ CCODECVT_CC=config/locale/generic/codecvt_members.cc
++ CCOLLATE_CC=config/locale/generic/collate_members.cc
++ CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
++ CMESSAGES_H=config/locale/generic/messages_members.h
++ CMESSAGES_CC=config/locale/generic/messages_members.cc
++ CMONEY_CC=config/locale/generic/monetary_members.cc
++ CNUMERIC_CC=config/locale/generic/numeric_members.cc
++ CTIME_H=config/locale/generic/time_members.h
++ CTIME_CC=config/locale/generic/time_members.cc
++ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
++ ;;
+
+ gnu)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: gnu" >&5
diff --git a/lang/gcc47/patches/patch-libstdc++-v3_configure.host b/lang/gcc47/patches/patch-libstdc++-v3_configure.host
new file mode 100644
index 00000000000..365ae71d229
--- /dev/null
+++ b/lang/gcc47/patches/patch-libstdc++-v3_configure.host
@@ -0,0 +1,14 @@
+$NetBSD: patch-libstdc++-v3_configure.host,v 1.1 2012/06/23 22:13:02 marino Exp $
+
+--- libstdc++-v3/configure.host.orig 2012-02-10 18:10:12.000000000 +0000
++++ libstdc++-v3/configure.host
+@@ -239,6 +239,9 @@ case "${host_os}" in
+ os_include_dir="os/djgpp"
+ error_constants_dir="os/djgpp"
+ ;;
++ dragonfly*)
++ os_include_dir="os/bsd/dragonfly"
++ ;;
+ freebsd*)
+ os_include_dir="os/bsd/freebsd"
+ ;;