summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authormarino <marino@pkgsrc.org>2015-06-15 09:46:27 +0000
committermarino <marino@pkgsrc.org>2015-06-15 09:46:27 +0000
commitc294e958ded2e2fb74f874b363b3bdaee4576761 (patch)
tree068e1abe4c84b74e5be1683f45e1b68d20d12fdf /lang
parente8f50f38cea9b2571787551c7e28289796248c1a (diff)
downloadpkgsrc-c294e958ded2e2fb74f874b363b3bdaee4576761.tar.gz
Import lang/gcc5-aux based on gcc-5.1
This compiler package is not like the lang/gcc4* packages, but rather the lang/gcc-aux package which exists to bring GNAT, the Ada language compiler. The lang/gcc-aux package is based on gcc-4.9, and this package is based on gcc-5. This is the first gcc5 package in pkgsrc, and it does support C, C++, ObjC, and Fortran in addition to Ada thus it is very useful, but it does have a different purpose than other gcc ports. This port has had minimal testing. I verified GNAT passes 100% of the testsuite on NetBSD 6.1/amd64, but it has not been tested on any NetBSD 5, 7.0 or 7.99 platform yet. I don't have any hardware, so it will require using a VM or having others report failure/success. Due to similarity with lang/gcc-aux, chances are good that it will build and function properly on other platforms. See http://gcc.gnu.org/gcc-5/changes.html for more information about improvements over the gcc-4.9 series.
Diffstat (limited to 'lang')
-rw-r--r--lang/gcc5-aux/DESCR14
-rw-r--r--lang/gcc5-aux/Makefile341
-rw-r--r--lang/gcc5-aux/Makefile.testsuite130
-rw-r--r--lang/gcc5-aux/Makefile.version20
-rw-r--r--lang/gcc5-aux/buildlink3.mk24
-rw-r--r--lang/gcc5-aux/distinfo32
-rw-r--r--lang/gcc5-aux/files/diff-ada3826
-rw-r--r--lang/gcc5-aux/files/diff-ada-testsuite584
-rw-r--r--lang/gcc5-aux/files/diff-core622
-rw-r--r--lang/gcc5-aux/files/diff-cxx112
-rw-r--r--lang/gcc5-aux/files/diff-cxx-testsuite24
-rw-r--r--lang/gcc5-aux/files/diff-fortran42
-rw-r--r--lang/gcc5-aux/files/diff-gcc-testsuite46
-rw-r--r--lang/gcc5-aux/options.mk125
14 files changed, 5942 insertions, 0 deletions
diff --git a/lang/gcc5-aux/DESCR b/lang/gcc5-aux/DESCR
new file mode 100644
index 00000000000..0af924c68d1
--- /dev/null
+++ b/lang/gcc5-aux/DESCR
@@ -0,0 +1,14 @@
+The AUX compiler supports several languages: Ada, C, C++, Fortran and
+Objective-C. Since Ada support must be built by an Ada-capable compiler,
+only platforms for which a bootstrap compiler is available can build it.
+
+The AUX compiler is based on release versions of the Free Software
+Foundation's GNU Compiler Collection. It carries with it the GMGPL license,
+the modified version of the GPL that exempts generic instantiation from
+resulting in a GPL-licensed executable. It also carries the GCC Runtime
+Library Exception, so the resulting binaries have no licensing requirements.
+Binaries produced by the AUX compiler should be legally handled the same as
+binaries produced by any FSF compiler.
+
+This compiler implements the full Ada-83, Ada-95, Ada-2005 and Ada-2012
+standards.
diff --git a/lang/gcc5-aux/Makefile b/lang/gcc5-aux/Makefile
new file mode 100644
index 00000000000..2a92c3e6bbf
--- /dev/null
+++ b/lang/gcc5-aux/Makefile
@@ -0,0 +1,341 @@
+# $NetBSD: Makefile,v 1.1 2015/06/15 09:46:27 marino Exp $
+#
+
+PKGNAME= gcc5-aux-${SNAPSHOT}
+DISTNAME= ${IDENTIFICATION}
+CATEGORIES= lang
+MASTER_SITES= ${MASTER_SITE_GNU:=gcc/${IDENTIFICATION}/}
+DISTFILES= ${DISTNAME}.tar.bz2
+
+MAINTAINER= draco@marino.st
+HOMEPAGE= http://www.dragonlace.net/
+COMMENT= GNAT Ada compiler based on GCC ${GCC_BRANCH}
+LICENSE= gnu-gpl-v3 AND gnu-lgpl-v3
+
+LANGS= c ada c++
+USE_TOOLS+= gmake sed:run perl makeinfo bzip2 patch pod2man tar
+APPLY_DIFFS= core ada cxx
+
+.include "Makefile.version"
+.include "Makefile.testsuite"
+.include "../../mk/bsd.prefs.mk"
+.include "options.mk"
+
+# Requires bootstrap compiler, which is only available for on selected systems
+# Disable SunOS for now until multilib version can be built and tested.
+
+ONLY_FOR_PLATFORM= DragonFly-*-x86_64 \
+ FreeBSD-*-i386 \
+ FreeBSD-*-x86_64 \
+ NetBSD-[5-9]*-i386 \
+ NetBSD-[5-9]*-x86_64 \
+ SunOS-5.1[1-9]*-i386 \
+ SunOS-5.1[1-9]*-x86_64
+
+GARCH= ${MACHINE_ARCH:S/amd64/x86_64/}
+BLD_TARGET= ${GARCH}-aux-${LOWER_OPSYS}${OS_VERSION}
+OS_LABEL4VERS= [${OPSYS}${GARCH:M*64:S/amd_//:S/x86_//}]
+FULL_GNATGCC= NOT SET
+FULL_PATH= /sbin:/bin:/usr/sbin:/usr/bin:${PREFIX}/gcc-aux/bin:${PREFIX}/sbin:${PREFIX}/bin
+
+.if ${OPSYS} == DragonFly
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.dragonfly.36A.tar.bz2
+.endif
+
+.if ${OPSYS} == FreeBSD
+MODERN_BINUTILS= yes
+. if !empty(OS_VERSION:M[678].*)
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.freebsd.84.tar.bz2
+. else
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.freebsd.100B.tar.bz2
+. endif
+.endif
+
+.if ${OPSYS} == NetBSD
+. if !empty(OS_VERSION:M6.99.*)
+NSUFF= 7.0_DEV
+. elif !empty(OS_VERSION:M7.99.*)
+NSUFF= 8.0_DEV
+. else
+NSUFF= ${OS_VERSION}
+. endif
+. if ${GARCH} == i386
+NELF= elf
+. endif
+XLDF= -lm
+. if empty(OS_VERSION:M7.99.*)
+MODERN_BINUTILS= yes
+. endif
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.netbsd.614.tar.bz2
+BLD_TARGET= ${MACHINE_ARCH}-aux-netbsd${NELF}${NSUFF}
+. if ${OS_VERSION:R} == 5
+CORRECTIONS= g-socthi-bsd.adb
+CRXN= C5
+. else
+CORRECTIONS= g-socthi-bsd.adb g-socthi.ads \
+ s-osinte-netbsd.ads s-osprim-posix.adb
+CRXN= C6
+. endif
+C5_g-socthi-bsd.adb= Syscall_Socket/__socket30
+C6_g-socthi-bsd.adb= Syscall_Socket/__socket30
+C6_g-socthi.ads= C_Select/__select50
+C6_s-osinte-netbsd.ads= nanosleep/__nanosleep50 \
+ clock_getres/__clock_getres50 \
+ clock_gettime/__clock_gettime50
+C6_s-osprim-posix.adb= nanosleep/__nanosleep50 \
+ gettimeofday/__gettimeofday50
+.endif
+
+.if ${OPSYS} == SunOS
+SOL_OSV!= expr substr ${OS_VERSION} 3 2
+BLD_TARGET= ${MACHINE_ARCH}-aux-${LOWER_OPSYS}2.${SOL_OSV}
+BOOTSTRAP_COMPILER= ada-bootstrap.x86_64.solaris.511.tar.bz2
+. if ${ABI} == 64
+EXTRA_CONFARGS+= --enable-multilib
+. else
+COMPILER_ABI_SWITCH= -m32
+. endif
+MY_CONFIGURE_ENV+= OBJDUMP=${PREFIX}/bin/gobjdump
+MODERN_BINUTILS= yes
+NATIVE_LINKER!= which ld
+.endif
+
+.if defined(MODERN_BINUTILS)
+BUILDLINK_DEPMETHOD.binutils= full
+.include "../../devel/binutils/buildlink3.mk"
+EXTRA_CONFARGS+= --with-gnu-as --with-as=${PREFIX}/bin/gas
+MY_CONFIGURE_ENV+= AR=${PREFIX}/bin/gar
+MY_CONFIGURE_ENV+= AS=${PREFIX}/bin/gas
+MY_CONFIGURE_ENV+= NM=${PREFIX}/bin/gnm
+MY_CONFIGURE_ENV+= RANLIB=${PREFIX}/bin/granlib
+. if defined(NATIVE_LINKER)
+EXTRA_CONFARGS+= --without-gnu-ld --with-ld=${NATIVE_LINKER}
+. else
+EXTRA_CONFARGS+= --with-gnu-ld --with-ld=${PREFIX}/bin/gld.gold
+MY_CONFIGURE_ENV+= LD=${PREFIX}/bin/gld.gold
+. endif
+.else
+EXTRA_CONFARGS+= --with-gnu-ld --with-ld=/usr/bin/ld
+EXTRA_CONFARGS+= --with-gnu-as --with-as=/usr/bin/as
+.endif
+
+
+# define some important directories and files
+WRKSRC= ${WRKDIR}/gcc-${GCC_VERSION}
+BUILDDIR= ${WRKDIR}/build
+NEWBSDIR= ${WRKDIR}/newbs/bootstrap
+SYSLIBDIR= ${WRKDIR}/lib
+CFG_SCRIPT= ${WRKSRC}/configure
+REVFILE= ${WRKSRC}/gcc/REVISION
+PHASEFILE= ${WRKSRC}/gcc/DEV-PHASE
+BOOTSTRAP_PREFIX= ${WRKDIR}/bootstrap
+PKG_PREFIX= ${PREFIX}/gcc5-aux
+BSFILENAME= ada-bootstrap.${GARCH}.${LOWER_OPSYS}.${OS_VERSION:C/[A-Z_.-]//g}.tar
+
+
+# testing if gcc-aux is already installed - if so, use this compiler along with
+# its gnatlink, gnatbind, and gnatmake rather than the older bootstrap versions
+.if exists(${LOCALBASE}/gcc-aux/bin/ada)
+FULL_GNATGCC=${LOCALBASE}/gcc-aux/bin/ada
+FULL_GNATGXX=${LOCALBASE}/gcc-aux/bin/g++
+.endif
+
+
+.if ${FULL_GNATGCC} == "NOT SET"
+# here we know we need to install the bootstrap compiler
+. if defined(BOOTSTRAP_TRIPLET)
+FULL_GNATGCC=${BOOTSTRAP_PREFIX}/bin/gnatgcc
+. else
+FULL_GNATGCC=${BOOTSTRAP_PREFIX}/bin/gcc ${COMPILER_ABI_SWITCH}
+FULL_GNATGXX=${BOOTSTRAP_PREFIX}/bin/g++ ${COMPILER_ABI_SWITCH}
+. endif
+DISTFILES+= ${BOOTSTRAP_COMPILER}
+SITES.${BOOTSTRAP_COMPILER}= http://downloads.dragonlace.net/src/
+FULL_PATH=${BOOTSTRAP_PREFIX}/bin:/sbin:/bin:/usr/sbin:/usr/bin:${PREFIX}/sbin:${PREFIX}/bin
+.endif
+
+
+# for port maintenance, invoke "make mdi PLUS_BOOTSTRAPS=1"
+.if defined(PLUS_BOOTSTRAPS)
+MASTER_SITES= http://downloads.dragonlace.net/src/ \
+ ${MASTER_SITE_GNU:=gcc/${IDENTIFICATION}/}
+DISTFILES= \
+ ${DISTNAME}.tar.bz2 \
+ ada-bootstrap.i386.dragonfly.36A.tar.bz2 \
+ ada-bootstrap.i386.freebsd.84.tar.bz2 \
+ ada-bootstrap.i386.freebsd.100B.tar.bz2 \
+ ada-bootstrap.i386.netbsd.614.tar.bz2 \
+ ada-bootstrap.x86_64.dragonfly.36A.tar.bz2 \
+ ada-bootstrap.x86_64.freebsd.84.tar.bz2 \
+ ada-bootstrap.x86_64.freebsd.100B.tar.bz2 \
+ ada-bootstrap.x86_64.netbsd.614.tar.bz2 \
+ ada-bootstrap.x86_64.solaris.511.tar.bz2
+.endif
+
+# establish ada-aware compiler for use
+MY_CONFIGURE_ENV+= CC=${FULL_GNATGCC:Q}
+MY_CONFIGURE_ENV+= CXX=${FULL_GNATGXX:Q}
+MY_CONFIGURE_ENV+= PATH=${FULL_PATH}
+MY_CONFIGURE_ENV+= LDFLAGS="${XLDF} ${COMPILER_RPATH_FLAG}${PREFIX}/lib"
+MY_MAKE_ENV+= PATH=${FULL_PATH}
+MY_MAKE_ENV+= LD_LIBRARY_PATH=${BUILDDIR}/gcc${EXTRA_LLP}
+# ${WRKSRC}/fixincludes/ looks for sed and compiles the path to sed into
+# a binary so we need to make sure we give it the installed sed and not
+# the tool wrapped one.
+MY_MAKE_ENV+= ac_cv_path_SED=${TOOLS_SED}
+MY_MAKE_ENV+= lt_cv_path_SED=${TOOLS_SED}
+
+
+# The standard configuration options
+CONFIGURE_ARGS= --enable-languages=${LANGS:Q}
+CONFIGURE_ARGS+= --build=${BLD_TARGET}
+CONFIGURE_ARGS+= --prefix=${PKG_PREFIX:Q}
+CONFIGURE_ARGS+= --enable-threads=posix
+CONFIGURE_ARGS+= --enable-checking=release
+CONFIGURE_ARGS+= --disable-libmudflap
+CONFIGURE_ARGS+= --disable-libgomp
+CONFIGURE_ARGS+= --disable-libssp
+CONFIGURE_ARGS+= --disable-libcilkrts
+CONFIGURE_ARGS+= --disable-libitm
+CONFIGURE_ARGS+= ${EXTRA_CONFARGS}
+
+# Automatic package list generation
+GENERATE_PLIST= cd ${DESTDIR}${PREFIX};
+GENERATE_PLIST+= ${FIND} * \( -type f -or -type l \) | ${SORT} -dr;
+
+
+post-extract:
+ # Personalize GNAT for each different machine
+ @${ECHO} "-=> GCC AUX ${OS_LABEL4VERS}" > ${REVFILE}
+ @${ECHO} ${PHASE} > ${PHASEFILE}
+ # Apply required composite diff files
+.for suffix in ${APPLY_DIFFS}
+ @${ECHO} "Applying composite patch diff-${suffix}"
+ ${PATCH} -d ${WRKSRC} -s -E < ${FILESDIR}/diff-${suffix}
+.endfor
+ (cd ${WRKSRC}/libstdc++-v3/testsuite/22_locale && ${PERL5} -i \
+ -pe 's|ISO-8859|ISO8859|g;' \
+ -pe 's|ja_JP.eucjp|ja_JP.eucJP|g;' \
+ -pe 's|en_HK|zh_HK|g;' \
+ -pe 's|en_PH|en_NZ|g;' \
+ -pe 's|se_NO|no_NO|g;' \
+ -pe 's|es_MX|es_ES|g;' \
+ -pe 's|ru_RU.UTF8|ru_RU.UTF-8|g' ${LOCALE22FIX})
+.if ${OPSYS} == NetBSD
+. for sysfile in ${CORRECTIONS}
+. for pair in ${${CRXN}_${sysfile}}
+ ${PERL5} -pi -e 's|C, ${pair:H}, ".*"|C, ${pair:H}, "${pair:T}"|' \
+ ${WRKSRC}/gcc/ada/${sysfile}
+. endfor
+. endfor
+. if ${CRXN} == C5
+ ${PERL5} -pi -e 's|new int64_t|new int|' \
+ ${WRKSRC}/gcc/ada/s-osinte-netbsd.ads
+ ${PERL5} -pi -e 's|new Long_Integer|new Integer|' \
+ ${WRKSRC}/gcc/ada/s-osprim-posix.adb
+. endif
+.endif
+.if defined(STATIC_BUILD) || !empty(PKG_OPTIONS:Mbootstrap)
+. if ${OPSYS} != SunOS
+ # Ensure GNAT tools are built statically
+ ${PERL5} -pi -e 's/^GCC_LINK_FLAGS=.*/GCC_LINK_FLAGS=-static/' \
+ ${WRKSRC}/gcc/ada/gcc-interface/Makefile.in
+. endif
+.endif
+.if !exists(${LOCALBASE}/gcc-aux/bin/ada) && ${OPSYS} == SunOS
+ # In case /usr/pkg/bin/gas doesn't exist, establish fallback
+ ${LN} -s ${PREFIX}/bin/gas ${BOOTSTRAP_PREFIX}/bin/as
+.endif
+ # Illumos /usr/ccs binaries are symlinked to /usr/bin
+ # elfdump was present on OmniOS but not in Joyent dev area
+ ${PERL5} -i -pe 's|/usr/ccs/bin|/usr/bin|g;' \
+ -pe 's|readelf -s|greadelf -s|' ${WRKSRC}/contrib/make_sunver.pl
+ # Update LINK_SPEC to add gcc-aux lib runpath in every binary
+ @${ECHO} "Configuring LINK_SPEC runpath"
+ ${PERL5} -pi -e 's;\@PREFIX\@;${PREFIX};' \
+ ${WRKSRC}/gcc/config/dragonfly.h \
+ ${WRKSRC}/gcc/config/i386/freebsd.h \
+ ${WRKSRC}/gcc/config/i386/netbsd-elf.h
+
+.if defined(BOOTSTRAP_TRIPLET)
+ # Bootstrap compiler has statically linked z, gmp, mpc, mpfr and iconv
+ # The only shared lib is libc.so.7, so it should work for a long time.
+ # No longer used, only here to support future SunOS bootstrap generation
+
+ ${MKDIR} ${BOOTSTRAP_PREFIX}
+ ${MV} ${BOOTSTRAP_PREFIX}/../bin ${BOOTSTRAP_PREFIX}
+ ${MV} ${BOOTSTRAP_PREFIX}/../lib ${BOOTSTRAP_PREFIX}
+ ${MV} ${BOOTSTRAP_PREFIX}/../libexec ${BOOTSTRAP_PREFIX}
+ ${RM} -rf ${BOOTSTRAP_PREFIX}/lib/gcc/${BOOTSTRAP_TRIPLET}/include-fixed
+.endif
+
+
+do-configure:
+ ${MKDIR} ${BUILDDIR}
+ cd ${BUILDDIR} && ${SETENV} ${MY_CONFIGURE_ENV} \
+ ${CFG_SCRIPT} ${CONFIGURE_ARGS}
+
+
+do-build:
+ # The unlimited stacksize is for NetBSD64
+ cd ${BUILDDIR} && \
+ ${ULIMIT_CMD_stacksize} && \
+ ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -j${MAKE_JOBS:U1:Q} all
+
+
+.if !empty(PKG_OPTIONS:Mtestsuite) && empty(PKG_OPTIONS:Mbootstrap)
+do-test: build test-ada test-fortran test-objc test-cxx test-c
+
+test-ada:
+.if (${OPSYS} == NetBSD) && (${MACHINE_ARCH} == x86_64)
+ # NetBSD has an extremely small default stacksize of 2MB, which is
+ # insufficient for the gnat.dg testsuite.
+ # specifically: entry_queues test on AMD64
+ # Unlimiting stack resources on i386-netbsdelf* will result in
+ # failure of gnat.dg/task_stack_align.adb execution test.
+ cd ${BUILDDIR} && \
+ ${ULIMIT_CMD_stacksize} && \
+ ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -sk check-ada
+.else
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} DEJAGNU_TIMEOUT=30 \
+ ${GMAKE} -sk check-ada
+.endif
+
+test-fortran:
+.if !empty(PKG_OPTIONS:Mfortran)
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -sk check-fortran
+.endif
+
+test-objc:
+.if !empty(PKG_OPTIONS:Mobjc)
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -sk check-objc
+.endif
+
+test-cxx:
+ # libstdc++ always ends with error status, so ignore it
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -sk \
+ check-c++ || ${TRUE}
+
+test-c:
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} ${GMAKE} -sk check-c
+.endif
+
+do-install:
+ cd ${BUILDDIR} && ${SETENV} ${MY_MAKE_ENV} ${GMAKE} install-strip \
+ DESTDIR=${DESTDIR}
+ ${MV} ${DESTDIR}${PKG_PREFIX}/share ${WRKDIR}/moved_share
+
+.if !empty(PKG_OPTIONS:Mbootstrap)
+create-bootstrap: stage-install
+ ${MKDIR} ${NEWBSDIR}
+ ${CP} -RpP ${DESTDIR}${PKG_PREFIX}/bin ${NEWBSDIR}/
+ ${CP} -RpP ${DESTDIR}${PKG_PREFIX}/lib ${NEWBSDIR}/
+ ${CP} -RpP ${DESTDIR}${PKG_PREFIX}/include ${NEWBSDIR}/
+ ${CP} -RpP ${DESTDIR}${PKG_PREFIX}/libexec ${NEWBSDIR}/
+ ${RM} ${NEWBSDIR}/bin/${GARCH}*
+ ${RM} -rf ${NEWBSDIR}/lib/gcc/${BLD_TARGET}/${GCC_VERSION}/include-fixed
+ (cd ${NEWBSDIR}/.. ; \
+ ${TAR} -cf ${BSFILENAME} bootstrap; ${BZIP2} ${BSFILENAME})
+.endif
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/lang/gcc5-aux/Makefile.testsuite b/lang/gcc5-aux/Makefile.testsuite
new file mode 100644
index 00000000000..e37a9a9cfbe
--- /dev/null
+++ b/lang/gcc5-aux/Makefile.testsuite
@@ -0,0 +1,130 @@
+# $NetBSD: Makefile.testsuite,v 1.1 2015/06/15 09:46:27 marino Exp $
+
+LOCALE22FIX= \
+ codecvt/always_noconv/char/wrapped_locale.cc \
+ codecvt/always_noconv/wchar_t/2.cc \
+ codecvt/always_noconv/wchar_t/3.cc \
+ codecvt/always_noconv/wchar_t/wrapped_locale.cc \
+ codecvt/encoding/char/wrapped_locale.cc \
+ codecvt/encoding/wchar_t/2.cc \
+ codecvt/encoding/wchar_t/3.cc \
+ codecvt/encoding/wchar_t/wrapped_locale.cc \
+ codecvt/in/char/wrapped_locale.cc \
+ codecvt/in/wchar_t/2.cc \
+ codecvt/in/wchar_t/3.cc \
+ codecvt/in/wchar_t/wrapped_locale.cc \
+ codecvt/length/char/wrapped_locale.cc \
+ codecvt/length/wchar_t/2.cc \
+ codecvt/length/wchar_t/3.cc \
+ codecvt/length/wchar_t/wrapped_locale.cc \
+ codecvt/max_length/char/wrapped_locale.cc \
+ codecvt/max_length/wchar_t/2.cc \
+ codecvt/max_length/wchar_t/3.cc \
+ codecvt/max_length/wchar_t/wrapped_locale.cc \
+ codecvt/out/char/wrapped_locale.cc \
+ codecvt/out/wchar_t/2.cc \
+ codecvt/out/wchar_t/3.cc \
+ codecvt/out/wchar_t/7.cc \
+ codecvt/out/wchar_t/wrapped_locale.cc \
+ codecvt/unshift/char/wrapped_locale.cc \
+ codecvt/unshift/wchar_t/2.cc \
+ codecvt/unshift/wchar_t/3.cc \
+ codecvt/unshift/wchar_t/wrapped_locale.cc \
+ collate/compare/char/wrapped_locale.cc \
+ collate/compare/wchar_t/wrapped_locale.cc \
+ collate/hash/char/wrapped_locale.cc \
+ collate/hash/wchar_t/wrapped_locale.cc \
+ collate/transform/char/wrapped_locale.cc \
+ collate/transform/wchar_t/wrapped_locale.cc \
+ ctype/cons/char/wrapped_locale.cc \
+ ctype/is/char/wrapped_locale.cc \
+ ctype/is/wchar_t/wrapped_locale.cc \
+ ctype/narrow/char/wrapped_locale.cc \
+ ctype/narrow/wchar_t/3.cc \
+ ctype/narrow/wchar_t/wrapped_locale.cc \
+ ctype/scan/char/wrapped_locale.cc \
+ ctype/scan/wchar_t/wrapped_locale.cc \
+ ctype/to/char/wrapped_locale.cc \
+ ctype/to/wchar_t/wrapped_locale.cc \
+ ctype/widen/char/wrapped_locale.cc \
+ ctype/widen/wchar_t/2.cc \
+ ctype/widen/wchar_t/3.cc \
+ ctype/widen/wchar_t/wrapped_locale.cc \
+ facet/2.cc \
+ locale/cons/40184.cc \
+ locale/cons/5.cc \
+ locale/cons/unicode.cc \
+ locale/global_locale_objects/2.cc \
+ messages/members/char/wrapped_locale.cc \
+ money_get/get/char/16.cc \
+ money_get/get/char/18.cc \
+ money_get/get/char/2.cc \
+ money_get/get/char/4.cc \
+ money_get/get/char/wrapped_env.cc \
+ money_get/get/char/wrapped_locale.cc \
+ money_get/get/wchar_t/16.cc \
+ money_get/get/wchar_t/18.cc \
+ money_get/get/wchar_t/2.cc \
+ money_get/get/wchar_t/4.cc \
+ money_get/get/wchar_t/wrapped_env.cc \
+ money_get/get/wchar_t/wrapped_locale.cc \
+ money_put/put/char/2.cc \
+ money_put/put/char/wrapped_env.cc \
+ money_put/put/char/wrapped_locale.cc \
+ money_put/put/wchar_t/2.cc \
+ money_put/put/wchar_t/wrapped_env.cc \
+ money_put/put/wchar_t/wrapped_locale.cc \
+ moneypunct/members/char/wrapped_locale.cc \
+ moneypunct/members/wchar_t/wrapped_locale.cc \
+ num_get/get/char/3.cc \
+ num_get/get/char/wrapped_env.cc \
+ num_get/get/char/wrapped_locale.cc \
+ num_get/get/wchar_t/3.cc \
+ num_get/get/wchar_t/wrapped_env.cc \
+ num_get/get/wchar_t/wrapped_locale.cc \
+ num_put/put/char/3.cc \
+ num_put/put/char/wrapped_env.cc \
+ num_put/put/char/wrapped_locale.cc \
+ num_put/put/wchar_t/3.cc \
+ num_put/put/wchar_t/wrapped_env.cc \
+ num_put/put/wchar_t/wrapped_locale.cc \
+ numpunct/members/char/wrapped_locale.cc \
+ numpunct/members/wchar_t/wrapped_locale.cc \
+ time_get/date_order/char/wrapped_locale.cc \
+ time_get/date_order/wchar_t/wrapped_locale.cc \
+ time_get/get_date/char/2.cc \
+ time_get/get_date/char/wrapped_env.cc \
+ time_get/get_date/char/wrapped_locale.cc \
+ time_get/get_date/wchar_t/2.cc \
+ time_get/get_date/wchar_t/wrapped_env.cc \
+ time_get/get_date/wchar_t/wrapped_locale.cc \
+ time_get/get_monthname/char/2.cc \
+ time_get/get_monthname/char/wrapped_env.cc \
+ time_get/get_monthname/char/wrapped_locale.cc \
+ time_get/get_monthname/wchar_t/2.cc \
+ time_get/get_monthname/wchar_t/wrapped_env.cc \
+ time_get/get_monthname/wchar_t/wrapped_locale.cc \
+ time_get/get_time/char/2.cc \
+ time_get/get_time/char/wrapped_env.cc \
+ time_get/get_time/char/wrapped_locale.cc \
+ time_get/get_time/wchar_t/2.cc \
+ time_get/get_time/wchar_t/wrapped_env.cc \
+ time_get/get_time/wchar_t/wrapped_locale.cc \
+ time_get/get_weekday/char/2.cc \
+ time_get/get_weekday/char/38081-1.cc \
+ time_get/get_weekday/char/38081-2.cc \
+ time_get/get_weekday/char/wrapped_env.cc \
+ time_get/get_weekday/char/wrapped_locale.cc \
+ time_get/get_weekday/wchar_t/2.cc \
+ time_get/get_weekday/wchar_t/wrapped_env.cc \
+ time_get/get_weekday/wchar_t/wrapped_locale.cc \
+ time_get/get_year/char/wrapped_locale.cc \
+ time_get/get_year/wchar_t/wrapped_locale.cc \
+ time_put/put/char/3.cc \
+ time_put/put/char/7.cc \
+ time_put/put/char/wrapped_env.cc \
+ time_put/put/char/wrapped_locale.cc \
+ time_put/put/wchar_t/3.cc \
+ time_put/put/wchar_t/7.cc \
+ time_put/put/wchar_t/wrapped_env.cc \
+ time_put/put/wchar_t/wrapped_locale.cc
diff --git a/lang/gcc5-aux/Makefile.version b/lang/gcc5-aux/Makefile.version
new file mode 100644
index 00000000000..e8b77ececcf
--- /dev/null
+++ b/lang/gcc5-aux/Makefile.version
@@ -0,0 +1,20 @@
+# $NetBSD: Makefile.version,v 1.1 2015/06/15 09:46:27 marino Exp $
+#
+
+SNAPSHOT= 20150422
+GCC_BRANCH= 5
+GCC_POINT= 1.0
+GCC_VERSION= ${GCC_BRANCH}.${GCC_POINT}
+BUILD_RELEASE= yes
+
+.if ${BUILD_RELEASE:Mno}
+# Snapshot naming pattern
+IDENTIFICATION= gcc-${GCC_BRANCH}-${SNAPSHOT}
+MS_SUBDIR= snapshots/${GCC_BRANCH}-${SNAPSHOT}
+PHASE= snapshot
+.else
+# Release naming pattern
+IDENTIFICATION= gcc-${GCC_VERSION}
+MS_SUBDIR= releases/gcc-${GCC_VERSION}
+PHASE= release
+.endif
diff --git a/lang/gcc5-aux/buildlink3.mk b/lang/gcc5-aux/buildlink3.mk
new file mode 100644
index 00000000000..06f5b6adbbc
--- /dev/null
+++ b/lang/gcc5-aux/buildlink3.mk
@@ -0,0 +1,24 @@
+# $NetBSD: buildlink3.mk,v 1.1 2015/06/15 09:46:27 marino Exp $
+
+BUILDLINK_TREE+= gcc5-aux
+
+.if !defined(GCC5_AUX_BUILDLINK3_MK)
+GCC5_AUX_BUILDLINK3_MK:=
+
+BUILDLINK_API_DEPENDS.gcc5-aux+= gcc5-aux>=20150422
+BUILDLINK_PKGSRCDIR.gcc5-aux?= ../../lang/gcc5-aux
+
+.include "../../converters/libiconv/buildlink3.mk"
+.include "../../devel/gmp/buildlink3.mk"
+.include "../../math/mpfr/buildlink3.mk"
+.include "../../math/mpcomplex/buildlink3.mk"
+
+pkgbase := gcc5-aux
+.include "../../mk/pkg-build-options.mk"
+
+.if !empty(PKG_BUILD_OPTIONS.gcc5-aux:Mnls)
+.include "../../devel/gettext-lib/buildlink3.mk"
+.endif
+.endif
+
+BUILDLINK_TREE+= -gcc5-aux
diff --git a/lang/gcc5-aux/distinfo b/lang/gcc5-aux/distinfo
new file mode 100644
index 00000000000..e9fe3277430
--- /dev/null
+++ b/lang/gcc5-aux/distinfo
@@ -0,0 +1,32 @@
+$NetBSD: distinfo,v 1.1 2015/06/15 09:46:27 marino Exp $
+
+SHA1 (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 7e0725889ae752e6a9fdbac5b1d2ef0e3f62822e
+RMD160 (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = f62c00515588804ce69368507822f30380d7e48d
+Size (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 39357314 bytes
+SHA1 (ada-bootstrap.i386.freebsd.100B.tar.bz2) = b7ff322bbcfa403d37d917d6e88e306de0857251
+RMD160 (ada-bootstrap.i386.freebsd.100B.tar.bz2) = 7a85e0f073dafe9b0d37b493dbb4268bd2f39601
+Size (ada-bootstrap.i386.freebsd.100B.tar.bz2) = 41229192 bytes
+SHA1 (ada-bootstrap.i386.freebsd.84.tar.bz2) = 54c3d59fd2ca75bb91255296bc0f9d6028ac2cd2
+RMD160 (ada-bootstrap.i386.freebsd.84.tar.bz2) = 8ceb3957708eb9ccc8ce2ff1ea26949683ee2fa7
+Size (ada-bootstrap.i386.freebsd.84.tar.bz2) = 39727003 bytes
+SHA1 (ada-bootstrap.i386.netbsd.614.tar.bz2) = 2c29209b086dcf3076428f232fadf306b9a227c6
+RMD160 (ada-bootstrap.i386.netbsd.614.tar.bz2) = f0ecb9b0d69c2d097c6405e0db581f606b372017
+Size (ada-bootstrap.i386.netbsd.614.tar.bz2) = 37900035 bytes
+SHA1 (ada-bootstrap.x86_64.dragonfly.36A.tar.bz2) = 85ceea8d0bd0d1b8c1f91ea6d7ffb2ffe4a4c7da
+RMD160 (ada-bootstrap.x86_64.dragonfly.36A.tar.bz2) = 7ca8ccff5a4400a7e4fc9ad1d11c64f3c92d54f4
+Size (ada-bootstrap.x86_64.dragonfly.36A.tar.bz2) = 40747242 bytes
+SHA1 (ada-bootstrap.x86_64.freebsd.100B.tar.bz2) = edfe60c5f42bbeb145d7070ed868135ebc60c2de
+RMD160 (ada-bootstrap.x86_64.freebsd.100B.tar.bz2) = 0d50885402208caafbc133ffc3b8684e89a50cae
+Size (ada-bootstrap.x86_64.freebsd.100B.tar.bz2) = 42163803 bytes
+SHA1 (ada-bootstrap.x86_64.freebsd.84.tar.bz2) = b5c76ce07df6e944742eda5f860352c8e179b988
+RMD160 (ada-bootstrap.x86_64.freebsd.84.tar.bz2) = 334c2375ee35bdf931a3a476e794e494ff252515
+Size (ada-bootstrap.x86_64.freebsd.84.tar.bz2) = 40227668 bytes
+SHA1 (ada-bootstrap.x86_64.netbsd.614.tar.bz2) = 683f58e6e394a508a52ec1dc5f3d9ca2869d5252
+RMD160 (ada-bootstrap.x86_64.netbsd.614.tar.bz2) = 4574857089e82fb80725161cc8b625ce75f6810e
+Size (ada-bootstrap.x86_64.netbsd.614.tar.bz2) = 39348972 bytes
+SHA1 (ada-bootstrap.x86_64.solaris.511.tar.bz2) = abb16c1582e2a6ffe37df4afd96d04c44f2eea7b
+RMD160 (ada-bootstrap.x86_64.solaris.511.tar.bz2) = 41677e2fd0cb02c89f200fb97b112ad3be7f19cd
+Size (ada-bootstrap.x86_64.solaris.511.tar.bz2) = 60110383 bytes
+SHA1 (gcc-5.1.0.tar.bz2) = b6c947b09adf780fe02065d0c48bfd7b4bdddfa3
+RMD160 (gcc-5.1.0.tar.bz2) = 17a9623f384ce10415a603042e0592c9b4956078
+Size (gcc-5.1.0.tar.bz2) = 94954411 bytes
diff --git a/lang/gcc5-aux/files/diff-ada b/lang/gcc5-aux/files/diff-ada
new file mode 100644
index 00000000000..8039c96be20
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-ada
@@ -0,0 +1,3826 @@
+--- /dev/null
++++ gcc/ada/a-intnam-dragonfly.ads
+@@ -0,0 +1,136 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- A D A . I N T E R R U P T S . N A M E S --
++-- --
++-- S p e c --
++-- --
++-- Copyright (C) 1991-2011, Free Software Foundation, Inc. --
++-- --
++-- GNARL is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. --
++-- Extensive contributions were provided by Ada Core Technologies, Inc. --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the DragonFly BSD THREADS version of this package
++
++with System.OS_Interface;
++
++package Ada.Interrupts.Names is
++
++ -- All identifiers in this unit are implementation defined
++
++ pragma Implementation_Defined;
++
++ -- Beware that the mapping of names to signals may be many-to-one. There
++ -- may be aliases. Also, for all signal names that are not supported on
++ -- the current system the value of the corresponding constant will be zero.
++
++ SIGHUP : constant Interrupt_ID :=
++ System.OS_Interface.SIGHUP; -- hangup
++
++ SIGINT : constant Interrupt_ID :=
++ System.OS_Interface.SIGINT; -- interrupt (rubout)
++
++ SIGQUIT : constant Interrupt_ID :=
++ System.OS_Interface.SIGQUIT; -- quit (ASCD FS)
++
++ SIGILL : constant Interrupt_ID :=
++ System.OS_Interface.SIGILL; -- illegal instruction (not reset)
++
++ SIGTRAP : constant Interrupt_ID :=
++ System.OS_Interface.SIGTRAP; -- trace trap (not reset)
++
++ SIGIOT : constant Interrupt_ID :=
++ System.OS_Interface.SIGIOT; -- IOT instruction
++
++ SIGABRT : constant Interrupt_ID := -- used by abort,
++ System.OS_Interface.SIGABRT; -- replace SIGIOT in the future
++
++ SIGFPE : constant Interrupt_ID :=
++ System.OS_Interface.SIGFPE; -- floating point exception
++
++ SIGKILL : constant Interrupt_ID :=
++ System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored)
++
++ SIGBUS : constant Interrupt_ID :=
++ System.OS_Interface.SIGBUS; -- bus error
++
++ SIGSEGV : constant Interrupt_ID :=
++ System.OS_Interface.SIGSEGV; -- segmentation violation
++
++ SIGPIPE : constant Interrupt_ID := -- write on a pipe with
++ System.OS_Interface.SIGPIPE; -- no one to read it
++
++ SIGALRM : constant Interrupt_ID :=
++ System.OS_Interface.SIGALRM; -- alarm clock
++
++ SIGTERM : constant Interrupt_ID :=
++ System.OS_Interface.SIGTERM; -- software termination signal from kill
++
++ SIGURG : constant Interrupt_ID :=
++ System.OS_Interface.SIGURG; -- urgent condition on IO channel
++
++ SIGSTOP : constant Interrupt_ID :=
++ System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored)
++
++ SIGTSTP : constant Interrupt_ID :=
++ System.OS_Interface.SIGTSTP; -- user stop requested from tty
++
++ SIGCONT : constant Interrupt_ID :=
++ System.OS_Interface.SIGCONT; -- stopped process has been continued
++
++ SIGCHLD : constant Interrupt_ID :=
++ System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD
++
++ SIGCLD : constant Interrupt_ID :=
++ System.OS_Interface.SIGCLD; -- child status change
++
++ SIGTTIN : constant Interrupt_ID :=
++ System.OS_Interface.SIGTTIN; -- background tty read attempted
++
++ SIGTTOU : constant Interrupt_ID :=
++ System.OS_Interface.SIGTTOU; -- background tty write attempted
++
++ SIGIO : constant Interrupt_ID := -- input/output possible,
++ System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris)
++
++ SIGXCPU : constant Interrupt_ID :=
++ System.OS_Interface.SIGXCPU; -- CPU time limit exceeded
++
++ SIGXFSZ : constant Interrupt_ID :=
++ System.OS_Interface.SIGXFSZ; -- filesize limit exceeded
++
++ SIGVTALRM : constant Interrupt_ID :=
++ System.OS_Interface.SIGVTALRM; -- virtual timer expired
++
++ SIGPROF : constant Interrupt_ID :=
++ System.OS_Interface.SIGPROF; -- profiling timer expired
++
++ SIGWINCH : constant Interrupt_ID :=
++ System.OS_Interface.SIGWINCH; -- window size change
++
++ SIGUSR1 : constant Interrupt_ID :=
++ System.OS_Interface.SIGUSR1; -- user defined signal 1
++
++ SIGUSR2 : constant Interrupt_ID :=
++ System.OS_Interface.SIGUSR2; -- user defined signal 2
++
++end Ada.Interrupts.Names;
+--- /dev/null
++++ gcc/ada/a-intnam-netbsd.ads
+@@ -0,0 +1,139 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- A D A . I N T E R R U P T S . N A M E S --
++-- --
++-- S p e c --
++-- --
++-- Copyright (C) 1991-2011, Free Software Foundation, Inc. --
++-- --
++-- GNARL is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. --
++-- Extensive contributions were provided by Ada Core Technologies, Inc. --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the NetBSD THREADS version of this package
++
++with System.OS_Interface;
++
++package Ada.Interrupts.Names is
++
++ -- All identifiers in this unit are implementation defined
++
++ pragma Implementation_Defined;
++
++ -- Beware that the mapping of names to signals may be many-to-one. There
++ -- may be aliases. Also, for all signal names that are not supported on
++ -- the current system the value of the corresponding constant will be zero.
++
++ SIGHUP : constant Interrupt_ID :=
++ System.OS_Interface.SIGHUP; -- hangup
++
++ SIGINT : constant Interrupt_ID :=
++ System.OS_Interface.SIGINT; -- interrupt (rubout)
++
++ SIGQUIT : constant Interrupt_ID :=
++ System.OS_Interface.SIGQUIT; -- quit (ASCD FS)
++
++ SIGILL : constant Interrupt_ID :=
++ System.OS_Interface.SIGILL; -- illegal instruction (not reset)
++
++ SIGTRAP : constant Interrupt_ID :=
++ System.OS_Interface.SIGTRAP; -- trace trap (not reset)
++
++ SIGIOT : constant Interrupt_ID :=
++ System.OS_Interface.SIGIOT; -- IOT instruction
++
++ SIGABRT : constant Interrupt_ID := -- used by abort,
++ System.OS_Interface.SIGABRT; -- replace SIGIOT in the future
++
++ SIGFPE : constant Interrupt_ID :=
++ System.OS_Interface.SIGFPE; -- floating point exception
++
++ SIGKILL : constant Interrupt_ID :=
++ System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored)
++
++ SIGBUS : constant Interrupt_ID :=
++ System.OS_Interface.SIGBUS; -- bus error
++
++ SIGSEGV : constant Interrupt_ID :=
++ System.OS_Interface.SIGSEGV; -- segmentation violation
++
++ SIGPIPE : constant Interrupt_ID := -- write on a pipe with
++ System.OS_Interface.SIGPIPE; -- no one to read it
++
++ SIGALRM : constant Interrupt_ID :=
++ System.OS_Interface.SIGALRM; -- alarm clock
++
++ SIGTERM : constant Interrupt_ID :=
++ System.OS_Interface.SIGTERM; -- software termination signal from kill
++
++ SIGURG : constant Interrupt_ID :=
++ System.OS_Interface.SIGURG; -- urgent condition on IO channel
++
++ SIGSTOP : constant Interrupt_ID :=
++ System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored)
++
++ SIGTSTP : constant Interrupt_ID :=
++ System.OS_Interface.SIGTSTP; -- user stop requested from tty
++
++ SIGCONT : constant Interrupt_ID :=
++ System.OS_Interface.SIGCONT; -- stopped process has been continued
++
++ SIGCHLD : constant Interrupt_ID :=
++ System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD
++
++ SIGCLD : constant Interrupt_ID :=
++ System.OS_Interface.SIGCLD; -- child status change
++
++ SIGTTIN : constant Interrupt_ID :=
++ System.OS_Interface.SIGTTIN; -- background tty read attempted
++
++ SIGTTOU : constant Interrupt_ID :=
++ System.OS_Interface.SIGTTOU; -- background tty write attempted
++
++ SIGIO : constant Interrupt_ID := -- input/output possible,
++ System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris)
++
++ SIGXCPU : constant Interrupt_ID :=
++ System.OS_Interface.SIGXCPU; -- CPU time limit exceeded
++
++ SIGXFSZ : constant Interrupt_ID :=
++ System.OS_Interface.SIGXFSZ; -- filesize limit exceeded
++
++ SIGVTALRM : constant Interrupt_ID :=
++ System.OS_Interface.SIGVTALRM; -- virtual timer expired
++
++ SIGPROF : constant Interrupt_ID :=
++ System.OS_Interface.SIGPROF; -- profiling timer expired
++
++ SIGWINCH : constant Interrupt_ID :=
++ System.OS_Interface.SIGWINCH; -- window size change
++
++ SIGUSR1 : constant Interrupt_ID :=
++ System.OS_Interface.SIGUSR1; -- user defined signal 1
++
++ SIGUSR2 : constant Interrupt_ID :=
++ System.OS_Interface.SIGUSR2; -- user defined signal 2
++
++ SIGPWR : constant Interrupt_ID :=
++ System.OS_Interface.SIGPWR; -- power fail/restart
++
++end Ada.Interrupts.Names;
+--- gcc/ada/adaint.c.orig
++++ gcc/ada/adaint.c
+@@ -497,8 +497,8 @@
+ GNAT_STRUCT_STAT stat_result;
+ int fd;
+
+- sprintf (full_path, "%s%c%s", dir, DIR_SEPARATOR, file);
+- sprintf (temp_file, "%s%cTMP-%ld-%ld",
++ snprintf (full_path, 256, "%s%c%s", dir, DIR_SEPARATOR, file);
++ snprintf (temp_file, 256, "%s%cTMP-%ld-%ld",
+ dir, DIR_SEPARATOR, (long)getpid(), (long)getppid ());
+
+ /* Create the temporary file and write the process number. */
+@@ -659,7 +659,8 @@
+ strcpy (encoding, "encoding=utf8");
+ *e_length = strlen (encoding);
+ #else
+- strcpy (os_name, filename);
++ /* o_length is initialized with max os_name size (2x filename size) */
++ strncpy (os_name, filename, *o_length);
+ *o_length = strlen (filename);
+ *e_length = 0;
+ #endif
+@@ -738,7 +739,7 @@
+ }
+
+ #if defined (_WIN32) || defined (linux) || defined (sun) \
+- || defined (__FreeBSD__)
++ || defined (__FreeBSD__) || defined(__DragonFly__)
+ #define HAS_TARGET_WCHAR_T
+ #endif
+
+@@ -973,9 +974,10 @@
+ int fd;
+ int o_fmode = O_BINARY;
+
+- strcpy (path, "GNAT-XXXXXX");
++ strncpy (path, "GNAT-XXXXXX", 12);
+
+ #if (defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) \
++ || defined (__DragonFly__) \
+ || defined (linux) || defined(__GLIBC__)) && !defined (__vxworks)
+ return mkstemp (path);
+ #elif defined (__Lynx__)
+@@ -1147,21 +1149,58 @@
+ free (pname);
+ }
+
++#elif defined (__ANDROID__)
++
++ /*
++ * ext2 /ext3/ext4/fat16/fat32 have no path limits
++ * /data/local/tmp normally requires rooted devices, if it even exists
++ * /sdcard is the standard location for external storage. Nativeactivity
++ * manifest needs to authorize its use, otherwise it might not have the
++ * proper permissions.
++ */
++
++ int testfd;
++ char *datadir = getenv ("ANDROID_DATA");
++
++ if (datadir == NULL)
++ strncpy (tmp_filename, "/data/local/tmp/gnat-XXXXXX", L_tmpnam);
++ else
++ snprintf (tmp_filename, L_tmpnam, "%s/local/tmp/gnat-XXXXXX", datadir);
++
++ testfd = mkstemp (tmp_filename);
++ if (testfd != -1)
++ {
++ close (testfd);
++ return;
++ }
++
++ char *sdcard = getenv ("EXTERNAL_STORAGE");
++
++ if (sdcard == NULL)
++ strncpy (tmp_filename, "/sdcard/gnat-XXXXXX", L_tmpnam);
++ else
++ snprintf (tmp_filename, L_tmpnam, "%s/gnat-XXXXXX", sdcard);
++
++ testfd = mkstemp (tmp_filename);
++ if (testfd != -1)
++ {
++ close (testfd);
++ return;
++ }
++
++ tmpnam (tmp_filename);
++
+ #elif defined (linux) || defined (__FreeBSD__) || defined (__NetBSD__) \
+- || defined (__OpenBSD__) || defined(__GLIBC__) || defined (__ANDROID__)
++ || defined (__OpenBSD__) || defined(__GLIBC__) || defined (__DragonFly__)
+ #define MAX_SAFE_PATH 1000
+ char *tmpdir = getenv ("TMPDIR");
+
+ /* If tmpdir is longer than MAX_SAFE_PATH, revert to default value to avoid
+ a buffer overflow. */
+ if (tmpdir == NULL || strlen (tmpdir) > MAX_SAFE_PATH)
+-#ifdef __ANDROID__
+- strcpy (tmp_filename, "/cache/gnat-XXXXXX");
+-#else
+- strcpy (tmp_filename, "/tmp/gnat-XXXXXX");
+-#endif
++ strncpy (tmp_filename, "/tmp/gnat-XXXXXX", L_tmpnam);
+ else
+- sprintf (tmp_filename, "%s/gnat-XXXXXX", tmpdir);
++ snprintf (tmp_filename, L_tmpnam, "%s/gnat-XXXXXX", tmpdir);
+
+ close (mkstemp(tmp_filename));
+ #elif defined (__vxworks) && !(defined (__RTP__) || defined (VTHREADS))
+@@ -2247,7 +2286,9 @@
+ {
+ int cores = 1;
+
+-#if defined (linux) || defined (sun) || defined (AIX) || defined (__APPLE__)
++#if defined (linux) || defined (sun) || defined (AIX) \
++ || defined (__APPLE__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
++ || defined (__DragonFly__) || defined (__NetBSD__)
+ cores = (int) sysconf (_SC_NPROCESSORS_ONLN);
+
+ #elif defined (__hpux__)
+--- gcc/ada/cio.c.orig
++++ gcc/ada/cio.c
+@@ -49,7 +49,8 @@
+
+ /* Don't use macros on GNU/Linux since they cause incompatible changes between
+ glibc 2.0 and 2.1 */
+-#ifdef linux
++/* Android is The exception because it uses the BIONIC library */
++#if defined(linux) && !defined(__ANDROID__)
+ #undef putchar
+ #undef getchar
+ #undef fputc
+--- gcc/ada/cstreams.c.orig
++++ gcc/ada/cstreams.c
+@@ -69,9 +69,10 @@
+ #include <unixlib.h>
+ #endif
+
+-#ifdef linux
++#if defined(linux) && !defined(__ANDROID__)
+ /* Don't use macros on GNU/Linux since they cause incompatible changes between
+ glibc 2.0 and 2.1 */
++/* Android is The exception because it uses the BIONIC library */
+
+ #ifdef stderr
+ # undef stderr
+@@ -192,7 +193,9 @@
+ *p = '\\';
+ }
+
+-#elif defined (__FreeBSD__)
++#elif defined (__FreeBSD__) \
++ || defined (__DragonFly__) \
++ || defined (__OpenBSD__)
+
+ /* Use realpath function which resolves links and references to . and ..
+ on those Unix systems that support it. Note that GNU/Linux provides it but
+--- gcc/ada/env.c.orig
++++ gcc/ada/env.c
+@@ -181,7 +181,9 @@
+ LIB$SIGNAL (status);
+ }
+
+-#elif (defined (__vxworks) && defined (__RTP__)) || defined (__APPLE__)
++#elif (defined (__vxworks) && defined (__RTP__)) \
++ || defined (__APPLE__) \
++ || defined (__OpenBSD__)
+ setenv (name, value, 1);
+
+ #else
+@@ -304,6 +306,7 @@
+ }
+ #elif defined (__MINGW32__) || defined (__FreeBSD__) || defined (__APPLE__) \
+ || (defined (__vxworks) && defined (__RTP__)) || defined (__CYGWIN__) \
++ || defined (__DragonFly__) \
+ || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__rtems__)
+ /* On Windows, FreeBSD and MacOS there is no function to clean all the
+ environment but there is a "clean" way to unset a variable. So go
+--- gcc/ada/g-comlin.adb.orig
++++ gcc/ada/g-comlin.adb
+@@ -520,6 +520,7 @@
+ begin
+ Index_In_Switches := 0;
+ Switch_Length := 0;
++ Param := Parameter_None;
+
+ -- Remove all leading spaces first to make sure that Index points
+ -- at the start of the first switch.
+--- gcc/ada/g-expect.adb.orig
++++ gcc/ada/g-expect.adb
+@@ -1350,15 +1350,20 @@
+
+ -- The following commands are not executed on Unix systems, and are only
+ -- required for Windows systems. We are now in the parent process.
++ -- Although the if-statement is redundant, it's here so the compiler
++ -- doesn't complain about uninitialized variables.
+
+- -- Restore the old descriptors
++ if No_Fork_On_Target then
+
+- Dup2 (Input, GNAT.OS_Lib.Standin);
+- Dup2 (Output, GNAT.OS_Lib.Standout);
+- Dup2 (Error, GNAT.OS_Lib.Standerr);
+- Close (Input);
+- Close (Output);
+- Close (Error);
++ -- Restore the old descriptors
++
++ Dup2 (Input, GNAT.OS_Lib.Standin);
++ Dup2 (Output, GNAT.OS_Lib.Standout);
++ Dup2 (Error, GNAT.OS_Lib.Standerr);
++ Close (Input);
++ Close (Output);
++ Close (Error);
++ end if;
+ end Set_Up_Child_Communications;
+
+ ---------------------------
+--- /dev/null
++++ gcc/ada/g-socthi-bsd.adb
+@@ -0,0 +1,356 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT COMPILER COMPONENTS --
++-- --
++-- G N A T . S O C K E T S . T H I N --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 2001-2013, AdaCore --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNAT was originally developed by the GNAT team at New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc. --
++-- --
++------------------------------------------------------------------------------
++
++-- This package provides a target dependent thin interface to the sockets
++-- layer for use by the GNAT.Sockets package (g-socket.ads). This package
++-- should not be directly with'ed by an applications program.
++
++-- This is the *BSD version which uses fcntl rather than ioctl
++-- The constant SCON.Thread_Blocking_IO is always true (for all platforms, not
++-- just *BSD), so this binding is significantly simpler than the standard
++-- one it replaces.
++
++with GNAT.OS_Lib; use GNAT.OS_Lib;
++
++with Interfaces.C; use Interfaces.C;
++
++package body GNAT.Sockets.Thin is
++
++ function Syscall_Accept
++ (S : C.int;
++ Addr : System.Address;
++ Addrlen : not null access C.int) return C.int;
++ pragma Import (C, Syscall_Accept, "accept");
++ -- The accept() function accepts a connection on a socket. An incoming
++ -- connection is acknowledged and associated with an immediately created
++ -- socket. The original socket is returned to the listening state.
++
++ function Syscall_Connect
++ (S : C.int;
++ Name : System.Address;
++ Namelen : C.int) return C.int;
++ pragma Import (C, Syscall_Connect, "connect");
++ -- The connect() system call initiates a connection on a socket. If the
++ -- parameter S is of type SOCK_DGRAM then connect() permanently specifies
++ -- the peer to which datagrams are to be sent. If S is type SOCK_STREAM
++ -- then connect() attempts to make a connection with another socket, which
++ -- is identified by the parameter Name.
++
++ function Syscall_Recv
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int) return C.int;
++ pragma Import (C, Syscall_Recv, "recv");
++ -- The recv() function receives a message from a socket. The call can be
++ -- used on a connection mode socket or a bound, connectionless socket. If
++ -- no messages are available at the socket, the recv() call waits for a
++ -- message to arrive unless the socket is non-blocking. If a socket is
++ -- non-blocking, the call returns a -1 and ERRNO is set to EWOULDBLOCK.
++
++ function Syscall_Recvfrom
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int;
++ From : System.Address;
++ Fromlen : not null access C.int) return C.int;
++ pragma Import (C, Syscall_Recvfrom, "recvfrom");
++ -- The recvfrom() system call receives a message from a socket and captures
++ -- the address from which the data was sent. It can be used to receive
++ -- data on an unconnected socket as well. If no messages are available,
++ -- the call waits for a message to arrive on blocking sockets. For
++ -- non-blocking sockets without messages, -1 is returned and ERRNO is set
++ -- to EAGAIN or EWOULDBLOCK.
++
++ function Syscall_Recvmsg
++ (S : C.int;
++ Msg : System.Address;
++ Flags : C.int) return System.CRTL.ssize_t;
++ pragma Import (C, Syscall_Recvmsg, "recvmsg");
++ -- The recvmsg call receives a message from a socket, and can be used to
++ -- receive data on an unconnected socket as well. If no messages are
++ -- available, the call waits for a message to arrive on blocking sockets.
++ -- For non-blocking sockets without messages, -1 is returned and ERRNO is
++ -- set to EAGAIN or EWOULDBLOCK.
++
++ function Syscall_Sendmsg
++ (S : C.int;
++ Msg : System.Address;
++ Flags : C.int) return System.CRTL.ssize_t;
++ pragma Import (C, Syscall_Sendmsg, "sendmsg");
++ -- The sendmsg() function sends a message to a socket, and can be used with
++ -- unconnected sockets as well (the msg is ignored in this case). The
++ -- function returns the number of bytes sent when successful, otherwise it
++ -- returns -1 and ERRNO is set (many possible values).
++
++ function Syscall_Sendto
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int;
++ To : System.Address;
++ Tolen : C.int) return C.int;
++ pragma Import (C, Syscall_Sendto, "sendto");
++ -- The sendto() function only works for connected sockets and it initiates
++ -- the transmission of a message. A successful call returns the numbers of
++ -- bytes sent, and a failure returns a -1 and ERRNO is set.
++
++ function Syscall_Socket
++ (Domain : C.int;
++ Typ : C.int;
++ Protocol : C.int) return C.int;
++ pragma Import (C, Syscall_Socket, "socket");
++ -- The socket() function is used to create an unbound socket and returns a
++ -- file descriptor that can be used with other socket functions. Upon
++ -- failure, a -1 is returned and ERRNO is set.
++
++ procedure Disable_SIGPIPE (S : C.int);
++ pragma Import (C, Disable_SIGPIPE, "__gnat_disable_sigpipe");
++
++ procedure Disable_All_SIGPIPEs;
++ pragma Import (C, Disable_All_SIGPIPEs, "__gnat_disable_all_sigpipes");
++ -- Sets the process to ignore all SIGPIPE signals on platforms that
++ -- don't support Disable_SIGPIPE for particular streams.
++
++ function C_Fcntl
++ (Fd : C.int;
++ Cmd : C.int;
++ Val : C.int) return C.int;
++ pragma Import (C, C_Fcntl, "fcntl");
++ -- The ioctl of 64-bit DragonFlyBSD, OpenBSD, and NetBSD does not support
++ -- setting a socket in non-blocking mode. fcntl must be used instead.
++
++ --------------
++ -- C_Accept --
++ --------------
++
++ function C_Accept
++ (S : C.int;
++ Addr : System.Address;
++ Addrlen : not null access C.int) return C.int
++ is
++ R : constant C.int := Syscall_Accept (S, Addr, Addrlen);
++ begin
++
++ Disable_SIGPIPE (R);
++ return R;
++ end C_Accept;
++
++ ---------------
++ -- C_Connect --
++ ---------------
++
++ function C_Connect
++ (S : C.int;
++ Name : System.Address;
++ Namelen : C.int) return C.int
++ is
++ begin
++ return Syscall_Connect (S, Name, Namelen);
++ end C_Connect;
++
++ ------------------
++ -- Socket_Ioctl --
++ ------------------
++
++ function Socket_Ioctl
++ (S : C.int;
++ Req : SOSC.IOCTL_Req_T;
++ Arg : access C.int) return C.int
++ is
++ begin
++ if Req = SOSC.FIONBIO then
++ declare
++ use Interfaces;
++ flags : constant Unsigned_32 :=
++ Unsigned_32 (C_Fcntl (S, SOSC.F_GETFL, 0));
++ nonblock : constant Unsigned_32 := Unsigned_32 (SOSC.O_NDELAY);
++ enabled : constant Boolean := Arg.all = 1;
++ newval : C.int := C.int (flags);
++ begin
++ if enabled then
++ newval := C.int (flags or nonblock);
++ elsif (flags and nonblock) > 0 then
++ newval := C.int (flags - nonblock);
++ end if;
++ return C_Fcntl (Fd => S, Cmd => SOSC.F_SETFL, Val => newval);
++ end;
++ end if;
++
++ return C_Ioctl (S, Req, Arg);
++ end Socket_Ioctl;
++
++ ------------
++ -- C_Recv --
++ ------------
++
++ function C_Recv
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int) return C.int
++ is
++ begin
++ return Syscall_Recv (S, Msg, Len, Flags);
++ end C_Recv;
++
++ ----------------
++ -- C_Recvfrom --
++ ----------------
++
++ function C_Recvfrom
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int;
++ From : System.Address;
++ Fromlen : not null access C.int) return C.int
++ is
++ begin
++ return Syscall_Recvfrom (S, Msg, Len, Flags, From, Fromlen);
++ end C_Recvfrom;
++
++ ---------------
++ -- C_Recvmsg --
++ ---------------
++
++ function C_Recvmsg
++ (S : C.int;
++ Msg : System.Address;
++ Flags : C.int) return System.CRTL.ssize_t
++ is
++ begin
++ return Syscall_Recvmsg (S, Msg, Flags);
++ end C_Recvmsg;
++
++ ---------------
++ -- C_Sendmsg --
++ ---------------
++
++ function C_Sendmsg
++ (S : C.int;
++ Msg : System.Address;
++ Flags : C.int) return System.CRTL.ssize_t
++ is
++ begin
++ return Syscall_Sendmsg (S, Msg, Flags);
++ end C_Sendmsg;
++
++ --------------
++ -- C_Sendto --
++ --------------
++
++ function C_Sendto
++ (S : C.int;
++ Msg : System.Address;
++ Len : C.int;
++ Flags : C.int;
++ To : System.Address;
++ Tolen : C.int) return C.int
++ is
++ begin
++ return Syscall_Sendto (S, Msg, Len, Flags, To, Tolen);
++ end C_Sendto;
++
++ --------------
++ -- C_Socket --
++ --------------
++
++ function C_Socket
++ (Domain : C.int;
++ Typ : C.int;
++ Protocol : C.int) return C.int
++ is
++ R : constant C.int := Syscall_Socket (Domain, Typ, Protocol);
++ begin
++ Disable_SIGPIPE (R);
++ return R;
++ end C_Socket;
++
++ --------------
++ -- Finalize --
++ --------------
++
++ procedure Finalize is
++ begin
++ null;
++ end Finalize;
++
++ -------------------------
++ -- Host_Error_Messages --
++ -------------------------
++
++ package body Host_Error_Messages is separate;
++
++ ----------------
++ -- Initialize --
++ ----------------
++
++ procedure Initialize is
++ begin
++ Disable_All_SIGPIPEs;
++ end Initialize;
++
++ --------------------
++ -- Signalling_Fds --
++ --------------------
++
++ package body Signalling_Fds is
++
++ -- In this default implementation, we use a C version of these
++ -- subprograms provided by socket.c.
++
++ function C_Create (Fds : not null access Fd_Pair) return C.int;
++ function C_Read (Rsig : C.int) return C.int;
++ function C_Write (Wsig : C.int) return C.int;
++ procedure C_Close (Sig : C.int);
++
++ pragma Import (C, C_Create, "__gnat_create_signalling_fds");
++ pragma Import (C, C_Read, "__gnat_read_signalling_fd");
++ pragma Import (C, C_Write, "__gnat_write_signalling_fd");
++ pragma Import (C, C_Close, "__gnat_close_signalling_fd");
++
++ function Create
++ (Fds : not null access Fd_Pair) return C.int renames C_Create;
++ function Read (Rsig : C.int) return C.int renames C_Read;
++ function Write (Wsig : C.int) return C.int renames C_Write;
++ procedure Close (Sig : C.int) renames C_Close;
++
++ end Signalling_Fds;
++
++ --------------------------
++ -- Socket_Error_Message --
++ --------------------------
++
++ function Socket_Error_Message (Errno : Integer) return String is separate;
++
++end GNAT.Sockets.Thin;
+--- gcc/ada/gnatchop.adb.orig
++++ gcc/ada/gnatchop.adb
+@@ -44,7 +44,7 @@
+ Config_File_Name : constant String_Access := new String'("gnat.adc");
+ -- The name of the file holding the GNAT configuration pragmas
+
+- Gcc : String_Access := new String'("gcc");
++ Gcc : String_Access := new String'("ada");
+ -- May be modified by switch --GCC=
+
+ Gcc_Set : Boolean := False;
+--- gcc/ada/gnatlink.adb.orig
++++ gcc/ada/gnatlink.adb
+@@ -136,7 +136,7 @@
+ -- This table collects the arguments to be passed to compile the binder
+ -- generated file.
+
+- Gcc : String_Access := Program_Name ("gcc", "gnatlink");
++ Gcc : String_Access := Program_Name ("ada", "gnatlink");
+
+ Read_Mode : constant String := "r" & ASCII.NUL;
+
+--- gcc/ada/gsocket.h.orig
++++ gcc/ada/gsocket.h
+@@ -209,6 +209,8 @@
+ #endif
+
+ #if defined (_AIX) || defined (__FreeBSD__) || defined (__hpux__) || \
++ defined (__DragonFly__) || \
++ defined (__NetBSD__) || defined (__OpenBSD__) || \
+ defined (_WIN32) || defined (__APPLE__) || defined (__ANDROID__)
+ # define HAVE_THREAD_SAFE_GETxxxBYyyy 1
+
+@@ -241,7 +243,13 @@
+ # endif
+ #endif
+
+-#if defined (__FreeBSD__) || defined (__vxworks) || defined(__rtems__)
++#if defined (__FreeBSD__) \
++ || defined (__DragonFly__) \
++ || defined (__OpenBSD__) \
++ || defined (__NetBSD__) \
++ || defined (__ANDROID__) \
++ || defined (__vxworks) \
++ || defined(__rtems__)
+ # define Has_Sockaddr_Len 1
+ #else
+ # define Has_Sockaddr_Len 0
+--- gcc/ada/init.c.orig
++++ gcc/ada/init.c
+@@ -1628,7 +1628,7 @@
+ /* FreeBSD Section */
+ /*******************/
+
+-#elif defined (__FreeBSD__)
++#elif defined (__FreeBSD__) || defined (__DragonFly__)
+
+ #include <signal.h>
+ #include <sys/ucontext.h>
+@@ -1673,7 +1673,7 @@
+ }
+
+ void
+-__gnat_install_handler ()
++__gnat_install_handler (void)
+ {
+ struct sigaction act;
+
+@@ -2496,9 +2496,13 @@
+ initialization of the FP processor. This version is used under INTERIX
+ and WIN32. */
+
+-#if defined (_WIN32) || defined (__INTERIX) \
+- || defined (__Lynx__) || defined(__NetBSD__) || defined(__FreeBSD__) \
+- || defined (__OpenBSD__)
++#if defined (_WIN32) \
++ || defined (__INTERIX) \
++ || defined (__Lynx__) \
++ || defined (__NetBSD__) \
++ || defined (__FreeBSD__) \
++ || defined (__DragonFly__) \
++ || defined (__OpenBSD__)
+
+ #define HAVE_GNAT_INIT_FLOAT
+
+--- gcc/ada/initialize.c.orig
++++ gcc/ada/initialize.c
+@@ -85,8 +85,11 @@
+ /* __gnat_initialize (init_float version) */
+ /******************************************/
+
+-#elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \
+- || defined (__OpenBSD__)
++#elif defined (__Lynx__) \
++ || defined (__FreeBSD__) \
++ || defined (__DragonFly__) \
++ || defined (__NetBSD__) \
++ || defined (__OpenBSD__)
+
+ void
+ __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
+--- gcc/ada/link.c.orig
++++ gcc/ada/link.c
+@@ -103,7 +103,10 @@
+ unsigned char __gnat_separate_run_path_options = 0;
+ const char *__gnat_default_libgcc_subdir = "lib";
+
+-#elif defined (__FreeBSD__)
++#elif defined (__FreeBSD__) \
++ || defined (__DragonFly__) \
++ || defined (__OpenBSD__) \
++ || defined (__NetBSD__)
+ const char *__gnat_object_file_option = "-Wl,@";
+ const char *__gnat_run_path_option = "-Wl,-rpath,";
+ char __gnat_shared_libgnat_default = STATIC;
+--- gcc/ada/make.adb.orig
++++ gcc/ada/make.adb
+@@ -671,7 +671,7 @@
+ -- Compiler, Binder & Linker Data and Subprograms --
+ ----------------------------------------------------
+
+- Gcc : String_Access := Program_Name ("gcc", "gnatmake");
++ Gcc : String_Access := Program_Name ("ada", "gnatmake");
+ Original_Gcc : constant String_Access := Gcc;
+ -- Original_Gcc is used to check if Gcc has been modified by a switch
+ -- --GCC=, so that for VM platforms, it is not modified again, as it can
+--- gcc/ada/mlib-prj.adb.orig
++++ gcc/ada/mlib-prj.adb
+@@ -335,6 +335,11 @@
+
+ Foreign_Sources : Boolean;
+
++ Rpath_Disabled : Boolean := False;
++ -- If -R is passed through the library options for the linker, it will
++ -- prevent the implemented libraries portion of the rpath switch from
++ -- being built, even if the linker is capable of supporting rpath.
++
+ Rpath : String_Access := null;
+ -- Allocated only if Path Option is supported
+
+@@ -768,7 +773,7 @@
+ Opts.Table (Opts.Last) :=
+ new String'("-L" & Name_Buffer (1 .. Name_Len));
+
+- if Path_Option /= null then
++ if not Rpath_Disabled and then Path_Option /= null then
+ Add_Rpath (Name_Buffer (1 .. Name_Len));
+ end if;
+
+@@ -1299,9 +1304,13 @@
+ Get_Name_String (Element.Value);
+
+ if Name_Len /= 0 then
+- Opts.Increment_Last;
+- Opts.Table (Opts.Last) :=
+- new String'(Name_Buffer (1 .. Name_Len));
++ if Name_Buffer (1 .. Name_Len) = "-R" then
++ Rpath_Disabled := True;
++ else
++ Opts.Increment_Last;
++ Opts.Table (Opts.Last) :=
++ new String'(Name_Buffer (1 .. Name_Len));
++ end if;
+ end if;
+
+ Current := Element.Next;
+--- gcc/ada/mlib-utl.adb.orig
++++ gcc/ada/mlib-utl.adb
+@@ -446,7 +446,7 @@
+ if Driver_Name = No_Name then
+ if Gcc_Exec = null then
+ if Gcc_Name = null then
+- Gcc_Name := Osint.Program_Name ("gcc", "gnatmake");
++ Gcc_Name := Osint.Program_Name ("ada", "gnatmake");
+ end if;
+
+ Gcc_Exec := Locate_Exec_On_Path (Gcc_Name.all);
+--- gcc/ada/prj-makr.adb.orig
++++ gcc/ada/prj-makr.adb
+@@ -115,7 +115,7 @@
+
+ procedure Dup2 (Old_Fd, New_Fd : File_Descriptor);
+
+- Gcc : constant String := "gcc";
++ Gcc : constant String := "ada";
+ Gcc_Path : String_Access := null;
+
+ Non_Empty_Node : constant Project_Node_Id := 1;
+--- gcc/ada/s-osinte-android.ads.orig
++++ gcc/ada/s-osinte-android.ads
+@@ -597,11 +597,11 @@
+
+ type pid_t is new int;
+
+- type time_t is new long;
++ type time_t is new Long_Long_Integer;
+
+ type timespec is record
+- tv_sec : time_t;
+- tv_nsec : long;
++ ts_sec : time_t;
++ ts_nsec : long;
+ end record;
+ pragma Convention (C, timespec);
+
+--- /dev/null
++++ gcc/ada/s-osinte-dragonfly.adb
+@@ -0,0 +1,116 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ I N T E R F A C E --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 1991-2009, Free Software Foundation, Inc. --
++-- --
++-- GNARL is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. It is --
++-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
++-- State University (http://www.gnat.com). --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the DragonFly THREADS version of this package
++
++with Interfaces.C; use Interfaces.C;
++
++package body System.OS_Interface is
++
++ -----------
++ -- Errno --
++ -----------
++
++ function Errno return int is
++ type int_ptr is access all int;
++
++ function internal_errno return int_ptr;
++ pragma Import (C, internal_errno, "__get_errno");
++
++ begin
++ return (internal_errno.all);
++ end Errno;
++
++ --------------------
++ -- Get_Stack_Base --
++ --------------------
++
++ function Get_Stack_Base (thread : pthread_t) return Address is
++ pragma Unreferenced (thread);
++ begin
++ return Null_Address;
++ end Get_Stack_Base;
++
++ ------------------
++ -- pthread_init --
++ ------------------
++
++ procedure pthread_init is
++ begin
++ null;
++ end pthread_init;
++
++ -----------------
++ -- To_Duration --
++ -----------------
++
++ function To_Duration (TS : timespec) return Duration is
++ begin
++ return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
++ end To_Duration;
++
++ ------------------------
++ -- To_Target_Priority --
++ ------------------------
++
++ function To_Target_Priority
++ (Prio : System.Any_Priority) return Interfaces.C.int
++ is
++ begin
++ return Interfaces.C.int (Prio);
++ end To_Target_Priority;
++
++ -----------------
++ -- To_Timespec --
++ -----------------
++
++ function To_Timespec (D : Duration) return timespec is
++ S : time_t;
++ F : Duration;
++
++ begin
++ S := time_t (Long_Long_Integer (D));
++ F := D - Duration (S);
++
++ -- If F has negative value due to a round-up, adjust for positive F
++ -- value.
++
++ if F < 0.0 then
++ S := S - 1;
++ F := F + 1.0;
++ end if;
++
++ return timespec'(ts_sec => S,
++ ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
++ end To_Timespec;
++
++end System.OS_Interface;
+--- /dev/null
++++ gcc/ada/s-osinte-dragonfly.ads
+@@ -0,0 +1,653 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ I N T E R F A C E --
++-- --
++-- S p e c --
++-- --
++-- Copyright (C) 1991-1994, Florida State University --
++-- Copyright (C) 1995-2014, Free Software Foundation, Inc. --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. It is --
++-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
++-- State University (http://www.gnat.com). --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the DragonFly BSD PTHREADS version of this package
++
++-- This package encapsulates all direct interfaces to OS services
++-- that are needed by the tasking run-time (libgnarl).
++
++-- PLEASE DO NOT add any with-clauses to this package or remove the pragma
++-- Preelaborate. This package is designed to be a bottom-level (leaf) package.
++
++with Ada.Unchecked_Conversion;
++
++with Interfaces.C;
++
++package System.OS_Interface is
++ pragma Preelaborate;
++
++ pragma Linker_Options ("-pthread");
++
++ subtype int is Interfaces.C.int;
++ subtype short is Interfaces.C.short;
++ subtype long is Interfaces.C.long;
++ subtype unsigned is Interfaces.C.unsigned;
++ subtype unsigned_short is Interfaces.C.unsigned_short;
++ subtype unsigned_long is Interfaces.C.unsigned_long;
++ subtype unsigned_char is Interfaces.C.unsigned_char;
++ subtype plain_char is Interfaces.C.plain_char;
++ subtype size_t is Interfaces.C.size_t;
++
++ -----------
++ -- Errno --
++ -----------
++
++ function Errno return int;
++ pragma Inline (Errno);
++
++ EAGAIN : constant := 35;
++ EINTR : constant := 4;
++ EINVAL : constant := 22;
++ ENOMEM : constant := 12;
++ ETIMEDOUT : constant := 60;
++
++ -------------
++ -- Signals --
++ -------------
++
++ Max_Interrupt : constant := 31;
++ type Signal is new int range 0 .. Max_Interrupt;
++ for Signal'Size use int'Size;
++
++ SIGHUP : constant := 1; -- hangup
++ SIGINT : constant := 2; -- interrupt (rubout)
++ SIGQUIT : constant := 3; -- quit (ASCD FS)
++ SIGILL : constant := 4; -- illegal instruction (not reset)
++ SIGTRAP : constant := 5; -- trace trap (not reset)
++ SIGIOT : constant := 6; -- IOT instruction
++ SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future
++ SIGEMT : constant := 7; -- EMT instruction
++ SIGFPE : constant := 8; -- floating point exception
++ SIGKILL : constant := 9; -- kill (cannot be caught or ignored)
++ SIGBUS : constant := 10; -- bus error
++ SIGSEGV : constant := 11; -- segmentation violation
++ SIGSYS : constant := 12; -- bad argument to system call
++ SIGPIPE : constant := 13; -- write on a pipe with no one to read it
++ SIGALRM : constant := 14; -- alarm clock
++ SIGTERM : constant := 15; -- software termination signal from kill
++ SIGURG : constant := 16; -- urgent condition on IO channel
++ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored)
++ SIGTSTP : constant := 18; -- user stop requested from tty
++ SIGCONT : constant := 19; -- stopped process has been continued
++ SIGCLD : constant := 20; -- alias for SIGCHLD
++ SIGCHLD : constant := 20; -- child status change
++ SIGTTIN : constant := 21; -- background tty read attempted
++ SIGTTOU : constant := 22; -- background tty write attempted
++ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias)
++ SIGXCPU : constant := 24; -- CPU time limit exceeded
++ SIGXFSZ : constant := 25; -- filesize limit exceeded
++ SIGVTALRM : constant := 26; -- virtual timer expired
++ SIGPROF : constant := 27; -- profiling timer expired
++ SIGWINCH : constant := 28; -- window size change
++ SIGINFO : constant := 29; -- information request (BSD)
++ SIGUSR1 : constant := 30; -- user defined signal 1
++ SIGUSR2 : constant := 31; -- user defined signal 2
++
++ SIGADAABORT : constant := SIGABRT;
++ -- Change this if you want to use another signal for task abort.
++ -- SIGTERM might be a good one.
++
++ type Signal_Set is array (Natural range <>) of Signal;
++
++ -- Interrupts that must be unmasked at all times. DragonFlyBSD
++ -- pthreads will not allow an application to mask out any
++ -- interrupt needed by the threads library.
++ Unmasked : constant Signal_Set :=
++ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP);
++
++ -- DragonFlyBSD will uses SIGPROF for timing. Do not allow a
++ -- handler to attach to this signal.
++ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF);
++
++ type sigset_t is private;
++
++ function sigaddset
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigaddset, "sigaddset");
++
++ function sigdelset
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigdelset, "sigdelset");
++
++ function sigfillset (set : access sigset_t) return int;
++ pragma Import (C, sigfillset, "sigfillset");
++
++ function sigismember
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigismember, "sigismember");
++
++ function sigemptyset (set : access sigset_t) return int;
++ pragma Import (C, sigemptyset, "sigemptyset");
++
++ -- sigcontext is architecture dependent, so define it private
++ type struct_sigcontext is private;
++
++ type old_struct_sigaction is record
++ sa_handler : System.Address;
++ sa_mask : sigset_t;
++ sa_flags : int;
++ end record;
++ pragma Convention (C, old_struct_sigaction);
++
++ type new_struct_sigaction is record
++ sa_handler : System.Address;
++ sa_flags : int;
++ sa_mask : sigset_t;
++ end record;
++ pragma Convention (C, new_struct_sigaction);
++
++ subtype struct_sigaction is new_struct_sigaction;
++ type struct_sigaction_ptr is access all struct_sigaction;
++
++ SIG_BLOCK : constant := 1;
++ SIG_UNBLOCK : constant := 2;
++ SIG_SETMASK : constant := 3;
++
++ SIG_DFL : constant := 0;
++ SIG_IGN : constant := 1;
++
++ SA_SIGINFO : constant := 16#0040#;
++ SA_ONSTACK : constant := 16#0001#;
++
++ function sigaction
++ (sig : Signal;
++ act : struct_sigaction_ptr;
++ oact : struct_sigaction_ptr) return int;
++ pragma Import (C, sigaction, "sigaction");
++
++ ----------
++ -- Time --
++ ----------
++
++ Time_Slice_Supported : constant Boolean := True;
++ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported)
++
++ type timespec is private;
++
++ function nanosleep (rqtp, rmtp : access timespec) return int;
++ pragma Import (C, nanosleep, "nanosleep");
++
++ type clockid_t is new unsigned_long;
++
++ function clock_getres
++ (clock_id : clockid_t;
++ res : access timespec) return int;
++ pragma Import (C, clock_getres, "clock_getres");
++
++ function clock_gettime
++ (clock_id : clockid_t;
++ tp : access timespec)
++ return int;
++ pragma Import (C, clock_gettime, "clock_gettime");
++
++ function To_Duration (TS : timespec) return Duration;
++ pragma Inline (To_Duration);
++
++ function To_Timespec (D : Duration) return timespec;
++ pragma Inline (To_Timespec);
++
++ type struct_timezone is record
++ tz_minuteswest : int;
++ tz_dsttime : int;
++ end record;
++ pragma Convention (C, struct_timezone);
++
++ procedure usleep (useconds : unsigned_long);
++ pragma Import (C, usleep, "usleep");
++
++ -------------------------
++ -- Priority Scheduling --
++ -------------------------
++
++ SCHED_FIFO : constant := 1;
++ SCHED_OTHER : constant := 2;
++ SCHED_RR : constant := 3;
++
++ function To_Target_Priority
++ (Prio : System.Any_Priority) return Interfaces.C.int;
++ -- Maps System.Any_Priority to a POSIX priority
++
++ -------------
++ -- Process --
++ -------------
++
++ type pid_t is private;
++
++ function kill (pid : pid_t; sig : Signal) return int;
++ pragma Import (C, kill, "kill");
++
++ function getpid return pid_t;
++ pragma Import (C, getpid, "getpid");
++
++ ---------
++ -- LWP --
++ ---------
++
++ function lwp_self return System.Address;
++ -- lwp_self does not exist on this thread library, revert to pthread_self
++ -- which is the closest approximation (with getpid). This function is
++ -- needed to share 7staprop.adb across POSIX-like targets.
++ pragma Import (C, lwp_self, "pthread_self");
++
++ -------------
++ -- Threads --
++ -------------
++
++ type Thread_Body is access
++ function (arg : System.Address) return System.Address;
++ pragma Convention (C, Thread_Body);
++
++ function Thread_Body_Access is new
++ Ada.Unchecked_Conversion (System.Address, Thread_Body);
++
++ type pthread_t is private;
++ subtype Thread_Id is pthread_t;
++
++ type pthread_mutex_t is limited private;
++ type pthread_cond_t is limited private;
++ type pthread_attr_t is limited private;
++ type pthread_mutexattr_t is limited private;
++ type pthread_condattr_t is limited private;
++ type pthread_key_t is private;
++
++ PTHREAD_CREATE_DETACHED : constant := 1;
++ PTHREAD_CREATE_JOINABLE : constant := 0;
++
++ PTHREAD_SCOPE_PROCESS : constant := 0;
++ PTHREAD_SCOPE_SYSTEM : constant := 2;
++
++ -- Read/Write lock not supported on DragonFly. To add support both types
++ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined
++ -- with the associated routines pthread_rwlock_[init/destroy] and
++ -- pthread_rwlock_[rdlock/wrlock/unlock].
++
++ subtype pthread_rwlock_t is pthread_mutex_t;
++ subtype pthread_rwlockattr_t is pthread_mutexattr_t;
++
++ -----------
++ -- Stack --
++ -----------
++
++ type stack_t is record
++ ss_sp : System.Address;
++ ss_size : size_t;
++ ss_flags : int;
++ end record;
++ pragma Convention (C, stack_t);
++
++ function sigaltstack
++ (ss : not null access stack_t;
++ oss : access stack_t) return int;
++ pragma Import (C, sigaltstack, "sigaltstack");
++
++ Alternate_Stack : aliased System.Address;
++ -- This is a dummy definition, never used (Alternate_Stack_Size is null)
++
++ Alternate_Stack_Size : constant := 0;
++ -- No alternate signal stack is used on this platform
++
++ Stack_Base_Available : constant Boolean := False;
++ -- Indicates whether the stack base is available on this target. This
++ -- allows us to share s-osinte.adb between all the FSU run time. Note that
++ -- this value can only be true if pthread_t has a complete definition that
++ -- corresponds exactly to the C header files.
++
++ function Get_Stack_Base (thread : pthread_t) return Address;
++ pragma Inline (Get_Stack_Base);
++ -- returns the stack base of the specified thread. Only call this function
++ -- when Stack_Base_Available is True.
++
++ function Get_Page_Size return size_t;
++ function Get_Page_Size return Address;
++ pragma Import (C, Get_Page_Size, "getpagesize");
++ -- Returns the size of a page
++
++ PROT_NONE : constant := 0;
++ PROT_READ : constant := 1;
++ PROT_WRITE : constant := 2;
++ PROT_EXEC : constant := 4;
++ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC;
++ PROT_ON : constant := PROT_NONE;
++ PROT_OFF : constant := PROT_ALL;
++
++ function mprotect (addr : Address; len : size_t; prot : int) return int;
++ pragma Import (C, mprotect);
++
++ ---------------------------------------
++ -- Nonstandard Thread Initialization --
++ ---------------------------------------
++
++ -- FSU_THREADS requires pthread_init, which is nonstandard and this should
++ -- be invoked during the elaboration of s-taprop.adb.
++
++ -- DragonFlyBSD does not require this so we provide an empty Ada body
++
++ procedure pthread_init;
++
++ -------------------------
++ -- POSIX.1c Section 3 --
++ -------------------------
++
++ function sigwait
++ (set : access sigset_t;
++ sig : access Signal) return int;
++ pragma Import (C, sigwait, "sigwait");
++
++ function pthread_kill
++ (thread : pthread_t;
++ sig : Signal) return int;
++ pragma Import (C, pthread_kill, "pthread_kill");
++
++ function pthread_sigmask
++ (how : int;
++ set : access sigset_t;
++ oset : access sigset_t) return int;
++ pragma Import (C, pthread_sigmask, "pthread_sigmask");
++
++ --------------------------
++ -- POSIX.1c Section 11 --
++ --------------------------
++
++ function pthread_mutexattr_init
++ (attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init");
++
++ function pthread_mutexattr_destroy
++ (attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy");
++
++ function pthread_mutex_init
++ (mutex : access pthread_mutex_t;
++ attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutex_init, "pthread_mutex_init");
++
++ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy");
++
++ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock");
++
++ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock");
++
++ function pthread_condattr_init
++ (attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_condattr_init, "pthread_condattr_init");
++
++ function pthread_condattr_destroy
++ (attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy");
++
++ function pthread_cond_init
++ (cond : access pthread_cond_t;
++ attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_cond_init, "pthread_cond_init");
++
++ function pthread_cond_destroy (cond : access pthread_cond_t) return int;
++ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy");
++
++ function pthread_cond_signal (cond : access pthread_cond_t) return int;
++ pragma Import (C, pthread_cond_signal, "pthread_cond_signal");
++
++ function pthread_cond_wait
++ (cond : access pthread_cond_t;
++ mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_cond_wait, "pthread_cond_wait");
++
++ function pthread_cond_timedwait
++ (cond : access pthread_cond_t;
++ mutex : access pthread_mutex_t;
++ abstime : access timespec) return int;
++ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
++
++ Relative_Timed_Wait : constant Boolean := False;
++ -- pthread_cond_timedwait requires an absolute delay time
++
++ --------------------------
++ -- POSIX.1c Section 13 --
++ --------------------------
++
++ PTHREAD_PRIO_NONE : constant := 0;
++ PTHREAD_PRIO_PROTECT : constant := 2;
++ PTHREAD_PRIO_INHERIT : constant := 1;
++
++ function pthread_mutexattr_setprotocol
++ (attr : access pthread_mutexattr_t;
++ protocol : int) return int;
++ pragma Import
++ (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol");
++
++ function pthread_mutexattr_getprotocol
++ (attr : access pthread_mutexattr_t;
++ protocol : access int) return int;
++ pragma Import
++ (C, pthread_mutexattr_getprotocol, "pthread_mutexattr_getprotocol");
++
++ function pthread_mutexattr_setprioceiling
++ (attr : access pthread_mutexattr_t;
++ prioceiling : int) return int;
++ pragma Import
++ (C, pthread_mutexattr_setprioceiling,
++ "pthread_mutexattr_setprioceiling");
++
++ function pthread_mutexattr_getprioceiling
++ (attr : access pthread_mutexattr_t;
++ prioceiling : access int) return int;
++ pragma Import
++ (C, pthread_mutexattr_getprioceiling,
++ "pthread_mutexattr_getprioceiling");
++
++ type struct_sched_param is record
++ sched_priority : int;
++ end record;
++ pragma Convention (C, struct_sched_param);
++
++ function pthread_getschedparam
++ (thread : pthread_t;
++ policy : access int;
++ param : access struct_sched_param) return int;
++ pragma Import (C, pthread_getschedparam, "pthread_getschedparam");
++
++ function pthread_setschedparam
++ (thread : pthread_t;
++ policy : int;
++ param : access struct_sched_param) return int;
++ pragma Import (C, pthread_setschedparam, "pthread_setschedparam");
++
++ function pthread_attr_setscope
++ (attr : access pthread_attr_t;
++ contentionscope : int) return int;
++ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope");
++
++ function pthread_attr_getscope
++ (attr : access pthread_attr_t;
++ contentionscope : access int) return int;
++ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope");
++
++ function pthread_attr_setinheritsched
++ (attr : access pthread_attr_t;
++ inheritsched : int) return int;
++ pragma Import
++ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched");
++
++ function pthread_attr_getinheritsched
++ (attr : access pthread_attr_t;
++ inheritsched : access int) return int;
++ pragma Import
++ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched");
++
++ function pthread_attr_setschedpolicy
++ (attr : access pthread_attr_t;
++ policy : int) return int;
++ pragma Import (C, pthread_attr_setschedpolicy,
++ "pthread_attr_setschedpolicy");
++
++ function pthread_attr_getschedpolicy
++ (attr : access pthread_attr_t;
++ policy : access int) return int;
++ pragma Import (C, pthread_attr_getschedpolicy,
++ "pthread_attr_getschedpolicy");
++
++ function pthread_attr_setschedparam
++ (attr : access pthread_attr_t;
++ sched_param : int) return int;
++ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam");
++
++ function pthread_attr_getschedparam
++ (attr : access pthread_attr_t;
++ sched_param : access int) return int;
++ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam");
++
++ function sched_yield return int;
++ pragma Import (C, sched_yield, "pthread_yield");
++
++ --------------------------
++ -- P1003.1c Section 16 --
++ --------------------------
++
++ function pthread_attr_init (attributes : access pthread_attr_t) return int;
++ pragma Import (C, pthread_attr_init, "pthread_attr_init");
++
++ function pthread_attr_destroy
++ (attributes : access pthread_attr_t) return int;
++ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy");
++
++ function pthread_attr_setdetachstate
++ (attr : access pthread_attr_t;
++ detachstate : int) return int;
++ pragma Import
++ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate");
++
++ function pthread_attr_getdetachstate
++ (attr : access pthread_attr_t;
++ detachstate : access int) return int;
++ pragma Import
++ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate");
++
++ function pthread_attr_getstacksize
++ (attr : access pthread_attr_t;
++ stacksize : access size_t) return int;
++ pragma Import
++ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize");
++
++ function pthread_attr_setstacksize
++ (attr : access pthread_attr_t;
++ stacksize : size_t) return int;
++ pragma Import
++ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize");
++
++ function pthread_create
++ (thread : access pthread_t;
++ attributes : access pthread_attr_t;
++ start_routine : Thread_Body;
++ arg : System.Address) return int;
++ pragma Import (C, pthread_create, "pthread_create");
++
++ function pthread_detach (thread : pthread_t) return int;
++ pragma Import (C, pthread_detach, "pthread_detach");
++
++ procedure pthread_exit (status : System.Address);
++ pragma Import (C, pthread_exit, "pthread_exit");
++
++ function pthread_self return pthread_t;
++ pragma Import (C, pthread_self, "pthread_self");
++
++ --------------------------
++ -- POSIX.1c Section 17 --
++ --------------------------
++
++ function pthread_setspecific
++ (key : pthread_key_t;
++ value : System.Address) return int;
++ pragma Import (C, pthread_setspecific, "pthread_setspecific");
++
++ function pthread_getspecific (key : pthread_key_t) return System.Address;
++ pragma Import (C, pthread_getspecific, "pthread_getspecific");
++
++ type destructor_pointer is access procedure (arg : System.Address);
++ pragma Convention (C, destructor_pointer);
++
++ function pthread_key_create
++ (key : access pthread_key_t;
++ destructor : destructor_pointer) return int;
++ pragma Import (C, pthread_key_create, "pthread_key_create");
++
++ ------------------------------------
++ -- Non-portable Pthread Functions --
++ ------------------------------------
++
++ function pthread_set_name_np
++ (thread : pthread_t;
++ name : System.Address) return int;
++ pragma Import (C, pthread_set_name_np, "pthread_set_name_np");
++
++private
++
++ type sigset_t is array (1 .. 4) of unsigned;
++
++ -- In DragonFlyBSD the component sa_handler turns out to
++ -- be one a union type, and the selector is a macro:
++ -- #define sa_handler __sigaction_u._handler
++ -- #define sa_sigaction __sigaction_u._sigaction
++
++ -- Should we add a signal_context type here ???
++ -- How could it be done independent of the CPU architecture ???
++ -- sigcontext type is opaque, so it is architecturally neutral.
++ -- It is always passed as an access type, so define it as an empty record
++ -- since the contents are not used anywhere.
++
++ type struct_sigcontext is null record;
++ pragma Convention (C, struct_sigcontext);
++
++ type pid_t is new int;
++
++ type time_t is new long;
++
++ type timespec is record
++ ts_sec : time_t;
++ ts_nsec : long;
++ end record;
++ pragma Convention (C, timespec);
++
++ type pthread_t is new System.Address;
++ type pthread_attr_t is new System.Address;
++ type pthread_mutex_t is new System.Address;
++ type pthread_mutexattr_t is new System.Address;
++ type pthread_cond_t is new System.Address;
++ type pthread_condattr_t is new System.Address;
++ type pthread_key_t is new int;
++
++end System.OS_Interface;
+--- gcc/ada/s-osinte-freebsd.adb.orig
++++ gcc/ada/s-osinte-freebsd.adb
+@@ -44,7 +44,7 @@
+ type int_ptr is access all int;
+
+ function internal_errno return int_ptr;
+- pragma Import (C, internal_errno, "__error");
++ pragma Import (C, internal_errno, "__get_errno");
+
+ begin
+ return (internal_errno.all);
+@@ -57,7 +57,7 @@
+ function Get_Stack_Base (thread : pthread_t) return Address is
+ pragma Unreferenced (thread);
+ begin
+- return (0);
++ return Null_Address;
+ end Get_Stack_Base;
+
+ ------------------
+--- /dev/null
++++ gcc/ada/s-osinte-netbsd.adb
+@@ -0,0 +1,140 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ I N T E R F A C E --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 1991-2009, Free Software Foundation, Inc. --
++-- --
++-- GNARL is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. It is --
++-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
++-- State University (http://www.gnat.com). --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the NetBSD THREADS version of this package
++
++with Interfaces.C; use Interfaces.C;
++
++package body System.OS_Interface is
++
++ -----------
++ -- Errno --
++ -----------
++
++ function Errno return int is
++ type int_ptr is access all int;
++
++ function internal_errno return int_ptr;
++ pragma Import (C, internal_errno, "__errno");
++
++ begin
++ return (internal_errno.all);
++ end Errno;
++
++ --------------------
++ -- Get_Stack_Base --
++ --------------------
++
++ function Get_Stack_Base (thread : pthread_t) return Address is
++ pragma Unreferenced (thread);
++ begin
++ return Null_Address;
++ end Get_Stack_Base;
++
++ ------------------
++ -- pthread_init --
++ ------------------
++
++ procedure pthread_init is
++ begin
++ null;
++ end pthread_init;
++
++ -----------------------------------
++ -- pthread_mutexattr_setprotocol --
++ -----------------------------------
++
++ function pthread_mutexattr_setprotocol
++ (attr : access pthread_mutexattr_t;
++ protocol : int) return int is
++ pragma Unreferenced (attr, protocol);
++ begin
++ return 0;
++ end pthread_mutexattr_setprotocol;
++
++ --------------------------------------
++ -- pthread_mutexattr_setprioceiling --
++ --------------------------------------
++
++ function pthread_mutexattr_setprioceiling
++ (attr : access pthread_mutexattr_t;
++ prioceiling : int) return int is
++ pragma Unreferenced (attr, prioceiling);
++ begin
++ return 0;
++ end pthread_mutexattr_setprioceiling;
++
++ -----------------
++ -- To_Duration --
++ -----------------
++
++ function To_Duration (TS : timespec) return Duration is
++ begin
++ return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
++ end To_Duration;
++
++ ------------------------
++ -- To_Target_Priority --
++ ------------------------
++
++ function To_Target_Priority
++ (Prio : System.Any_Priority) return Interfaces.C.int
++ is
++ begin
++ return Interfaces.C.int (Prio);
++ end To_Target_Priority;
++
++ -----------------
++ -- To_Timespec --
++ -----------------
++
++ function To_Timespec (D : Duration) return timespec is
++ S : time_t;
++ F : Duration;
++
++ begin
++ S := time_t (Long_Long_Integer (D));
++ F := D - Duration (S);
++
++ -- If F has negative value due to a round-up, adjust for positive F
++ -- value.
++
++ if F < 0.0 then
++ S := S - 1;
++ F := F + 1.0;
++ end if;
++
++ return timespec'(ts_sec => S,
++ ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
++ end To_Timespec;
++
++end System.OS_Interface;
+--- /dev/null
++++ gcc/ada/s-osinte-netbsd.ads
+@@ -0,0 +1,682 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ I N T E R F A C E --
++-- --
++-- S p e c --
++-- --
++-- Copyright (C) 1991-1994, Florida State University --
++-- Copyright (C) 1995-2014, Free Software Foundation, Inc. --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNARL was developed by the GNARL team at Florida State University. It is --
++-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
++-- State University (http://www.gnat.com). --
++-- --
++------------------------------------------------------------------------------
++
++-- This is the NetBSD PTHREADS version of this package.
++
++-- This package encapsulates all direct interfaces to OS services
++-- that are needed by the tasking run-time (libgnarl).
++
++-- PLEASE DO NOT add any with-clauses to this package or remove the pragma
++-- Preelaborate. This package is designed to be a bottom-level (leaf) package.
++
++with Ada.Unchecked_Conversion;
++
++with Interfaces.C;
++
++package System.OS_Interface is
++ pragma Preelaborate;
++
++ pragma Linker_Options ("-pthread");
++
++ subtype int is Interfaces.C.int;
++ subtype short is Interfaces.C.short;
++ subtype long is Interfaces.C.long;
++ subtype unsigned is Interfaces.C.unsigned;
++ subtype unsigned_short is Interfaces.C.unsigned_short;
++ subtype unsigned_long is Interfaces.C.unsigned_long;
++ subtype unsigned_char is Interfaces.C.unsigned_char;
++ subtype plain_char is Interfaces.C.plain_char;
++ subtype size_t is Interfaces.C.size_t;
++ subtype int64_t is Interfaces.Integer_64;
++
++ -----------
++ -- Errno --
++ -----------
++
++ function Errno return int;
++ pragma Inline (Errno);
++
++ EAGAIN : constant := 35;
++ EINTR : constant := 4;
++ EINVAL : constant := 22;
++ ENOMEM : constant := 12;
++ ETIMEDOUT : constant := 60;
++
++ -------------
++ -- Signals --
++ -------------
++
++ Max_Interrupt : constant := 63;
++ type Signal is new int range 0 .. Max_Interrupt;
++ for Signal'Size use int'Size;
++
++ SIGHUP : constant := 1; -- hangup
++ SIGINT : constant := 2; -- interrupt (rubout)
++ SIGQUIT : constant := 3; -- quit (ASCD FS)
++ SIGILL : constant := 4; -- illegal instruction (not reset)
++ SIGTRAP : constant := 5; -- trace trap (not reset)
++ SIGIOT : constant := 6; -- IOT instruction
++ SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future
++ SIGEMT : constant := 7; -- EMT instruction
++ SIGFPE : constant := 8; -- floating point exception
++ SIGKILL : constant := 9; -- kill (cannot be caught or ignored)
++ SIGBUS : constant := 10; -- bus error
++ SIGSEGV : constant := 11; -- segmentation violation
++ SIGSYS : constant := 12; -- bad argument to system call
++ SIGPIPE : constant := 13; -- write on a pipe with no one to read it
++ SIGALRM : constant := 14; -- alarm clock
++ SIGTERM : constant := 15; -- software termination signal from kill
++ SIGURG : constant := 16; -- urgent condition on IO channel
++ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored)
++ SIGTSTP : constant := 18; -- user stop requested from tty
++ SIGCONT : constant := 19; -- stopped process has been continued
++ SIGCLD : constant := 20; -- alias for SIGCHLD
++ SIGCHLD : constant := 20; -- child status change
++ SIGTTIN : constant := 21; -- background tty read attempted
++ SIGTTOU : constant := 22; -- background tty write attempted
++ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias)
++ SIGXCPU : constant := 24; -- CPU time limit exceeded
++ SIGXFSZ : constant := 25; -- filesize limit exceeded
++ SIGVTALRM : constant := 26; -- virtual timer expired
++ SIGPROF : constant := 27; -- profiling timer expired
++ SIGWINCH : constant := 28; -- window size change
++ SIGINFO : constant := 29; -- information request (BSD)
++ SIGUSR1 : constant := 30; -- user defined signal 1
++ SIGUSR2 : constant := 31; -- user defined signal 2
++ SIGPWR : constant := 32; -- power fail/restart (not reset when caught)
++
++ SIGADAABORT : constant := SIGABRT;
++ -- Change this if you want to use another signal for task abort.
++ -- SIGTERM might be a good one.
++
++ type Signal_Set is array (Natural range <>) of Signal;
++
++ -- Interrupts that must be unmasked at all times. NetBSD
++ -- pthreads will not allow an application to mask out any
++ -- interrupt needed by the threads library.
++ Unmasked : constant Signal_Set :=
++ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP);
++
++ -- NetBSD will uses SIGPROF for timing. Do not allow a
++ -- handler to attach to this signal.
++ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF);
++
++ type sigset_t is private;
++
++ function sigaddset
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigaddset, "__sigaddset14");
++
++ function sigdelset
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigdelset, "__sigdelset14");
++
++ function sigfillset (set : access sigset_t) return int;
++ pragma Import (C, sigfillset, "__sigfillset14");
++
++ function sigismember
++ (set : access sigset_t;
++ sig : Signal) return int;
++ pragma Import (C, sigismember, "__sigismember14");
++
++ function sigemptyset (set : access sigset_t) return int;
++ pragma Import (C, sigemptyset, "__sigemptyset14");
++
++ -- sigcontext is architecture dependent, so define it private
++ type struct_sigcontext is private;
++
++ type old_struct_sigaction is record
++ sa_handler : System.Address;
++ sa_mask : sigset_t;
++ sa_flags : int;
++ end record;
++ pragma Convention (C, old_struct_sigaction);
++
++ type new_struct_sigaction is record
++ sa_handler : System.Address;
++ sa_flags : int;
++ sa_mask : sigset_t;
++ end record;
++ pragma Convention (C, new_struct_sigaction);
++
++ subtype struct_sigaction is new_struct_sigaction;
++ type struct_sigaction_ptr is access all struct_sigaction;
++
++ SIG_BLOCK : constant := 1;
++ SIG_UNBLOCK : constant := 2;
++ SIG_SETMASK : constant := 3;
++
++ SIG_DFL : constant := 0;
++ SIG_IGN : constant := 1;
++ SIG_ERR : constant := -1;
++ SIG_HOLD : constant := 3;
++
++ SA_SIGINFO : constant := 16#0040#;
++ SA_ONSTACK : constant := 16#0001#;
++
++ function sigaction
++ (sig : Signal;
++ act : struct_sigaction_ptr;
++ oact : struct_sigaction_ptr) return int;
++ pragma Import (C, sigaction, "__sigaction14");
++
++ ----------
++ -- Time --
++ ----------
++
++ Time_Slice_Supported : constant Boolean := True;
++ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported)
++
++ type timespec is private;
++
++ function nanosleep (rqtp, rmtp : access timespec) return int;
++ pragma Import (C, nanosleep, "nanosleep");
++
++ type clockid_t is new int;
++
++ function clock_getres
++ (clock_id : clockid_t;
++ res : access timespec) return int;
++ pragma Import (C, clock_getres, "clock_getres");
++
++ function clock_gettime
++ (clock_id : clockid_t;
++ tp : access timespec)
++ return int;
++ pragma Import (C, clock_gettime, "clock_gettime");
++
++ function To_Duration (TS : timespec) return Duration;
++ pragma Inline (To_Duration);
++
++ function To_Timespec (D : Duration) return timespec;
++ pragma Inline (To_Timespec);
++
++ type struct_timezone is record
++ tz_minuteswest : int;
++ tz_dsttime : int;
++ end record;
++ pragma Convention (C, struct_timezone);
++
++ procedure usleep (useconds : unsigned_long);
++ pragma Import (C, usleep, "usleep");
++
++ -------------------------
++ -- Priority Scheduling --
++ -------------------------
++
++ SCHED_FIFO : constant := 1;
++ SCHED_OTHER : constant := 2;
++ SCHED_RR : constant := 3;
++
++ function To_Target_Priority
++ (Prio : System.Any_Priority) return Interfaces.C.int;
++ -- Maps System.Any_Priority to a POSIX priority
++
++ -------------
++ -- Process --
++ -------------
++
++ type pid_t is private;
++
++ function kill (pid : pid_t; sig : Signal) return int;
++ pragma Import (C, kill, "kill");
++
++ function getpid return pid_t;
++ pragma Import (C, getpid, "getpid");
++
++ ---------
++ -- LWP --
++ ---------
++
++ function lwp_self return System.Address;
++ -- lwp_self does not exist on this thread library, revert to pthread_self
++ -- which is the closest approximation (with getpid). This function is
++ -- needed to share 7staprop.adb across POSIX-like targets.
++ pragma Import (C, lwp_self, "pthread_self");
++
++ -------------
++ -- Threads --
++ -------------
++
++ type Thread_Body is access
++ function (arg : System.Address) return System.Address;
++ pragma Convention (C, Thread_Body);
++
++ function Thread_Body_Access is new
++ Ada.Unchecked_Conversion (System.Address, Thread_Body);
++
++ type pthread_t is private;
++ subtype Thread_Id is pthread_t;
++
++ type pthread_mutex_t is limited private;
++ type pthread_cond_t is limited private;
++ type pthread_attr_t is limited private;
++ type pthread_mutexattr_t is limited private;
++ type pthread_condattr_t is limited private;
++ type pthread_key_t is private;
++
++ PTHREAD_CREATE_DETACHED : constant := 1;
++ PTHREAD_CREATE_JOINABLE : constant := 0;
++
++ PTHREAD_SCOPE_PROCESS : constant := 0;
++ PTHREAD_SCOPE_SYSTEM : constant := 2;
++
++ -- Read/Write lock not supported on freebsd. To add support both types
++ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined
++ -- with the associated routines pthread_rwlock_[init/destroy] and
++ -- pthread_rwlock_[rdlock/wrlock/unlock].
++
++ subtype pthread_rwlock_t is pthread_mutex_t;
++ subtype pthread_rwlockattr_t is pthread_mutexattr_t;
++
++ -----------
++ -- Stack --
++ -----------
++
++ type stack_t is record
++ ss_sp : System.Address;
++ ss_size : size_t;
++ ss_flags : int;
++ end record;
++ pragma Convention (C, stack_t);
++
++ function sigaltstack
++ (ss : not null access stack_t;
++ oss : access stack_t) return int;
++ pragma Import (C, sigaltstack, "__sigaltstack14");
++
++ Alternate_Stack : aliased System.Address;
++ -- This is a dummy definition, never used (Alternate_Stack_Size is null)
++
++ Alternate_Stack_Size : constant := 0;
++ -- No alternate signal stack is used on this platform
++
++ Stack_Base_Available : constant Boolean := False;
++ -- Indicates whether the stack base is available on this target. This
++ -- allows us to share s-osinte.adb between all the FSU run time. Note that
++ -- this value can only be true if pthread_t has a complete definition that
++ -- corresponds exactly to the C header files.
++
++ function Get_Stack_Base (thread : pthread_t) return Address;
++ pragma Inline (Get_Stack_Base);
++ -- returns the stack base of the specified thread. Only call this function
++ -- when Stack_Base_Available is True.
++
++ function Get_Page_Size return size_t;
++ function Get_Page_Size return Address;
++ pragma Import (C, Get_Page_Size, "getpagesize");
++ -- Returns the size of a page
++
++ PROT_NONE : constant := 0;
++ PROT_READ : constant := 1;
++ PROT_WRITE : constant := 2;
++ PROT_EXEC : constant := 4;
++ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC;
++ PROT_ON : constant := PROT_NONE;
++ PROT_OFF : constant := PROT_ALL;
++
++ function mprotect (addr : Address; len : size_t; prot : int) return int;
++ pragma Import (C, mprotect);
++
++ ---------------------------------------
++ -- Nonstandard Thread Initialization --
++ ---------------------------------------
++
++ -- FSU_THREADS requires pthread_init, which is nonstandard and this should
++ -- be invoked during the elaboration of s-taprop.adb.
++
++ -- NetBSD does not require this so we provide an empty Ada body
++
++ procedure pthread_init;
++
++ -------------------------
++ -- POSIX.1c Section 3 --
++ -------------------------
++
++ function sigwait
++ (set : access sigset_t;
++ sig : access Signal) return int;
++ pragma Import (C, sigwait, "sigwait");
++
++ function pthread_kill
++ (thread : pthread_t;
++ sig : Signal) return int;
++ pragma Import (C, pthread_kill, "pthread_kill");
++
++ function pthread_sigmask
++ (how : int;
++ set : access sigset_t;
++ oset : access sigset_t) return int;
++ pragma Import (C, pthread_sigmask, "pthread_sigmask");
++
++ --------------------------
++ -- POSIX.1c Section 11 --
++ --------------------------
++
++ function pthread_mutexattr_init
++ (attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init");
++
++ function pthread_mutexattr_destroy
++ (attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy");
++
++ function pthread_mutex_init
++ (mutex : access pthread_mutex_t;
++ attr : access pthread_mutexattr_t) return int;
++ pragma Import (C, pthread_mutex_init, "pthread_mutex_init");
++
++ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy");
++
++ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock");
++
++ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock");
++
++ function pthread_condattr_init
++ (attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_condattr_init, "pthread_condattr_init");
++
++ function pthread_condattr_destroy
++ (attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy");
++
++ function pthread_cond_init
++ (cond : access pthread_cond_t;
++ attr : access pthread_condattr_t) return int;
++ pragma Import (C, pthread_cond_init, "pthread_cond_init");
++
++ function pthread_cond_destroy (cond : access pthread_cond_t) return int;
++ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy");
++
++ function pthread_cond_signal (cond : access pthread_cond_t) return int;
++ pragma Import (C, pthread_cond_signal, "pthread_cond_signal");
++
++ function pthread_cond_wait
++ (cond : access pthread_cond_t;
++ mutex : access pthread_mutex_t) return int;
++ pragma Import (C, pthread_cond_wait, "pthread_cond_wait");
++
++ function pthread_cond_timedwait
++ (cond : access pthread_cond_t;
++ mutex : access pthread_mutex_t;
++ abstime : access timespec) return int;
++ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
++
++ Relative_Timed_Wait : constant Boolean := False;
++ -- pthread_cond_timedwait requires an absolute delay time
++
++ --------------------------
++ -- POSIX.1c Section 13 --
++ --------------------------
++
++ PTHREAD_PRIO_NONE : constant := 0;
++ PTHREAD_PRIO_PROTECT : constant := 2;
++ PTHREAD_PRIO_INHERIT : constant := 1;
++
++ function pthread_mutexattr_setprotocol
++ (attr : access pthread_mutexattr_t;
++ protocol : int) return int;
++
++ function pthread_mutexattr_setprioceiling
++ (attr : access pthread_mutexattr_t;
++ prioceiling : int) return int;
++
++ type struct_sched_param is record
++ sched_priority : int;
++ end record;
++ pragma Convention (C, struct_sched_param);
++
++ function pthread_getschedparam
++ (thread : pthread_t;
++ policy : access int;
++ param : access struct_sched_param) return int;
++ pragma Import (C, pthread_getschedparam, "pthread_getschedparam");
++
++ function pthread_setschedparam
++ (thread : pthread_t;
++ policy : int;
++ param : access struct_sched_param) return int;
++ pragma Import (C, pthread_setschedparam, "pthread_setschedparam");
++
++ function pthread_attr_setscope
++ (attr : access pthread_attr_t;
++ contentionscope : int) return int;
++ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope");
++
++ function pthread_attr_getscope
++ (attr : access pthread_attr_t;
++ contentionscope : access int) return int;
++ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope");
++
++ function pthread_attr_setinheritsched
++ (attr : access pthread_attr_t;
++ inheritsched : int) return int;
++ pragma Import
++ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched");
++
++ function pthread_attr_getinheritsched
++ (attr : access pthread_attr_t;
++ inheritsched : access int) return int;
++ pragma Import
++ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched");
++
++ function pthread_attr_setschedpolicy
++ (attr : access pthread_attr_t;
++ policy : int) return int;
++ pragma Import (C, pthread_attr_setschedpolicy,
++ "pthread_attr_setschedpolicy");
++
++ function pthread_attr_getschedpolicy
++ (attr : access pthread_attr_t;
++ policy : access int) return int;
++ pragma Import (C, pthread_attr_getschedpolicy,
++ "pthread_attr_getschedpolicy");
++
++ function pthread_attr_setschedparam
++ (attr : access pthread_attr_t;
++ sched_param : int) return int;
++ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam");
++
++ function pthread_attr_getschedparam
++ (attr : access pthread_attr_t;
++ sched_param : access int) return int;
++ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam");
++
++ function sched_yield return int;
++ pragma Import (C, sched_yield, "sched_yield");
++
++ --------------------------
++ -- P1003.1c Section 16 --
++ --------------------------
++
++ function pthread_attr_init (attributes : access pthread_attr_t) return int;
++ pragma Import (C, pthread_attr_init, "pthread_attr_init");
++
++ function pthread_attr_destroy
++ (attributes : access pthread_attr_t) return int;
++ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy");
++
++ function pthread_attr_setdetachstate
++ (attr : access pthread_attr_t;
++ detachstate : int) return int;
++ pragma Import
++ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate");
++
++ function pthread_attr_getdetachstate
++ (attr : access pthread_attr_t;
++ detachstate : access int) return int;
++ pragma Import
++ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate");
++
++ function pthread_attr_getstacksize
++ (attr : access pthread_attr_t;
++ stacksize : access size_t) return int;
++ pragma Import
++ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize");
++
++ function pthread_attr_setstacksize
++ (attr : access pthread_attr_t;
++ stacksize : size_t) return int;
++ pragma Import
++ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize");
++
++ function pthread_create
++ (thread : access pthread_t;
++ attributes : access pthread_attr_t;
++ start_routine : Thread_Body;
++ arg : System.Address) return int;
++ pragma Import (C, pthread_create, "pthread_create");
++
++ function pthread_detach (thread : pthread_t) return int;
++ pragma Import (C, pthread_detach, "pthread_detach");
++
++ procedure pthread_exit (status : System.Address);
++ pragma Import (C, pthread_exit, "pthread_exit");
++
++ function pthread_self return pthread_t;
++ pragma Import (C, pthread_self, "pthread_self");
++
++ --------------------------
++ -- POSIX.1c Section 17 --
++ --------------------------
++
++ function pthread_setspecific
++ (key : pthread_key_t;
++ value : System.Address) return int;
++ pragma Import (C, pthread_setspecific, "pthread_setspecific");
++
++ function pthread_getspecific (key : pthread_key_t) return System.Address;
++ pragma Import (C, pthread_getspecific, "pthread_getspecific");
++
++ type destructor_pointer is access procedure (arg : System.Address);
++ pragma Convention (C, destructor_pointer);
++
++ function pthread_key_create
++ (key : access pthread_key_t;
++ destructor : destructor_pointer) return int;
++ pragma Import (C, pthread_key_create, "pthread_key_create");
++
++ ------------------------------------
++ -- Non-portable Pthread Functions --
++ ------------------------------------
++
++ function pthread_set_name_np
++ (thread : pthread_t;
++ name : System.Address) return int;
++ pragma Import (C, pthread_set_name_np, "pthread_set_name_np");
++
++private
++
++ type sigset_t is array (1 .. 4) of unsigned;
++
++ -- In NetBSD the component sa_handler turns out to
++ -- be one a union type, and the selector is a macro:
++ -- #define sa_handler __sigaction_u._handler
++ -- #define sa_sigaction __sigaction_u._sigaction
++
++ -- Should we add a signal_context type here ???
++ -- How could it be done independent of the CPU architecture ???
++ -- sigcontext type is opaque, so it is architecturally neutral.
++ -- It is always passed as an access type, so define it as an empty record
++ -- since the contents are not used anywhere.
++
++ type struct_sigcontext is null record;
++ pragma Convention (C, struct_sigcontext);
++
++ type pid_t is new int;
++
++ type time_t is new int64_t;
++
++ type timespec is record
++ ts_sec : time_t;
++ ts_nsec : long;
++ end record;
++ pragma Convention (C, timespec);
++
++ type pthread_t is new System.Address;
++ type pthread_attr_t is record
++ Pta_Magic : unsigned;
++ Pta_Flags : int;
++ Pta_Private : System.Address;
++ end record;
++ pragma Convention (C, pthread_attr_t);
++
++ -- PORT NOTE: The size of pthread_spin_t is defined in
++ -- /src/sys/arch/*/include/types.h
++ type pthread_spin_t is new unsigned_char;
++
++ type pthread_queue_t is record
++ Pthqh_First : pthread_t;
++ Pthqh_Last : System.Address;
++ end record;
++ pragma Convention (C, pthread_queue_t);
++
++ type pthread_mutex_t is record
++ Ptm_Majic : unsigned;
++ Ptm_Lock : pthread_spin_t;
++ Ptm_Interlock : pthread_spin_t;
++ Ptm_Owner : pthread_t;
++ Ptm_Block : pthread_queue_t;
++ Ptm_Private : System.Address;
++ end record;
++ pragma Convention (C, pthread_mutex_t);
++
++ type pthread_mutexattr_t is record
++ Ptma_Majic : unsigned;
++ Ptma_Private : System.Address;
++ end record;
++ pragma Convention (C, pthread_mutexattr_t);
++
++ type pthread_cond_t is record
++ Ptc_Magic : unsigned;
++ Ptc_Lock : pthread_spin_t;
++ Ptc_Waiters : pthread_queue_t;
++ Ptc_Mutex : pthread_mutex_t;
++ Ptc_Private : System.Address;
++ end record;
++ pragma Convention (C, pthread_cond_t);
++
++ type pthread_condattr_t is record
++ Ptca_Magic : unsigned;
++ Ptca_Private : System.Address;
++ end record;
++ pragma Convention (C, pthread_condattr_t);
++
++ type pthread_key_t is new int;
++
++end System.OS_Interface;
+--- /dev/null
++++ gcc/ada/s-trasym-bsd.adb
+@@ -0,0 +1,151 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME COMPONENTS --
++-- --
++-- S Y S T E M . T R A C E B A C K . S Y M B O L I C --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 1999-2009, AdaCore --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 2, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT 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 distributed with GNAT; see file COPYING. If not, write --
++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
++-- Boston, MA 02110-1301, USA. --
++-- --
++-- As a special exception, if other files instantiate generics from this --
++-- unit, or you link this unit with other files to produce an executable, --
++-- this unit does not by itself cause the resulting executable to be --
++-- covered by the GNU General Public License. This exception does not --
++-- however invalidate any other reasons why the executable file might be --
++-- covered by the GNU Public License. --
++-- --
++-- GNAT was originally developed by the GNAT team at New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc. --
++-- --
++------------------------------------------------------------------------------
++
++-- Run-time symbolic traceback support
++-- This file is based on the work by Juergen Pfiefer which is still used
++-- today to provide symbolic traceback support for gnu/kFreeBSD.
++-- Incorporated in GNAT-AUX by John Marino <http://www.dragonlace.net>
++
++with System.Soft_Links;
++with Ada.Exceptions.Traceback; use Ada.Exceptions.Traceback;
++
++package body System.Traceback.Symbolic is
++
++ package TSL renames System.Soft_Links;
++
++ -- To perform the raw addresses to symbolic form translation we rely on a
++ -- libaddr2line symbolizer which examines debug info from a provided
++ -- executable file name, and an absolute path is needed to ensure the file
++ -- is always found. This is "__gnat_locate_exec_on_path (gnat_argv [0])"
++ -- for our executable file, a fairly heavy operation so we cache the
++ -- result.
++
++ Exename : System.Address;
++ -- Pointer to the name of the executable file to be used on all
++ -- invocations of the libaddr2line symbolization service.
++
++ Exename_Resolved : Boolean := False;
++ -- Flag to indicate whether we have performed the executable file name
++ -- resolution already. Relying on a not null Exename for this purpose
++ -- would be potentially inefficient as this is what we will get if the
++ -- resolution attempt fails.
++
++ ------------------------
++ -- Symbolic_Traceback --
++ ------------------------
++
++ function Symbolic_Traceback (Traceback : Tracebacks_Array) return String is
++
++ procedure convert_addresses
++ (filename : System.Address;
++ addrs : System.Address;
++ n_addrs : Integer;
++ buf : System.Address;
++ len : System.Address);
++ pragma Import (C, convert_addresses, "convert_addresses");
++ -- This is the procedure version of the Ada-aware addr2line. It places
++ -- in BUF a string representing the symbolic translation of the N_ADDRS
++ -- raw addresses provided in ADDRS, looked up in debug information from
++ -- FILENAME. LEN points to an integer which contains the size of the
++ -- BUF buffer at input and the result length at output.
++ --
++ -- Note that this procedure is *not* thread-safe.
++
++ type Argv_Array is array (0 .. 0) of System.Address;
++ gnat_argv : access Argv_Array;
++ pragma Import (C, gnat_argv, "gnat_argv");
++
++ function locate_exec_on_path
++ (c_exename : System.Address) return System.Address;
++ pragma Import (C, locate_exec_on_path, "__gnat_locate_exec_on_path");
++
++ B_Size : constant Integer := 256 * Traceback'Length;
++ Len : Integer := B_Size;
++ Res : String (1 .. B_Size);
++
++ use type System.Address;
++
++ begin
++ -- The symbolic translation of an empty set of addresses is an empty
++ -- string.
++
++ if Traceback'Length = 0 then
++ return "";
++ end if;
++
++ -- If our input set of raw addresses is not empty, resort to the
++ -- libaddr2line service to symbolize it all.
++
++ -- Compute, cache and provide the absolute path to our executable file
++ -- name as the binary file where the relevant debug information is to be
++ -- found. If the executable file name resolution fails, we have no
++ -- sensible basis to invoke the symbolizer at all.
++
++ -- Protect all this against concurrent accesses explicitly, as the
++ -- underlying services are potentially thread unsafe.
++
++ TSL.Lock_Task.all;
++
++ if not Exename_Resolved then
++ Exename := locate_exec_on_path (gnat_argv (0));
++ Exename_Resolved := True;
++ end if;
++
++ if Exename /= System.Null_Address then
++ Len := Res'Length;
++ convert_addresses
++ (Exename, Traceback'Address, Traceback'Length,
++ Res (1)'Address, Len'Address);
++ end if;
++
++ TSL.Unlock_Task.all;
++
++ -- Return what the addr2line symbolizer has produced if we have called
++ -- it (the executable name resolution succeeded), or an empty string
++ -- otherwise.
++
++ if Exename /= System.Null_Address then
++ return Res (1 .. Len);
++ else
++ return "";
++ end if;
++
++ end Symbolic_Traceback;
++
++ function Symbolic_Traceback
++ (E : Ada.Exceptions.Exception_Occurrence) return String is
++ begin
++ return Symbolic_Traceback (Tracebacks (E));
++ end Symbolic_Traceback;
++
++end System.Traceback.Symbolic;
+--- gcc/ada/socket.c.orig
++++ gcc/ada/socket.c
+@@ -37,7 +37,10 @@
+
+ #include "gsocket.h"
+
+-#if defined(__FreeBSD__)
++#if defined(__FreeBSD__) \
++ || defined(__DragonFly__) \
++ || defined(__OpenBSD__) \
++ || defined(__NetBSD__)
+ typedef unsigned int IOCTL_Req_T;
+ #else
+ typedef int IOCTL_Req_T;
+--- gcc/ada/sysdep.c.orig
++++ gcc/ada/sysdep.c
+@@ -287,6 +287,7 @@
+ || defined (__MACHTEN__) || defined (__hpux__) || defined (_AIX) \
+ || (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \
+ || defined (__CYGWIN__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
++ || defined (__DragonFly__) \
+ || defined (__GLIBC__) || defined (__APPLE__)
+
+ # ifdef __MINGW32__
+@@ -339,6 +340,7 @@
+ || defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (__hpux__) \
+ || defined (_AIX) || (defined (__svr4__) && defined (i386)) \
+ || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
++ || defined (__DragonFly__) \
+ || defined (__GLIBC__) || defined (__APPLE__)
+ char c;
+ int nread;
+@@ -359,6 +361,7 @@
+ || defined (__MACHTEN__) || defined (__hpux__) \
+ || defined (_AIX) || (defined (__svr4__) && defined (i386)) \
+ || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
++ || defined (__DragonFly__) \
+ || defined (__GLIBC__) || defined (__APPLE__)
+ eof_ch = termios_rec.c_cc[VEOF];
+
+@@ -820,6 +823,8 @@
+ struct tm */
+
+ #elif defined (__APPLE__) || defined (__FreeBSD__) || defined (linux) \
++ || defined (__DragonFly__) \
++ || defined (__OpenBSD__) \
+ || defined (__GLIBC__)
+ {
+ localtime_r (timer, &tp);
+--- /dev/null
++++ gcc/ada/system-dragonfly-x86_64.ads
+@@ -0,0 +1,144 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME COMPONENTS --
++-- --
++-- S Y S T E M --
++-- --
++-- S p e c --
++-- (DragonFly BSD/x86_64 Version) --
++-- --
++-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
++-- --
++-- This specification is derived from the Ada Reference Manual for use with --
++-- GNAT. The copyright notice above, and the license provisions that follow --
++-- apply solely to the contents of the part following the private keyword. --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNAT was originally developed by the GNAT team at New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc. --
++-- --
++------------------------------------------------------------------------------
++
++package System is
++ pragma Pure;
++ -- Note that we take advantage of the implementation permission to make
++ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
++ -- 2005, this is Pure in any case (AI-362).
++
++ type Name is (SYSTEM_NAME_GNAT);
++ System_Name : constant Name := SYSTEM_NAME_GNAT;
++
++ -- System-Dependent Named Numbers
++
++ Min_Int : constant := Long_Long_Integer'First;
++ Max_Int : constant := Long_Long_Integer'Last;
++
++ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size;
++ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1;
++
++ Max_Base_Digits : constant := Long_Long_Float'Digits;
++ Max_Digits : constant := Long_Long_Float'Digits;
++
++ Max_Mantissa : constant := 63;
++ Fine_Delta : constant := 2.0 ** (-Max_Mantissa);
++
++ Tick : constant := 0.000_001;
++
++ -- Storage-related Declarations
++
++ type Address is private;
++ pragma Preelaborable_Initialization (Address);
++ Null_Address : constant Address;
++
++ Storage_Unit : constant := 8;
++ Word_Size : constant := 64;
++ Memory_Size : constant := 2 ** 64;
++
++ -- Address comparison
++
++ function "<" (Left, Right : Address) return Boolean;
++ function "<=" (Left, Right : Address) return Boolean;
++ function ">" (Left, Right : Address) return Boolean;
++ function ">=" (Left, Right : Address) return Boolean;
++ function "=" (Left, Right : Address) return Boolean;
++
++ pragma Import (Intrinsic, "<");
++ pragma Import (Intrinsic, "<=");
++ pragma Import (Intrinsic, ">");
++ pragma Import (Intrinsic, ">=");
++ pragma Import (Intrinsic, "=");
++
++ -- Other System-Dependent Declarations
++
++ type Bit_Order is (High_Order_First, Low_Order_First);
++ Default_Bit_Order : constant Bit_Order := Low_Order_First;
++ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning
++
++ -- Priority-related Declarations (RM D.1)
++
++ Max_Priority : constant Positive := 30;
++ Max_Interrupt_Priority : constant Positive := 31;
++
++ subtype Any_Priority is Integer range 0 .. 31;
++ subtype Priority is Any_Priority range 0 .. 30;
++ subtype Interrupt_Priority is Any_Priority range 31 .. 31;
++
++ Default_Priority : constant Priority := 15;
++
++private
++
++ type Address is mod Memory_Size;
++ Null_Address : constant Address := 0;
++
++ --------------------------------------
++ -- System Implementation Parameters --
++ --------------------------------------
++
++ -- These parameters provide information about the target that is used
++ -- by the compiler. They are in the private part of System, where they
++ -- can be accessed using the special circuitry in the Targparm unit
++ -- whose source should be consulted for more detailed descriptions
++ -- of the individual switch values.
++
++ Backend_Divide_Checks : constant Boolean := False;
++ Backend_Overflow_Checks : constant Boolean := True;
++ Command_Line_Args : constant Boolean := True;
++ Configurable_Run_Time : constant Boolean := False;
++ Denorm : constant Boolean := True;
++ Duration_32_Bits : constant Boolean := False;
++ Exit_Status_Supported : constant Boolean := True;
++ Fractional_Fixed_Ops : constant Boolean := False;
++ Frontend_Layout : constant Boolean := False;
++ Machine_Overflows : constant Boolean := False;
++ Machine_Rounds : constant Boolean := True;
++ Preallocated_Stacks : constant Boolean := False;
++ Signed_Zeros : constant Boolean := True;
++ Stack_Check_Default : constant Boolean := False;
++ Stack_Check_Probes : constant Boolean := True;
++ Stack_Check_Limits : constant Boolean := False;
++ Support_Aggregates : constant Boolean := True;
++ Support_Atomic_Primitives : constant Boolean := True;
++ Support_Composite_Assign : constant Boolean := True;
++ Support_Composite_Compare : constant Boolean := True;
++ Support_Long_Shifts : constant Boolean := True;
++ Always_Compatible_Rep : constant Boolean := False;
++ Suppress_Standard_Library : constant Boolean := False;
++ Use_Ada_Main_Program_Name : constant Boolean := False;
++ ZCX_By_Default : constant Boolean := True;
++
++end System;
+--- /dev/null
++++ gcc/ada/system-netbsd-x86.ads
+@@ -0,0 +1,144 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME COMPONENTS --
++-- --
++-- S Y S T E M --
++-- --
++-- S p e c --
++-- (NetBSD/x86 Version) --
++-- --
++-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
++-- --
++-- This specification is derived from the Ada Reference Manual for use with --
++-- GNAT. The copyright notice above, and the license provisions that follow --
++-- apply solely to the contents of the part following the private keyword. --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNAT was originally developed by the GNAT team at New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc. --
++-- --
++------------------------------------------------------------------------------
++
++package System is
++ pragma Pure;
++ -- Note that we take advantage of the implementation permission to make
++ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
++ -- 2005, this is Pure in any case (AI-362).
++
++ type Name is (SYSTEM_NAME_GNAT);
++ System_Name : constant Name := SYSTEM_NAME_GNAT;
++
++ -- System-Dependent Named Numbers
++
++ Min_Int : constant := Long_Long_Integer'First;
++ Max_Int : constant := Long_Long_Integer'Last;
++
++ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size;
++ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1;
++
++ Max_Base_Digits : constant := Long_Long_Float'Digits;
++ Max_Digits : constant := Long_Long_Float'Digits;
++
++ Max_Mantissa : constant := 63;
++ Fine_Delta : constant := 2.0 ** (-Max_Mantissa);
++
++ Tick : constant := 0.000_001;
++
++ -- Storage-related Declarations
++
++ type Address is private;
++ pragma Preelaborable_Initialization (Address);
++ Null_Address : constant Address;
++
++ Storage_Unit : constant := 8;
++ Word_Size : constant := 32;
++ Memory_Size : constant := 2 ** 32;
++
++ -- Address comparison
++
++ function "<" (Left, Right : Address) return Boolean;
++ function "<=" (Left, Right : Address) return Boolean;
++ function ">" (Left, Right : Address) return Boolean;
++ function ">=" (Left, Right : Address) return Boolean;
++ function "=" (Left, Right : Address) return Boolean;
++
++ pragma Import (Intrinsic, "<");
++ pragma Import (Intrinsic, "<=");
++ pragma Import (Intrinsic, ">");
++ pragma Import (Intrinsic, ">=");
++ pragma Import (Intrinsic, "=");
++
++ -- Other System-Dependent Declarations
++
++ type Bit_Order is (High_Order_First, Low_Order_First);
++ Default_Bit_Order : constant Bit_Order := Low_Order_First;
++ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning
++
++ -- Priority-related Declarations (RM D.1)
++
++ Max_Priority : constant Positive := 30;
++ Max_Interrupt_Priority : constant Positive := 31;
++
++ subtype Any_Priority is Integer range 0 .. 31;
++ subtype Priority is Any_Priority range 0 .. 30;
++ subtype Interrupt_Priority is Any_Priority range 31 .. 31;
++
++ Default_Priority : constant Priority := 15;
++
++private
++
++ type Address is mod Memory_Size;
++ Null_Address : constant Address := 0;
++
++ --------------------------------------
++ -- System Implementation Parameters --
++ --------------------------------------
++
++ -- These parameters provide information about the target that is used
++ -- by the compiler. They are in the private part of System, where they
++ -- can be accessed using the special circuitry in the Targparm unit
++ -- whose source should be consulted for more detailed descriptions
++ -- of the individual switch values.
++
++ Backend_Divide_Checks : constant Boolean := False;
++ Backend_Overflow_Checks : constant Boolean := True;
++ Command_Line_Args : constant Boolean := True;
++ Configurable_Run_Time : constant Boolean := False;
++ Denorm : constant Boolean := True;
++ Duration_32_Bits : constant Boolean := False;
++ Exit_Status_Supported : constant Boolean := True;
++ Fractional_Fixed_Ops : constant Boolean := False;
++ Frontend_Layout : constant Boolean := False;
++ Machine_Overflows : constant Boolean := False;
++ Machine_Rounds : constant Boolean := True;
++ Preallocated_Stacks : constant Boolean := False;
++ Signed_Zeros : constant Boolean := True;
++ Stack_Check_Default : constant Boolean := False;
++ Stack_Check_Probes : constant Boolean := True;
++ Stack_Check_Limits : constant Boolean := False;
++ Support_Aggregates : constant Boolean := True;
++ Support_Atomic_Primitives : constant Boolean := True;
++ Support_Composite_Assign : constant Boolean := True;
++ Support_Composite_Compare : constant Boolean := True;
++ Support_Long_Shifts : constant Boolean := True;
++ Always_Compatible_Rep : constant Boolean := False;
++ Suppress_Standard_Library : constant Boolean := False;
++ Use_Ada_Main_Program_Name : constant Boolean := False;
++ ZCX_By_Default : constant Boolean := True;
++
++end System;
+--- /dev/null
++++ gcc/ada/system-netbsd-x86_64.ads
+@@ -0,0 +1,144 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME COMPONENTS --
++-- --
++-- S Y S T E M --
++-- --
++-- S p e c --
++-- (NetBSD/x86_64 Version) --
++-- --
++-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
++-- --
++-- This specification is derived from the Ada Reference Manual for use with --
++-- GNAT. The copyright notice above, and the license provisions that follow --
++-- apply solely to the contents of the part following the private keyword. --
++-- --
++-- GNAT is free software; you can redistribute it and/or modify it under --
++-- terms of the GNU General Public License as published by the Free Soft- --
++-- ware Foundation; either version 3, or (at your option) any later ver- --
++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE. --
++-- --
++-- As a special exception 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/>. --
++-- --
++-- GNAT was originally developed by the GNAT team at New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc. --
++-- --
++------------------------------------------------------------------------------
++
++package System is
++ pragma Pure;
++ -- Note that we take advantage of the implementation permission to make
++ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
++ -- 2005, this is Pure in any case (AI-362).
++
++ type Name is (SYSTEM_NAME_GNAT);
++ System_Name : constant Name := SYSTEM_NAME_GNAT;
++
++ -- System-Dependent Named Numbers
++
++ Min_Int : constant := Long_Long_Integer'First;
++ Max_Int : constant := Long_Long_Integer'Last;
++
++ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size;
++ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1;
++
++ Max_Base_Digits : constant := Long_Long_Float'Digits;
++ Max_Digits : constant := Long_Long_Float'Digits;
++
++ Max_Mantissa : constant := 63;
++ Fine_Delta : constant := 2.0 ** (-Max_Mantissa);
++
++ Tick : constant := 0.000_001;
++
++ -- Storage-related Declarations
++
++ type Address is private;
++ pragma Preelaborable_Initialization (Address);
++ Null_Address : constant Address;
++
++ Storage_Unit : constant := 8;
++ Word_Size : constant := 64;
++ Memory_Size : constant := 2 ** 64;
++
++ -- Address comparison
++
++ function "<" (Left, Right : Address) return Boolean;
++ function "<=" (Left, Right : Address) return Boolean;
++ function ">" (Left, Right : Address) return Boolean;
++ function ">=" (Left, Right : Address) return Boolean;
++ function "=" (Left, Right : Address) return Boolean;
++
++ pragma Import (Intrinsic, "<");
++ pragma Import (Intrinsic, "<=");
++ pragma Import (Intrinsic, ">");
++ pragma Import (Intrinsic, ">=");
++ pragma Import (Intrinsic, "=");
++
++ -- Other System-Dependent Declarations
++
++ type Bit_Order is (High_Order_First, Low_Order_First);
++ Default_Bit_Order : constant Bit_Order := Low_Order_First;
++ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning
++
++ -- Priority-related Declarations (RM D.1)
++
++ Max_Priority : constant Positive := 30;
++ Max_Interrupt_Priority : constant Positive := 31;
++
++ subtype Any_Priority is Integer range 0 .. 31;
++ subtype Priority is Any_Priority range 0 .. 30;
++ subtype Interrupt_Priority is Any_Priority range 31 .. 31;
++
++ Default_Priority : constant Priority := 15;
++
++private
++
++ type Address is mod Memory_Size;
++ Null_Address : constant Address := 0;
++
++ --------------------------------------
++ -- System Implementation Parameters --
++ --------------------------------------
++
++ -- These parameters provide information about the target that is used
++ -- by the compiler. They are in the private part of System, where they
++ -- can be accessed using the special circuitry in the Targparm unit
++ -- whose source should be consulted for more detailed descriptions
++ -- of the individual switch values.
++
++ Backend_Divide_Checks : constant Boolean := False;
++ Backend_Overflow_Checks : constant Boolean := True;
++ Command_Line_Args : constant Boolean := True;
++ Configurable_Run_Time : constant Boolean := False;
++ Denorm : constant Boolean := True;
++ Duration_32_Bits : constant Boolean := False;
++ Exit_Status_Supported : constant Boolean := True;
++ Fractional_Fixed_Ops : constant Boolean := False;
++ Frontend_Layout : constant Boolean := False;
++ Machine_Overflows : constant Boolean := False;
++ Machine_Rounds : constant Boolean := True;
++ Preallocated_Stacks : constant Boolean := False;
++ Signed_Zeros : constant Boolean := True;
++ Stack_Check_Default : constant Boolean := False;
++ Stack_Check_Probes : constant Boolean := True;
++ Stack_Check_Limits : constant Boolean := False;
++ Support_Aggregates : constant Boolean := True;
++ Support_Atomic_Primitives : constant Boolean := True;
++ Support_Composite_Assign : constant Boolean := True;
++ Support_Composite_Compare : constant Boolean := True;
++ Support_Long_Shifts : constant Boolean := True;
++ Always_Compatible_Rep : constant Boolean := False;
++ Suppress_Standard_Library : constant Boolean := False;
++ Use_Ada_Main_Program_Name : constant Boolean := False;
++ ZCX_By_Default : constant Boolean := True;
++
++end System;
+--- gcc/ada/terminals.c.orig
++++ gcc/ada/terminals.c
+@@ -32,7 +32,7 @@
+ /* First all usupported platforms. Add stubs for exported routines. */
+
+ #if defined (VMS) || defined (__vxworks) || defined (__Lynx__) \
+- || defined (__ANDROID__) || defined (__PikeOS__)
++ || defined (__PikeOS__)
+
+ #define ATTRIBUTE_UNUSED __attribute__((unused))
+
+@@ -1094,7 +1094,11 @@
+ # include <sys/stropts.h>
+ #endif
+
++#ifdef __ANDROID__
++#define CDISABLE _PC_VDISABLE
++#else
+ #define CDISABLE _POSIX_VDISABLE
++#endif
+
+ /* On HP-UX and Sun system, there is a bzero function but with a different
+ signature. Use memset instead */
+--- /dev/null
++++ gcc/ada/traceback_symbolic.c
+@@ -0,0 +1,201 @@
++/*
++ Copyright (C) 1999 by Juergen Pfeifer <juergen.pfeifer@gmx.net>
++ Ada for Linux Team (ALT)
++ Heavily modified by John Marino <http://www.dragonlace.net>
++
++ Permission is hereby granted, free of charge, to any person obtaining a
++ copy of this software and associated documentation files (the
++ "Software"), to deal in the Software without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, distribute with modifications, sublicense, and/or sell
++ copies of the Software, and to permit persons to whom the Software is
++ furnished to do so, subject to the following conditions:
++
++ The above copyright notice and this permission notice shall be included
++ in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++ IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
++ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
++ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
++ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++
++ Except as contained in this notice, the name(s) of the above copyright
++ holders shall not be used in advertising or otherwise to promote the
++ sale, use or other dealings in this Software without prior written
++ authorization.
++*/
++
++#ifdef IS_CROSS
++
++
++/*
++ * Running addr2line doesn't make sense for cross-compiled objects.
++ * Create a dummy function to satisfy g-trasym.o
++ */
++
++void
++convert_addresses (const char *file_name ATTRIBUTE_UNUSED,
++ void *addrs ATTRIBUTE_UNUSED,
++ int n_addr ATTRIBUTE_UNUSED,
++ void *buf ATTRIBUTE_UNUSED,
++ int *len ATTRIBUTE_UNUSED)
++{
++ *len = 0;
++}
++
++#else
++
++
++/*
++ * use the external program /usr/bin/addr2line to convert addresses
++ * into file names and line numbers
++ */
++
++#include <sys/types.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <string.h>
++#include <signal.h>
++
++#define CLOSE_SENDPIPE close(sendpipe[0]); close(sendpipe[1])
++#define CLOSE_READPIPE close(readpipe[0]); close(readpipe[1])
++#define DUP2CLOSE(oldfd, newfd) dup2(oldfd, newfd); close(oldfd);
++#define RESTSIG sigaction(SIGPIPE,&oact,NULL)
++
++#define MAX_LINE 1024
++#define PARENT_READ readpipe[0]
++#define CHILD_WRITE readpipe[1]
++#define CHILD_READ sendpipe[0]
++#define PARENT_WRITE sendpipe[1]
++
++#if defined (__sun__)
++#define ADDR2LINE_PROG "/usr/gnu/bin/addr2line"
++#else
++#define ADDR2LINE_PROG "/usr/bin/addr2line"
++#endif
++
++void
++convert_addresses (const char *file_name,
++ void *addrs,
++ int n_addr,
++ void *buf,
++ int *len)
++{
++ int max_len = *len;
++ pid_t childpid;
++
++ struct sigaction act, oact;
++
++ int sendpipe[2] = {-1,-1}, /* parent -> child */
++ readpipe[2] = {-1,-1}; /* parent <- child */
++
++ *len = 0;
++ act.sa_handler = SIG_IGN;
++ sigemptyset(&act.sa_mask);
++ act.sa_flags = 0;
++ if (sigaction(SIGPIPE,&act,&oact) < 0)
++ return;
++
++ if (pipe(sendpipe) < 0) { RESTSIG; return; }
++ if (pipe(readpipe) < 0) { CLOSE_SENDPIPE; RESTSIG; return; }
++ if ((childpid = fork()) < 0) {
++ CLOSE_READPIPE;
++ CLOSE_SENDPIPE;
++ RESTSIG;
++ return;
++ }
++
++ if (childpid == 0) { /* child process */
++ close(PARENT_WRITE);
++ close(PARENT_READ);
++ if ((CHILD_READ != STDIN_FILENO) && (CHILD_WRITE != STDOUT_FILENO)) {
++ if ((CHILD_READ == STDOUT_FILENO) && (CHILD_WRITE == STDIN_FILENO)) {
++ const int temp_fd = dup(CHILD_WRITE);
++ close (CHILD_WRITE);
++ DUP2CLOSE (CHILD_READ, STDIN_FILENO);
++ DUP2CLOSE (temp_fd, STDOUT_FILENO);
++ }
++ else if ((CHILD_READ == STDIN_FILENO) && (CHILD_WRITE > 1)) {
++ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO);
++ }
++ else if ((CHILD_READ > 1) && (CHILD_WRITE == STDOUT_FILENO)) {
++ DUP2CLOSE (CHILD_READ, STDIN_FILENO);
++ }
++ else if ((CHILD_READ > 1) && (CHILD_WRITE == STDIN_FILENO)) {
++ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO);
++ DUP2CLOSE (CHILD_READ, STDIN_FILENO);
++ }
++ else {
++ /* CHILD_READ >= 1 and CHILD_WRITE > 1 */
++ DUP2CLOSE (CHILD_READ, STDIN_FILENO);
++ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO);
++ }
++ }
++ /* As pointed out by Florian Weimer to JP, it is a security threat to call
++ the script with a user defined environment and using the path. That
++ would be Trojans pleasure. Therefore the absolute path to addr2line
++ and an empty environment is used. That should be safe.
++ */
++ char *const argv[] = { "addr2line",
++ "-e", file_name,
++ "--demangle=gnat",
++ "--functions",
++ "--basenames",
++ NULL };
++ char *const envp[] = { NULL };
++ if (execve(ADDR2LINE_PROG, argv, envp) < 0) {
++ close (CHILD_WRITE);
++ close (CHILD_READ);
++ RESTSIG;
++ exit (1);
++ }
++ }
++
++ /* Below this line is parent process */
++ int i, n;
++ char hex[16];
++ char line[MAX_LINE + 1];
++ char *p;
++ char *s = buf;
++ long *trace_address = addrs;
++
++ close(CHILD_WRITE);
++ close(CHILD_READ);
++
++ for(i=0; i < n_addr; i++) {
++ snprintf(hex,sizeof(hex),"%#lx\n",*trace_address);
++ write(PARENT_WRITE,hex,strlen(hex));
++ n = read(PARENT_READ,line,MAX_LINE);
++ if (n<=0)
++ break;
++
++ line[n]=0;
++ /* We have approx. 16 additional chars for "%#lx in " clause.
++ We use this info to prevent a buffer overrun. */
++ if (n + 16 + (*len) > max_len)
++ break;
++
++ p = strchr(line,'\n');
++ if (p) {
++ if (*(p+1)) {
++ *p = 0;
++ *len += snprintf(s, (max_len - (*len)), "%#lx in %s at %s",
++ *trace_address, line, p+1);
++ }
++ else {
++ *len += snprintf(s, (max_len - (*len)), "%#lx at %s",
++ *trace_address, line);
++ }
++ s = buf + (*len);
++ }
++ trace_address += 1;
++ }
++ close (PARENT_WRITE);
++ close (PARENT_READ);
++ RESTSIG;
++}
++
++#endif
+--- gcc/ada/tracebak.c.orig
++++ gcc/ada/tracebak.c
+@@ -278,6 +278,23 @@
+ #error Unhandled darwin architecture.
+ #endif
+
++/*---------------------------- x86 *BSD --------------------------------*/
++
++#elif defined (__i386__) && \
++ ( defined (__NetBSD__) \
++ || defined (__FreeBSD__) \
++ || defined (__OpenBSD__) \
++ || defined (__DragonFly__) )
++
++#define USE_GCC_UNWINDER
++/* The generic unwinder is not used for this target because the default
++ implementation doesn't unwind on the BSD platforms. AMD64 targets use the
++ gcc unwinder for all platforms, so let's keep i386 consistent with that.
++*/
++
++#define PC_ADJUST -2
++/* The minimum size of call instructions on this architecture is 2 bytes */
++
+ /*---------------------- PPC AIX/PPC Lynx 178/Older Darwin ------------------*/
+ #elif ((defined (_POWER) && defined (_AIX)) || \
+ (defined (__powerpc__) && defined (__Lynx__) && !defined(__ELF__)) || \
+--- gcc/ada/gcc-interface/Make-lang.in.orig
++++ gcc/ada/gcc-interface/Make-lang.in
+@@ -588,7 +588,7 @@
+ ada/widechar.o
+
+ # Language-independent object files.
+-ADA_BACKEND = $(BACKEND) attribs.o
++ADA_BACKEND = $(BACKEND2) attribs.o
+
+ # List of target dependent sources, overridden below as necessary
+ TARGET_ADA_SRCS =
+--- gcc/ada/gcc-interface/Makefile.in.orig
++++ gcc/ada/gcc-interface/Makefile.in
+@@ -1136,6 +1136,7 @@
+ ifeq ($(strip $(filter-out arm% linux-androideabi,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
+ a-intnam.ads<a-intnam-linux.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
+ s-inmaop.adb<s-inmaop-posix.adb \
+ s-intman.adb<s-intman-android.adb \
+ s-linux.ads<s-linux-android.ads \
+@@ -1166,6 +1167,7 @@
+ ifeq ($(strip $(filter-out sparc% sun solaris%,$(target_cpu) $(target_vendor) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS_COMMON = \
+ a-intnam.ads<a-intnam-solaris.ads \
++ s-trasym.adb<s-trasym-bsd.adb \
+ s-inmaop.adb<s-inmaop-posix.adb \
+ s-intman.adb<s-intman-solaris.adb \
+ s-mudido.adb<s-mudido-affinity.adb \
+@@ -1208,6 +1210,8 @@
+ TOOLS_TARGET_PAIRS=mlib-tgt-specific.adb<mlib-tgt-specific-solaris.adb
+
+ EH_MECHANISM=-gcc
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
+ THREADSLIB = -lposix4 -lthread
+ MISCLIB = -lposix4 -lnsl -lsocket
+ SO_OPTS = -Wl,-h,
+@@ -1420,8 +1424,11 @@
+ ifeq ($(strip $(filter-out %86 freebsd%,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
+ a-intnam.ads<a-intnam-freebsd.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
++ s-trasym.adb<s-trasym-bsd.adb \
+ s-inmaop.adb<s-inmaop-posix.adb \
+ s-intman.adb<s-intman-posix.adb \
++ s-mudido.adb<s-mudido-affinity.adb \
+ s-osinte.adb<s-osinte-freebsd.adb \
+ s-osinte.ads<s-osinte-freebsd.ads \
+ s-osprim.adb<s-osprim-posix.adb \
+@@ -1436,6 +1443,8 @@
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb
+ GNATLIB_SHARED = gnatlib-shared-dual
+
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
+
+ EH_MECHANISM=-gcc
+@@ -1449,8 +1458,11 @@
+ ifeq ($(strip $(filter-out %86_64 freebsd%,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
+ a-intnam.ads<a-intnam-freebsd.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
++ s-trasym.adb<s-trasym-bsd.adb \
+ s-inmaop.adb<s-inmaop-posix.adb \
+ s-intman.adb<s-intman-posix.adb \
++ s-mudido.adb<s-mudido-affinity.adb \
+ s-osinte.adb<s-osinte-freebsd.adb \
+ s-osinte.ads<s-osinte-freebsd.ads \
+ s-osprim.adb<s-osprim-posix.adb \
+@@ -1465,6 +1477,110 @@
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb
+ GNATLIB_SHARED = gnatlib-shared-dual
+
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
++ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86_64 DragonFly
++ifeq ($(strip $(filter-out x86_64 dragonfly%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-intnam.ads<a-intnam-dragonfly.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
++ s-trasym.adb<s-trasym-bsd.adb \
++ s-inmaop.adb<s-inmaop-posix.adb \
++ s-intman.adb<s-intman-posix.adb \
++ s-mudido.adb<s-mudido-affinity.adb \
++ s-osinte.adb<s-osinte-dragonfly.adb \
++ s-osinte.ads<s-osinte-dragonfly.ads \
++ s-osprim.adb<s-osprim-posix.adb \
++ s-taprop.adb<s-taprop-posix.adb \
++ s-taspri.ads<s-taspri-posix.ads \
++ s-tpopsp.adb<s-tpopsp-posix.adb \
++ $(ATOMICS_TARGET_PAIRS) \
++ $(X86_64_TARGET_PAIRS) \
++ system.ads<system-dragonfly-x86_64.ads
++
++ TOOLS_TARGET_PAIRS = \
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb
++ GNATLIB_SHARED = gnatlib-shared-dual
++
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
++ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86 NetBSD
++ifeq ($(strip $(filter-out %86 netbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-intnam.ads<a-intnam-netbsd.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
++ s-trasym.adb<s-trasym-bsd.adb \
++ s-inmaop.adb<s-inmaop-posix.adb \
++ s-intman.adb<s-intman-posix.adb \
++ s-mudido.adb<s-mudido-affinity.adb \
++ s-osinte.adb<s-osinte-netbsd.adb \
++ s-osinte.ads<s-osinte-netbsd.ads \
++ s-osprim.adb<s-osprim-posix.adb \
++ s-taprop.adb<s-taprop-posix.adb \
++ s-taspri.ads<s-taspri-posix.ads \
++ s-tpopsp.adb<s-tpopsp-posix.adb \
++ $(ATOMICS_TARGET_PAIRS) \
++ $(X86_TARGET_PAIRS) \
++ system.ads<system-netbsd-x86.ads
++
++ TOOLS_TARGET_PAIRS = \
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb
++ GNATLIB_SHARED = gnatlib-shared-dual
++
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
++ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86_64 NetBSD
++ifeq ($(strip $(filter-out x86_64 netbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-intnam.ads<a-intnam-netbsd.ads \
++ g-socthi.adb<g-socthi-bsd.adb \
++ s-trasym.adb<s-trasym-bsd.adb \
++ s-inmaop.adb<s-inmaop-posix.adb \
++ s-intman.adb<s-intman-posix.adb \
++ s-mudido.adb<s-mudido-affinity.adb \
++ s-osinte.adb<s-osinte-netbsd.adb \
++ s-osinte.ads<s-osinte-netbsd.ads \
++ s-osprim.adb<s-osprim-posix.adb \
++ s-taprop.adb<s-taprop-posix.adb \
++ s-taspri.ads<s-taspri-posix.ads \
++ s-tpopsp.adb<s-tpopsp-posix.adb \
++ $(ATOMICS_TARGET_PAIRS) \
++ $(X86_64_TARGET_PAIRS) \
++ system.ads<system-netbsd-x86_64.ads
++
++ TOOLS_TARGET_PAIRS = \
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb
++ GNATLIB_SHARED = gnatlib-shared-dual
++
++ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c
++ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o
+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
+
+ EH_MECHANISM=-gcc
+--- gnattools/configure.ac.orig
++++ gnattools/configure.ac
+@@ -79,11 +79,27 @@
+ mlib-tgt-specific.adb<mlib-tgt-specific-darwin.adb \
+ indepsw.adb<indepsw-darwin.adb"
+ ;;
++ *-*-dragonfly*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
+ *-*-freebsd*)
+ TOOLS_TARGET_PAIRS="\
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+ indepsw.adb<indepsw-gnu.adb"
+ ;;
++ *-*-netbsd*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
++ *-*-openbsd*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
++ # Next line covers arm*-*-linux-androideabi
+ *-*-linux*)
+ TOOLS_TARGET_PAIRS="\
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+--- gnattools/configure.orig
++++ gnattools/configure
+@@ -2039,11 +2039,27 @@
+ mlib-tgt-specific.adb<mlib-tgt-specific-darwin.adb \
+ indepsw.adb<indepsw-darwin.adb"
+ ;;
++ *-*-dragonfly*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
+ *-*-freebsd*)
+ TOOLS_TARGET_PAIRS="\
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+ indepsw.adb<indepsw-gnu.adb"
+ ;;
++ *-*-netbsd*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
++ *-*-openbsd*)
++ TOOLS_TARGET_PAIRS="\
++ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
++ indepsw.adb<indepsw-gnu.adb"
++ ;;
++ # Next line covers arm*-*-linux-androideabi
+ *-*-linux*)
+ TOOLS_TARGET_PAIRS="\
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
diff --git a/lang/gcc5-aux/files/diff-ada-testsuite b/lang/gcc5-aux/files/diff-ada-testsuite
new file mode 100644
index 00000000000..725726e66c8
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-ada-testsuite
@@ -0,0 +1,584 @@
+--- gcc/testsuite/ada/acats/run_acats.orig
++++ gcc/testsuite/ada/acats/run_acats
+@@ -5,20 +5,6 @@
+ exit 1
+ fi
+
+-# Provide which replacement.
+-#
+-# type -p is missing from Solaris 2 /bin/sh and /bin/ksh (ksh88), but both
+-# ksh93 and bash have it.
+-# type output format differs between ksh88 and ksh93, so avoid it if
+-# type -p is present. Unfortunately, HP-UX /bin/sh ignores -p with type.
+-# Fall back to whence which ksh88 and ksh93 provide, but bash does not.
+-
+-which () {
+- path=`type -p $* 2>/dev/null` && { echo $path | awk '{print $NF}'; return 0; }
+- path=`type $* 2>/dev/null` && { echo $path | awk '{print $NF}'; return 0; }
+- path=`whence $* 2>/dev/null` && { echo $path; return 0; }
+- return 1
+-}
+
+ # Set up environment to use the Ada compiler from the object tree
+
+--- gcc/testsuite/ada/acats/run_all.sh.orig
++++ gcc/testsuite/ada/acats/run_all.sh
+@@ -50,6 +50,14 @@
+ echo "$@" >> $dir/acats.log
+ }
+
++inform () {
++ printf "%04d %7s" $1 $2
++}
++
++disinform () {
++ printf "\r"
++}
++
+ dir=`${PWDCMD-pwd}`
+
+ if [ "$testdir" = "" ]; then
+@@ -231,6 +239,18 @@
+ par_countm=0
+ par_last=
+
++countdown=0
++for chapter in $chapters; do
++ if [ -d $dir/tests/$chapter ]; then
++ cd $dir/tests/$chapter
++ ls *.a *.ada *.adt *.am *.dep 2> /dev/null | sed -e 's/\(.*\)\..*/\1/g' | \
++ cut -c1-7 | sort | uniq | comm -23 - $dir/support/norun.lst \
++ > $dir/tests/$chapter/${chapter}.lst
++ countn=`wc -l < $dir/tests/$chapter/${chapter}.lst`
++ countdown=`expr $countdown + $countn`
++ fi
++done
++
+ for chapter in $chapters; do
+ # Used to generate support once and finish after that.
+ [ "$chapter" = "NONE" ] && continue
+@@ -243,10 +263,6 @@
+ continue
+ fi
+
+- cd $dir/tests/$chapter
+- ls *.a *.ada *.adt *.am *.dep 2> /dev/null | sed -e 's/\(.*\)\..*/\1/g' | \
+- cut -c1-7 | sort | uniq | comm -23 - $dir_support/norun.lst \
+- > $dir/tests/$chapter/${chapter}.lst
+ countn=`wc -l < $dir/tests/$chapter/${chapter}.lst`
+ as_fn_arith $glob_countn + $countn
+ glob_countn=$as_val
+@@ -299,10 +315,13 @@
+ if [ $? -eq 0 ]; then
+ extraflags="$extraflags -fstack-check"
+ fi
++ inform $countdown $i
++ countdown=`expr $countdown - 1`
+ test=$dir/tests/$chapter/$i
+ mkdir $test && cd $test >> $dir/acats.log 2>&1
+
+ if [ $? -ne 0 ]; then
++ disinform
+ display "FAIL: $i"
+ failed="${failed}${i} "
+ clean_dir
+@@ -323,8 +342,10 @@
+ cxb30*) EXTERNAL_OBJECTS="$dir_support/cxb30040.o $dir_support/cxb30060.o $dir_support/cxb30130.o $dir_support/cxb30131.o";;
+ ca1020e) rm -f ca1020e_func1.adb ca1020e_func2.adb ca1020e_proc1.adb ca1020e_proc2.adb > /dev/null 2>&1;;
+ ca14028) rm -f ca14028_func2.ads ca14028_func3.ads ca14028_proc1.ads ca14028_proc3.ads > /dev/null 2>&1;;
++ cxh1001) extraflags="-a -f"; echo "pragma Normalize_Scalars;" > gnat.adc
+ esac
+ if [ "$main" = "" ]; then
++ disinform
+ display "FAIL: $i"
+ failed="${failed}${i} "
+ clean_dir
+@@ -333,6 +354,7 @@
+
+ target_gnatmake $extraflags -I$dir_support $main >> $dir/acats.log 2>&1
+ if [ $? -ne 0 ]; then
++ disinform
+ display "FAIL: $i"
+ failed="${failed}${i} "
+ clean_dir
+@@ -347,6 +369,7 @@
+ target_run $dir/tests/$chapter/$i/$binmain > $dir/tests/$chapter/$i/${i}.log 2>&1
+ cd $dir/tests/$chapter/$i
+ cat ${i}.log >> $dir/acats.log
++ disinform
+ egrep -e '(==== |\+\+\+\+ |\!\!\!\! )' ${i}.log > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ grep 'tasking not implemented' ${i}.log > /dev/null 2>&1
+--- /dev/null
++++ gcc/testsuite/ada/acats/run_remote.sh
+@@ -0,0 +1,412 @@
++#!/bin/sh
++# Run ACATS with the GNU Ada compiler
++
++# The following functions are to be customized if you run in cross
++# environment or want to change compilation flags. Note that for
++# tests requiring checks not turned on by default, this script
++# automatically adds the needed flags to pass (ie: -gnato or -gnatE).
++
++# gccflags="-O3 -fomit-frame-pointer -funroll-all-loops -finline-functions"
++# gnatflags="-gnatN"
++
++gccflags="-O2"
++gnatflags="-gnatws"
++tabtarget="/data/local/testsuite"
++STRIP="arm-aux-linux-androideabi-strip"
++
++target_run () {
++ # Run on rooted tablet (port 22 vs port 2222)
++ BN=`basename $*`
++ $STRIP_FOR_TARGET $*
++ /usr/bin/scp -qp $* root@tablet:$tabtarget/
++ /usr/bin/ssh -q tablet $tabtarget/$BN
++}
++
++target_cmd () {
++ /usr/bin/ssh -q tablet "$1"
++}
++
++# End of customization section.
++
++display_noeol () {
++ printf "$@"
++ printf "$@" >> $dir/acats.sum
++ printf "$@" >> $dir/acats.log
++}
++
++display () {
++ echo "$@"
++ echo "$@" >> $dir/acats.sum
++ echo "$@" >> $dir/acats.log
++}
++
++log () {
++ echo "$@" >> $dir/acats.sum
++ echo "$@" >> $dir/acats.log
++}
++
++inform () {
++ printf "%04d %7s" $1 $2
++}
++
++disinform () {
++ printf "\r"
++}
++
++dir=`${PWDCMD-pwd}`
++
++if [ "$testdir" = "" ]; then
++ echo You must use make check or make check-ada
++ exit 1
++fi
++
++if [ "$dir" = "$testdir" ]; then
++ echo "error: srcdir must be different than objdir, exiting."
++ exit 1
++fi
++
++target_gnatmake () {
++ echo gnatmake-cross --GCC=\"$GCC\" $gnatflags $gccflags $* -largs $EXTERNAL_OBJECTS --GCC=\"$GCC\"
++ gnatmake-cross --GCC="$GCC" $gnatflags $gccflags $* -largs $EXTERNAL_OBJECTS --GCC="$GCC"
++}
++
++target_gcc () {
++ $GCC $gccflags $*
++}
++
++clean_dir () {
++ rm -f "$binmain" *.o *.ali > /dev/null 2>&1
++}
++
++find_main () {
++ ls ${i}?.adb > ${i}.lst 2> /dev/null
++ ls ${i}*m.adb >> ${i}.lst 2> /dev/null
++ ls ${i}.adb >> ${i}.lst 2> /dev/null
++ main=`tail -1 ${i}.lst`
++}
++
++split_testid () {
++ local mysplit=`echo $1 | awk -F/ '{print "section=" $1 "; TN=" $2 "; prog=" $3 ";"}'`
++ eval ${mysplit}
++}
++
++EXTERNAL_OBJECTS=""
++# Global variable to communicate external objects to link with.
++
++rm -f $dir/acats.sum $dir/acats.log $dir/transfer.lst
++
++display "Test Run By $USER on `date`"
++
++display " === acats configuration ==="
++
++target=`$GCC -dumpmachine`
++
++display target gcc is $GCC
++display `$GCC -v 2>&1`
++display host=`gcc -dumpmachine`
++display target=$target
++display `type gnatmake-cross`
++gnatls-cross -v >> $dir/acats.log
++display ""
++
++# Let's be tidy and clear off the remote device first
++target_cmd "cd ${tabtarget}; rm logs/*; rmdir logs; rm *"
++
++display " === acats support ==="
++display_noeol "Generating support files..."
++
++rm -rf $dir/support
++mkdir -p $dir/support
++cd $dir/support
++
++cp $testdir/support/*.ada $testdir/support/*.a $testdir/support/*.tst $dir/support
++
++# Find out the size in bit of an address on the target
++target_gnatmake $testdir/support/impbit.adb >> $dir/acats.log 2>&1
++target_run $dir/support/impbit > $dir/support/impbit.out 2>&1
++target_bit=`cat $dir/support/impbit.out`
++echo target_bit="$target_bit" >> $dir/acats.log
++
++# Find out a suitable asm statement
++# Adapted from configure.ac gcc_cv_as_dwarf2_debug_line
++case "$target" in
++ ia64*-*-* | s390*-*-*)
++ target_insn="nop 0"
++ ;;
++ mmix-*-*)
++ target_insn="swym 0"
++ ;;
++ *)
++ target_insn="nop"
++ ;;
++esac
++echo target_insn="$target_insn" >> $dir/acats.log
++
++sed -e "s,ACATS4GNATDIR,$dir,g" \
++ < $testdir/support/impdef.a > $dir/support/impdef.a
++sed -e "s,ACATS4GNATDIR,$dir,g" \
++ -e "s,ACATS4GNATBIT,$target_bit,g" \
++ -e "s,ACATS4GNATINSN,$target_insn,g" \
++ < $testdir/support/macro.dfs > $dir/support/MACRO.DFS
++sed -e "s,ACATS4GNATDIR,$dir,g" \
++ < $testdir/support/tsttests.dat > $dir/support/TSTTESTS.DAT
++
++cp $testdir/tests/cd/*.c $dir/support
++cp $testdir/tests/cxb/*.c $dir/support
++grep -v '^#' $testdir/norun.lst | sort > $dir/support/norun.lst
++
++rm -rf $dir/run
++mv $dir/tests $dir/tests.$$ 2> /dev/null
++rm -rf $dir/tests.$$ &
++mkdir -p $dir/run
++
++cp -pr $testdir/tests $dir/
++
++for i in $dir/support/*.ada $dir/support/*.a; do
++ host_gnatchop $i >> $dir/acats.log 2>&1
++done
++
++# These tools are used to preprocess some ACATS sources
++# they need to be compiled native on the host.
++
++host_gnatmake -q -gnatws macrosub.adb
++if [ $? -ne 0 ]; then
++ display "**** Failed to compile macrosub"
++ exit 1
++fi
++./macrosub > macrosub.out 2>&1
++
++gcc -c cd300051.c
++host_gnatmake -q -gnatws widechr.adb
++if [ $? -ne 0 ]; then
++ display "**** Failed to compile widechr"
++ exit 1
++fi
++./widechr > widechr.out 2>&1
++
++rm -f $dir/support/macrosub
++rm -f $dir/support/widechr
++rm -f $dir/support/*.ali
++rm -f $dir/support/*.o
++
++display " done."
++
++# From here, all compilations will be made by the target compiler
++
++display_noeol "Compiling support files..."
++
++target_gcc -c *.c
++if [ $? -ne 0 ]; then
++ display "**** Failed to compile C code"
++ exit 1
++fi
++
++host_gnatchop *.adt >> $dir/acats.log 2>&1
++
++target_gnatmake -c -gnato -gnatE *.ads >> $dir/acats.log 2>&1
++target_gnatmake -c -gnato -gnatE *.adb >> $dir/acats.log 2>&1
++
++display " done."
++display ""
++display " === acats tests ==="
++
++if [ $# -eq 0 ]; then
++ chapters=`cd $dir/tests; echo [a-z]*`
++else
++ chapters=$*
++fi
++
++glob_countn=0
++glob_countok=0
++glob_countu=0
++countdown=0
++
++for chapter in $chapters; do
++ if [ -d $dir/tests/$chapter ]; then
++ cd $dir/tests/$chapter
++ ls *.a *.ada *.adt *.am *.dep 2> /dev/null | sed -e 's/\(.*\)\..*/\1/g' | \
++ cut -c1-7 | sort | uniq | comm -23 - $dir/support/norun.lst \
++ > $dir/tests/$chapter/${chapter}.lst
++ countn=`wc -l < $dir/tests/$chapter/${chapter}.lst`
++ countdown=`expr $countdown + $countn`
++ fi
++done
++
++cat > $dir/execute.sh << EOF
++inform () {
++ printf "left: %04d" \$1
++}
++disinform () {
++ printf "\r"
++}
++cycle () {
++ local countx=0
++ local total=\$(echo \$testlist | awk '{print NF}')
++ mkdir -p logs
++ echo "Executing \$total tests on remote device"
++ inform \$total
++ for x in \$testlist; do
++ timeout -t 30 ./\${x} > logs/\${x}.log 2>&1
++ countx=\$(expr \$countx + 1)
++ if [ \$countx -eq 25 ]; then
++ total=\$(expr \$total - 25)
++ countx=0
++ disinform
++ inform \$total
++ fi
++ done
++ disinform
++ tar -czf remote.logs.tar.gz logs
++}
++testlist=" \\
++EOF
++
++display "All tests are being cross-compiled without execution first."
++
++for chapter in $chapters; do
++ if [ ! -d $dir/tests/$chapter ]; then
++ continue
++ fi
++
++ countn=`wc -l < $dir/tests/$chapter/${chapter}.lst`
++ glob_countn=`expr $glob_countn + $countn`
++ counti=0
++ for i in `cat $dir/tests/$chapter/${chapter}.lst`; do
++ counti=`expr $counti + 1`
++ extraflags="-gnat95"
++ grep $i $testdir/overflow.lst > /dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ extraflags="$extraflags -gnato"
++ fi
++ grep $i $testdir/elabd.lst > /dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ extraflags="$extraflags -gnatE"
++ fi
++ grep $i $testdir/floatstore.lst > /dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ extraflags="$extraflags -ffloat-store"
++ fi
++ grep $i $testdir/stackcheck.lst > /dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ extraflags="$extraflags -fstack-check"
++ fi
++ inform $countdown $i
++ countdown=`expr $countdown - 1`
++ test=$dir/tests/$chapter/$i
++ mkdir $test && cd $test >> $dir/acats.log 2>&1
++
++ if [ $? -ne 0 ]; then
++ disinform
++ display "FAIL: $i"
++ failed="${failed}${i} "
++ clean_dir
++ continue
++ fi
++
++ host_gnatchop -c -w `ls ${test}*.a ${test}*.ada ${test}*.adt ${test}*.am ${test}*.dep 2> /dev/null` >> $dir/acats.log 2>&1
++ find_main
++ if [ -z "$main" ]; then
++ sync
++ find_main
++ fi
++ binmain=`echo $main | sed -e 's/\(.*\)\..*/\1/g'`
++ echo "BUILD $main" >> $dir/acats.log
++ EXTERNAL_OBJECTS=""
++ case $i in
++ cxb30*) EXTERNAL_OBJECTS="$dir/support/cxb30040.o $dir/support/cxb30060.o $dir/support/cxb30130.o $dir/support/cxb30131.o";;
++ ca1020e) rm -f ca1020e_func1.adb ca1020e_func2.adb ca1020e_proc1.adb ca1020e_proc2.adb > /dev/null 2>&1;;
++ ca14028) rm -f ca14028_func2.ads ca14028_func3.ads ca14028_proc1.ads ca14028_proc3.ads > /dev/null 2>&1;;
++ cxh1001) extraflags="-a -f"; echo "pragma Normalize_Scalars;" > gnat.adc
++ esac
++ if [ "$main" = "" ]; then
++ disinform
++ display "FAIL: $i"
++ failed="${failed}${i} "
++ clean_dir
++ continue
++ fi
++
++ target_gnatmake $extraflags -I$dir/support $main >> $dir/acats.log 2>&1
++ if [ $? -ne 0 ]; then
++ disinform
++ display "FAIL: $i"
++ failed="${failed}${i} "
++ clean_dir
++ continue
++ fi
++ echo $chapter/$i/$binmain >> $dir/transfer.lst
++ echo "$binmain \\" >> $dir/execute.sh
++ $STRIP $binmain
++ disinform
++ done
++done
++echo '"' >> $dir/execute.sh
++echo "cycle" >> $dir/execute.sh
++
++sync
++display "Transfer files to remote device: root@tablet:$tabtarget/"
++cd $dir/tests
++cat $dir/transfer.lst | xargs tar --strip-components=2 -czf - | \
++ target_cmd "tar -C $tabtarget -xzf -"
++cd $dir
++tar -czf - execute.sh | target_cmd "tar -C $tabtarget -xzf -"
++target_cmd "cd $tabtarget; sh execute.sh"
++rm -rf $dir/logs $dir/remote.logs.tar.gz
++/usr/bin/scp -q root@tablet:$tabtarget/remote.logs.tar.gz $dir/
++tar -xzf $dir/remote.logs.tar.gz
++
++countdown=`wc -l < $dir/transfer.lst`
++glob_countn=${countdown}
++for i in `cat $dir/transfer.lst`; do
++ split_testid $i
++ if [ "$section" != "$savedsect" ]; then
++ display Running chapter $section ...
++ fi
++ savedsect=$section
++
++ #inform $countdown $TN
++ countdown=`expr $countdown - 1`
++ proglog="$dir/logs/${prog}.log"
++ echo "RUN $prog" >> $dir/acats.log
++ if [ ! -f $proglog ]; then
++ echo "LOG NOT FOUND!" >> $proglog
++ fi
++
++ cat $proglog >> $dir/acats.log
++
++ egrep -e '(==== |\+\+\+\+ |\!\!\!\! )' $proglog > /dev/null 2>&1
++ if [ $? -ne 0 ]; then
++ grep 'tasking not implemented' $proglog > /dev/null 2>&1
++
++ if [ $? -ne 0 ]; then
++ display "FAIL: ${TN}"
++ failed="${failed}${TN} "
++ else
++ log "UNSUPPORTED: ${TN}"
++ glob_countn=`expr $glob_countn - 1`
++ glob_countu=`expr $glob_countu + 1`
++ fi
++ else
++ log "PASS: ${TN}"
++ glob_countok=`expr $glob_countok + 1`
++ fi
++ cd $dir/tests/$section/$TN
++ clean_dir
++ #disinform
++done
++
++display " === acats Summary ==="
++display "# of expected passes $glob_countok"
++display "# of unexpected failures `expr $glob_countn - $glob_countok`"
++
++if [ $glob_countu -ne 0 ]; then
++ display "# of unsupported tests $glob_countu"
++fi
++
++if [ $glob_countok -ne $glob_countn ]; then
++ display "*** FAILURES: $failed"
++fi
++
++display "$0 completed at `date`"
++
++exit 0
+--- gcc/testsuite/gnat.dg/test_raise_from_pure.adb.orig
++++ gcc/testsuite/gnat.dg/test_raise_from_pure.adb
+@@ -1,4 +1,4 @@
+--- { dg-do run }
++-- { dg-do run { xfail *-*-openbsd* } }
+ -- { dg-options "-O2" }
+
+ -- This is an optimization test and its failure is only a missed optimization.
+--- gcc/testsuite/gnat.dg/unchecked_convert5.adb.orig
++++ gcc/testsuite/gnat.dg/unchecked_convert5.adb
+@@ -1,22 +0,0 @@
+--- { dg-do run { target hppa*-*-* sparc*-*-* powerpc*-*-* } }
+-
+-with Unchecked_Conversion;
+-
+-procedure Unchecked_Convert5 is
+-
+- subtype c_1 is string(1..1);
+-
+- function int2c1 is -- { dg-warning "different sizes" }
+- new unchecked_conversion (source => integer, target => c_1);
+-
+- c1 : c_1;
+-
+-begin
+-
+- c1 := int2c1(16#12#);
+-
+- if c1 (1) /= ASCII.Nul then
+- raise Program_Error;
+- end if;
+-
+-end;
+--- gcc/testsuite/gnat.dg/unchecked_convert6.adb.orig
++++ gcc/testsuite/gnat.dg/unchecked_convert6.adb
+@@ -1,22 +0,0 @@
+--- { dg-do run { target hppa*-*-* sparc*-*-* powerpc*-*-* } }
+-
+-with Unchecked_Conversion;
+-
+-procedure Unchecked_Convert6 is
+-
+- subtype c_5 is string(1..5);
+-
+- function int2c5 is -- { dg-warning "different sizes" }
+- new unchecked_conversion (source => integer, target => c_5);
+-
+- c5 : c_5;
+-
+-begin
+-
+- c5 := int2c5(16#12#);
+-
+- if c5 (4) /= ASCII.DC2 then
+- raise Program_Error;
+- end if;
+-
+-end;
diff --git a/lang/gcc5-aux/files/diff-core b/lang/gcc5-aux/files/diff-core
new file mode 100644
index 00000000000..c192081f502
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-core
@@ -0,0 +1,622 @@
+--- gcc/config/dragonfly.h.orig
++++ gcc/config/dragonfly.h
+@@ -84,7 +84,7 @@
+ } \
+ %{static:-Bstatic} \
+ } \
+- %{!static:--hash-style=gnu} \
++ %{!static:--hash-style=gnu -rpath @PREFIX@/@GCCAUX@/lib} \
+ %{symbolic:-Bsymbolic}"
+
+ #undef LINK_SPEC
+--- gcc/config/i386/freebsd.h.orig
++++ gcc/config/i386/freebsd.h
+@@ -90,6 +90,14 @@
+ When the -shared link option is used a final link is not being
+ done. */
+
++#if FBSD_MAJOR < 9
++#define ELF_HASH_STYLE ""
++#elif FBSD_MAJOR < 10
++#define ELF_HASH_STYLE "--hash-style=both "
++#else
++#define ELF_HASH_STYLE "--hash-style=gnu "
++#endif
++
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+ %{p:%nconsider using '-pg' instead of '-p' with gprof(1)} \
+@@ -101,6 +109,7 @@
+ %{rdynamic:-export-dynamic} \
+ -dynamic-linker %(fbsd_dynamic_linker) } \
+ %{static:-Bstatic}} \
++ %{!static:" ELF_HASH_STYLE "-rpath @PREFIX@/@GCCAUX@/lib} \
+ %{symbolic:-Bsymbolic}"
+
+ /* A C statement to output to the stdio stream FILE an assembler
+--- gcc/config/i386/freebsd64.h.orig
++++ gcc/config/i386/freebsd64.h
+@@ -41,4 +41,5 @@
+ %{rdynamic:-export-dynamic} \
+ -dynamic-linker %(fbsd_dynamic_linker) } \
+ %{static:-Bstatic}} \
++ %{!static:" ELF_HASH_STYLE "-rpath @PREFIX@/@GCCAUX@/lib} \
+ %{symbolic:-Bsymbolic}"
+--- /dev/null
++++ libgcc/config/i386/freebsd-unwind.h
+@@ -0,0 +1,173 @@
++/* DWARF2 EH unwinding support for FreeBSD: AMD x86-64 and x86.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ Contributed by John Marino <gnugcc@marino.st>
++
++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/>. */
++
++/* 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 <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_freebsd_fallback_frame_state
++
++static _Unwind_Reason_Code
++x86_64_freebsd_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ struct sigframe *sf;
++ long new_cfa;
++
++ /* Prior to FreeBSD 9, the signal trampoline was located immediately
++ before the ps_strings. To support non-executable stacks on AMD64,
++ the sigtramp was moved to a shared page for FreeBSD 9. Unfortunately
++ this means looking frame patterns again (sys/amd64/amd64/sigtramp.S)
++ rather than using the robust and convenient KERN_PS_STRINGS trick.
++
++ <pc + 00>: lea 0x10(%rsp),%rdi
++ <pc + 05>: pushq $0x0
++ <pc + 17>: mov $0x1a1,%rax
++ <pc + 14>: syscall
++
++ If we can't find this pattern, we're at the end of the stack.
++ */
++
++ if (!( *(unsigned int *)(context->ra) == 0x247c8d48
++ && *(unsigned int *)(context->ra + 4) == 0x48006a10
++ && *(unsigned int *)(context->ra + 8) == 0x01a1c0c7
++ && *(unsigned int *)(context->ra + 12) == 0x050f0000 ))
++ 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_freebsd_fallback_frame_state
++
++/*
++ * We can't use KERN_PS_STRINGS anymore if we want to support FreeBSD32
++ * compat on AMD64. The sigtramp is in a shared page in that case so the
++ * x86_sigtramp_range only works on a true i386 system. We have to
++ * search for the sigtramp frame if we want it working everywhere.
++ */
++
++static _Unwind_Reason_Code
++x86_freebsd_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ struct sigframe *sf;
++ long new_cfa;
++
++/*
++ * i386 sigtramp frame we are looking for follows.
++ * Apparently PSL_VM is variable, so we can't look past context->ra + 4
++ * <sigcode>:
++ * 0: ff 54 24 10 call *0x10(%esp) *SIGF_HANDLER
++ * 4: 8d 44 24 20 lea 0x20(%esp),%eax SIGF_UC
++ * 8: 50 push %eax
++ * 9: f7 40 54 00 00 02 00 testl $0x20000,0x54(%eax) $PSL_VM
++ * 10: 75 03 jne 15 <sigcode+0x15>
++ * 12: 8e 68 14 mov 0x14(%eax),%gs UC_GS
++ * 15: b8 a1 01 00 00 mov 0x1a1,%eax $SYS_sigreturn
++ */
++
++ if (!( *(unsigned int *)(context->ra - 4) == 0x102454ff
++ && *(unsigned int *)(context->ra) == 0x2024448d ))
++ 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__ */
+--- /dev/null
++++ libgcc/config/i386/netbsd-unwind.h
+@@ -0,0 +1,178 @@
++/* DWARF2 EH unwinding support for NetBSD: AMD x86-64 and x86.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ Contributed by John Marino <gnugcc@marino.st>
++
++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/>. */
++
++/* Do code reading to identify a signal frame, and set the frame
++ state data appropriately. See unwind-dw2.c for the structs. */
++
++#include <sys/ucontext.h>
++#include <machine/frame.h>
++
++#define REG_NAME(reg) sf_uc.uc_mcontext.__gregs[_REG_## reg]
++
++#ifdef __x86_64__
++
++#define MD_FALLBACK_FRAME_STATE_FOR x86_64_netbsd_fallback_frame_state
++
++static _Unwind_Reason_Code
++x86_64_netbsd_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ /* signal_frame is sigframe_siginfo minus sf_ra handler return address */
++ struct signal_frame {
++ siginfo_t sf_si; /* actual saved siginfo */
++ ucontext_t sf_uc; /* actual saved ucontext */
++ };
++ struct signal_frame *sf;
++ long new_cfa;
++
++ /* We are looking for the following signal trampoline pattern. If we don't
++ find it, we are at the end of the stack and can't unwind.
++
++ <__sigtramp_siginfo_2+12>: mov $0xffffffffffffffff,%rdi
++ <__sigtramp_siginfo_2+19>: mov $0x1,%rax
++ <__sigtramp_siginfo_2+26>: syscall
++ */
++
++ if ( *(unsigned int *) (context->ra + 12) == 0xffc7c748
++ && *(unsigned int *) (context->ra + 16) == 0x48ffffff
++ && *(unsigned int *) (context->ra + 20) == 0x0001c0c7
++ && *(unsigned int *) (context->ra + 24) == 0x050f0000 )
++ {
++ sf = (struct signal_frame *) context->cfa;
++ new_cfa = sf->REG_NAME(RSP);
++ fs->regs.cfa_how = CFA_REG_OFFSET;
++ fs->regs.cfa_reg = 7;
++ fs->regs.cfa_offset = new_cfa - (long) context->cfa;
++ }
++ else
++ {
++ return _URC_END_OF_STACK;
++ }
++
++ /* 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_netbsd_fallback_frame_state
++
++static _Unwind_Reason_Code
++x86_netbsd_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ /* signal_frame is sigframe_siginfo minus sf_ra handler return address */
++ struct signal_frame {
++ int sf_signum; /* "signum" argument for handler" */
++ siginfo_t *sf_sip; /* "sip" argument for handler" */
++ ucontext_t *sf_ucp; /* "ucp" argument for handler" */
++ siginfo_t sf_si; /* actual saved siginfo */
++ ucontext_t sf_uc; /* actual saved ucontext */
++ };
++ struct signal_frame *sf;
++ long new_cfa;
++
++ /* We are looking for the following signal trampoline pattern. If we don't
++ find it, we are at the end of the stack and can't unwind.
++
++ <__sigtramp_siginfo_2+18>: movl $0xffffffff,0x4(%esp)
++ <__sigtramp_siginfo_2+26>: mov $0x1,%eax
++ <__sigtramp_siginfo_2+31>: int $0x80
++ */
++
++ if ( *(unsigned int *) (context->ra + 18) == 0x042444c7
++ && *(unsigned int *) (context->ra + 22) == 0xffffffff
++ && *(unsigned char *) (context->ra + 26) == 0xb8
++ && *(unsigned int *) (context->ra + 27) == 0x00000001
++ && *(unsigned short *) (context->ra + 31) == 0x80cd )
++ {
++ sf = (struct signal_frame *) 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;
++ }
++ else
++ {
++ return _URC_END_OF_STACK;
++ }
++
++ /* 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__ */
+--- libiberty/getpagesize.c.orig
++++ libiberty/getpagesize.c
+@@ -20,6 +20,7 @@
+
+ */
+
++#ifndef __ANDROID__
+ #ifndef VMS
+
+ #include "config.h"
+@@ -88,3 +89,4 @@
+ }
+
+ #endif /* VMS */
++#endif /* __ANDROID__ */
+--- libiberty/setproctitle.c.orig
++++ libiberty/setproctitle.c
+@@ -40,9 +40,11 @@
+ void
+ setproctitle (const char *name ATTRIBUTE_UNUSED, ...)
+ {
++#ifndef __ANDROID__
+ #ifdef PR_SET_NAME
+ /* On GNU/Linux this sets the top visible "comm", but not
+ necessarily the name visible in ps. */
+ prctl (PR_SET_NAME, name);
+ #endif
++#endif
+ }
+--- gcc/config.gcc.orig
++++ gcc/config.gcc
+@@ -1393,12 +1393,16 @@
+ 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*)
+- tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/netbsd-elf.h"
++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/netbsd-elf.h freebsd-stdint.h"
+ extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
++ tmake_file="${tmake_file} i386/t-crtstuff"
++ use_gcc_stdint=wrap
+ ;;
+ x86_64-*-netbsd*)
+- tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/x86-64.h i386/netbsd64.h"
++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/x86-64.h i386/netbsd64.h freebsd-stdint.h"
+ extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
++ tmake_file="${tmake_file} i386/t-crtstuff"
++ use_gcc_stdint=wrap
+ ;;
+ 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"
+--- gcc/configure.orig
++++ gcc/configure
+@@ -27806,6 +27806,13 @@
+ gcc_cv_target_dl_iterate_phdr=no
+ fi
+ ;;
++ *-*-netbsd*)
++ 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
+--- gcc/config/i386/netbsd-elf.h.orig
++++ gcc/config/i386/netbsd-elf.h
+@@ -38,7 +38,8 @@
+ /* Provide a LINK_SPEC appropriate for a NetBSD/i386 ELF target. */
+
+ #undef LINK_SPEC
+-#define LINK_SPEC NETBSD_LINK_SPEC_ELF
++#define LINK_SPEC NETBSD_LINK_SPEC_ELF \
++"%{!static:-rpath @PREFIX@/gcc-aux/lib}"
+
+ #define NETBSD_ENTRY_POINT "__start"
+
+@@ -121,3 +122,10 @@
+ #define HAVE_ENABLE_EXECUTE_STACK
+
+ #define IX86_MAYBE_NO_LIBGCC_TFMODE
++
++/* Define this to be nonzero if static stack checking is supported. */
++#define STACK_CHECK_STATIC_BUILTIN 1
++
++#if defined(HAVE_LD_EH_FRAME_HDR)
++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
++#endif
+--- gcc/config/i386/netbsd64.h.orig
++++ gcc/config/i386/netbsd64.h
+@@ -69,3 +69,10 @@
+ #define HAVE_ENABLE_EXECUTE_STACK
+
+ #define IX86_MAYBE_NO_LIBGCC_TFMODE
++
++/* Define this to be nonzero if static stack checking is supported. */
++#define STACK_CHECK_STATIC_BUILTIN 1
++
++#if defined(HAVE_LD_EH_FRAME_HDR)
++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
++#endif
+--- libgcc/crtstuff.c.orig
++++ libgcc/crtstuff.c
+@@ -81,7 +81,7 @@
+ #endif
+
+ #if defined(TARGET_DL_ITERATE_PHDR) && \
+- (defined(__DragonFly__) || defined(__FreeBSD__))
++ (defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__))
+ #define BSD_DL_ITERATE_PHDR_AVAILABLE
+ #endif
+
+--- libgcc/unwind-dw2-fde-dip.c.orig
++++ libgcc/unwind-dw2-fde-dip.c
+@@ -65,6 +65,12 @@
+ #endif
+
+ #if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \
++ && defined(TARGET_DL_ITERATE_PHDR) && defined(__NetBSD__)
++# define ElfW(type) Elf_##type
++# define USE_PT_GNU_EH_FRAME
++#endif
++
++#if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \
+ && defined(__OpenBSD__)
+ # define ElfW(type) Elf_##type
+ # define USE_PT_GNU_EH_FRAME
+--- gcc/Makefile.in.orig
++++ gcc/Makefile.in
+@@ -1156,7 +1156,6 @@
+ insn-emit.o \
+ insn-extract.o \
+ insn-latencytab.o \
+- insn-modes.o \
+ insn-opinit.o \
+ insn-output.o \
+ insn-peep.o \
+@@ -1511,6 +1510,7 @@
+ $(OBJS-libcommon-target) @TREEBROWSER@ main.o c-family/cppspec.o \
+ $(COLLECT2_OBJS) $(EXTRA_GCC_OBJS) $(GCOV_OBJS) $(GCOV_DUMP_OBJS) \
+ $(GCOV_TOOL_OBJS) $(GENGTYPE_OBJS) gcc-ar.o gcc-nm.o gcc-ranlib.o \
++ insn-modes.o insn-modes-ada.o \
+ lto-wrapper.o collect-utils.o
+
+ # This lists all host object files, whether they are included in this
+@@ -1518,6 +1518,11 @@
+ ALL_HOST_OBJS = $(ALL_HOST_FRONTEND_OBJS) $(ALL_HOST_BACKEND_OBJS)
+
+ BACKEND = libbackend.a main.o @TREEBROWSER@ libcommon-target.a libcommon.a \
++ insn-modes.o \
++ $(CPPLIB) $(LIBDECNUMBER)
++
++BACKEND2 = libbackend.a main.o @TREEBROWSER@ libcommon-target.a libcommon.a \
++ insn-modes-ada.o \
+ $(CPPLIB) $(LIBDECNUMBER)
+
+ # This is defined to "yes" if Tree checking is enabled, which roughly means
+@@ -2164,6 +2169,7 @@
+
+ insn-modes.c: s-modes; @true
+ insn-modes.h: s-modes-h; @true
++insn-modes-ada.c: s-modes-ada; @true
+ min-insn-modes.c: s-modes-m; @true
+
+ s-modes: build/genmodes$(build_exeext)
+@@ -2181,6 +2187,12 @@
+ $(SHELL) $(srcdir)/../move-if-change tmp-min-modes.c min-insn-modes.c
+ $(STAMP) s-modes-m
+
++s-modes-ada: s-modes
++ $(shell sed -e 's/: TARGET_96_ROUND_53_LONG_DOUBLE \? &ieee_extended_intel_96_round_53_format //' \
++ < insn-modes.c > tmp-modes-ada.c)
++ $(SHELL) $(srcdir)/../move-if-change tmp-modes-ada.c insn-modes-ada.c
++ $(STAMP) s-modes-ada
++
+ insn-preds.c: s-preds; @true
+ tm-preds.h: s-preds-h; @true
+ tm-constrs.h: s-constrs-h; @true
+@@ -3326,6 +3338,9 @@
+ ( cd $(DESTDIR)$(bindir) && \
+ $(LN) $(GCC_INSTALL_NAME)$(exeext) $(FULL_DRIVER_NAME) ); \
+ fi; \
++ if [ -f gnat1$(exeext) ] ; then \
++ ( cd $(DESTDIR)$(bindir) && $(LN) $(GCC_INSTALL_NAME)$(exeext) ada$(exeext) ) \
++ fi; \
+ if [ ! -f gcc-cross$(exeext) ] \
+ && [ "$(GCC_INSTALL_NAME)" != "$(GCC_TARGET_INSTALL_NAME)" ]; then \
+ rm -f $(DESTDIR)$(bindir)/$(target_noncanonical)-gcc-tmp$(exeext); \
+--- libgcc/config.host.orig
++++ libgcc/config.host
+@@ -240,7 +240,8 @@
+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ ;;
+ *-*-netbsd*)
+- tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver"
++ 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"
+ # NetBSD 1.7 and later are set up to use GCC's crtstuff for
+ # ELF configurations. We will clear extra_parts in the
+ # a.out configurations.
+@@ -567,14 +568,19 @@
+ ;;
+ i[34567]86-*-freebsd*)
+ tmake_file="${tmake_file} i386/t-freebsd i386/t-crtstuff"
++ md_unwind_header=i386/freebsd-unwind.h
+ ;;
+ x86_64-*-freebsd*)
+ tmake_file="${tmake_file} i386/t-freebsd i386/t-crtstuff"
++ md_unwind_header=i386/freebsd-unwind.h
+ ;;
+ i[34567]86-*-netbsdelf*)
++ tmake_file="${tmake_file} i386/t-crtstuff"
++ md_unwind_header=i386/netbsd-unwind.h
+ ;;
+ x86_64-*-netbsd*)
+ tmake_file="${tmake_file} i386/t-crtstuff"
++ md_unwind_header=i386/netbsd-unwind.h
+ ;;
+ i[34567]86-*-openbsd2.*|i[34567]86-*openbsd3.[0123])
+ ;;
diff --git a/lang/gcc5-aux/files/diff-cxx b/lang/gcc5-aux/files/diff-cxx
new file mode 100644
index 00000000000..182ef7e811b
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-cxx
@@ -0,0 +1,112 @@
+--- libstdc++-v3/config/os/bsd/netbsd/ctype_base.h.orig
++++ libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
+@@ -43,9 +43,22 @@
+
+ // 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 char mask;
+
+-#ifndef _CTYPE_U
++#if defined(_CTYPE_BL)
++ typedef unsigned short mask;
++ static const mask upper = _CTYPE_U;
++ static const mask lower = _CTYPE_L;
++ static const mask alpha = _CTYPE_A;
++ static const mask digit = _CTYPE_D;
++ static const mask xdigit = _CTYPE_X;
++ static const mask space = _CTYPE_S;
++ static const mask print = _CTYPE_R;
++ static const mask graph = _CTYPE_G;
++ static const mask cntrl = _CTYPE_C;
++ static const mask punct = _CTYPE_P;
++ static const mask alnum = _CTYPE_A | _CTYPE_D;
++#elif !defined(_CTYPE_U)
++ typedef unsigned char mask;
+ static const mask upper = _U;
+ static const mask lower = _L;
+ static const mask alpha = _U | _L;
+@@ -58,6 +71,7 @@
+ static const mask punct = _P;
+ static const mask alnum = _U | _L | _N;
+ #else
++ typedef unsigned char mask;
+ static const mask upper = _CTYPE_U;
+ static const mask lower = _CTYPE_L;
+ static const mask alpha = _CTYPE_U | _CTYPE_L;
+--- libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc.orig
++++ libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
+@@ -38,11 +38,17 @@
+
+ // Information as gleaned from /usr/include/ctype.h
+
++#ifndef _CTYPE_BL
+ extern "C" const u_int8_t _C_ctype_[];
++#endif
+
+ const ctype_base::mask*
+ ctype<char>::classic_table() throw()
++#ifdef _CTYPE_BL
++ { return _C_ctype_tab_ + 1; }
++#else
+ { return _C_ctype_ + 1; }
++#endif
+
+ ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
+ size_t __refs)
+@@ -69,14 +75,14 @@
+
+ char
+ ctype<char>::do_toupper(char __c) const
+- { return ::toupper((int) __c); }
++ { return ::toupper((int)(unsigned char) __c); }
+
+ const char*
+ ctype<char>::do_toupper(char* __low, const char* __high) const
+ {
+ while (__low < __high)
+ {
+- *__low = ::toupper((int) *__low);
++ *__low = ::toupper((int)(unsigned char) *__low);
+ ++__low;
+ }
+ return __high;
+@@ -84,14 +90,14 @@
+
+ char
+ ctype<char>::do_tolower(char __c) const
+- { return ::tolower((int) __c); }
++ { return ::tolower((int)(unsigned char) __c); }
+
+ const char*
+ ctype<char>::do_tolower(char* __low, const char* __high) const
+ {
+ while (__low < __high)
+ {
+- *__low = ::tolower((int) *__low);
++ *__low = ::tolower((int)(unsigned char) *__low);
+ ++__low;
+ }
+ return __high;
+--- libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h.orig
++++ libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h
+@@ -48,7 +48,7 @@
+ is(const char* __low, const char* __high, mask* __vec) const
+ {
+ while (__low < __high)
+- *__vec++ = _M_table[*__low++];
++ *__vec++ = _M_table[(unsigned char)*__low++];
+ return __high;
+ }
+
+--- libstdc++-v3/configure.host.orig
++++ libstdc++-v3/configure.host
+@@ -268,6 +268,9 @@
+ dragonfly*)
+ os_include_dir="os/bsd/dragonfly"
+ ;;
++ linux-androideabi)
++ os_include_dir="os/bionic"
++ ;;
+ freebsd*)
+ os_include_dir="os/bsd/freebsd"
+ ;;
diff --git a/lang/gcc5-aux/files/diff-cxx-testsuite b/lang/gcc5-aux/files/diff-cxx-testsuite
new file mode 100644
index 00000000000..4f7388a9a66
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-cxx-testsuite
@@ -0,0 +1,24 @@
+--- libstdc++-v3/testsuite/lib/libstdc++.exp.orig
++++ libstdc++-v3/testsuite/lib/libstdc++.exp
+@@ -898,17 +898,18 @@
+ set f [open $src "w"]
+ puts $f "#include <locale>"
+ puts $f "#include <cstdio>"
+- puts $f "using namespace std;"
++ puts $f "using namespace std;"
+ puts $f "int main (int argc, char** argv)"
+ puts $f "{"
++ puts $f " const char* mlx = *(argv + 1);"
+ puts $f " try"
+ puts $f " {"
+- puts $f " locale(*(argv + 1));"
++ puts $f " locale((char*)(mlx));"
+ puts $f " return 0;"
+ puts $f " }"
+ puts $f " catch(...)"
+ puts $f " {"
+- puts $f " printf(\"locale '%s' not supported\\n\", *(argv + 1));"
++ puts $f " printf(\"locale '%s' not supported\\n\", mlx);"
+ puts $f " return 1;"
+ puts $f " }"
+ puts $f "}"
diff --git a/lang/gcc5-aux/files/diff-fortran b/lang/gcc5-aux/files/diff-fortran
new file mode 100644
index 00000000000..269950890e9
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-fortran
@@ -0,0 +1,42 @@
+--- libgfortran/acinclude.m4.orig
++++ libgfortran/acinclude.m4
+@@ -100,7 +100,7 @@
+ [Define to 1 if the target supports #pragma weak])
+ fi
+ case "$host" in
+- *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* )
++ *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | *-*-netbsd* )
+ AC_DEFINE(GTHREAD_USE_WEAK, 0,
+ [Define to 0 if the target shouldn't use #pragma weak])
+ ;;
+--- libgfortran/configure.orig
++++ libgfortran/configure
+@@ -26447,7 +26447,7 @@
+
+ fi
+ case "$host" in
+- *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* )
++ *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | *-*-netbsd* )
+
+ $as_echo "#define GTHREAD_USE_WEAK 0" >>confdefs.h
+
+--- gcc/fortran/f95-lang.c.orig
++++ gcc/fortran/f95-lang.c
+@@ -776,10 +776,17 @@
+
+ gfc_define_builtin ("__builtin_cabsl", func_clongdouble_longdouble,
+ BUILT_IN_CABSL, "cabsl", ATTR_CONST_NOTHROW_LEAF_LIST);
++#if defined(__NetBSD__)
++ gfc_define_builtin ("__builtin_cabs", func_cdouble_double,
++ BUILT_IN_CABS, "__c99_cabs", ATTR_CONST_NOTHROW_LEAF_LIST);
++ gfc_define_builtin ("__builtin_cabsf", func_cfloat_float,
++ BUILT_IN_CABSF, "__c99_cabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
++#else
+ gfc_define_builtin ("__builtin_cabs", func_cdouble_double,
+ BUILT_IN_CABS, "cabs", ATTR_CONST_NOTHROW_LEAF_LIST);
+ gfc_define_builtin ("__builtin_cabsf", func_cfloat_float,
+ BUILT_IN_CABSF, "cabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
++#endif
+
+ gfc_define_builtin ("__builtin_copysignl", mfunc_longdouble[1],
+ BUILT_IN_COPYSIGNL, "copysignl",
diff --git a/lang/gcc5-aux/files/diff-gcc-testsuite b/lang/gcc5-aux/files/diff-gcc-testsuite
new file mode 100644
index 00000000000..a9a330ecf55
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-gcc-testsuite
@@ -0,0 +1,46 @@
+--- gcc/testsuite/gcc.dg/format/ext-1.c.orig
++++ gcc/testsuite/gcc.dg/format/ext-1.c
+@@ -8,7 +8,7 @@
+ #include "format.h"
+
+ void
+-foo (quad_t q, u_quad_t uq, quad_t *qn, size_t z, size_t *zn, long long int ll,
++foo (quad2_t q, u_quad2_t uq, quad2_t *qn, size_t z, size_t *zn, long long int ll,
+ unsigned long long int ull, int i, unsigned int u, double d,
+ char *s, void *p, wchar_t *ls, wint_t lc, int *n, long int l)
+ {
+--- gcc/testsuite/gcc.dg/format/ext-2.c.orig
++++ gcc/testsuite/gcc.dg/format/ext-2.c
+@@ -8,7 +8,7 @@
+ #include "format.h"
+
+ void
+-foo (quad_t *qp, u_quad_t *uqp, quad_t *qn, long long int *llp,
++foo (quad2_t *qp, u_quad2_t *uqp, quad2_t *qn, long long int *llp,
+ unsigned long long int *ullp, float *fp, char *s, void **pp, wchar_t *ls,
+ int *ip, unsigned int *up)
+ {
+--- gcc/testsuite/gcc.dg/format/format.h.orig
++++ gcc/testsuite/gcc.dg/format/format.h
+@@ -71,8 +71,8 @@
+ #endif
+
+ /* %q formats want a "quad"; GCC considers this to be a long long. */
+-typedef llong quad_t;
+-typedef ullong u_quad_t;
++typedef llong quad2_t;
++typedef ullong u_quad2_t;
+
+ __extension__ typedef __INTMAX_TYPE__ intmax_t;
+ __extension__ typedef __UINTMAX_TYPE__ uintmax_t;
+--- gcc/testsuite/gcc.dg/pch/pch.exp.orig
++++ gcc/testsuite/gcc.dg/pch/pch.exp
+@@ -44,6 +44,8 @@
+ set test "largefile.c"
+ set testh "largefile.hs"
+ set f [open $test w]
++puts $f "/* { dg-do run { target *-*-solaris* } } */"
++puts $f "/* { dg-error \"dummy\" \"fool dejagnu\" { target { ! *-*-solaris* } 20 } } */"
+ puts $f "/* { dg-timeout-factor 4.0 } */"
+ set v 0
+ for { set v 0 } { $v < 10000 } { incr v } {
diff --git a/lang/gcc5-aux/options.mk b/lang/gcc5-aux/options.mk
new file mode 100644
index 00000000000..837f43a1fed
--- /dev/null
+++ b/lang/gcc5-aux/options.mk
@@ -0,0 +1,125 @@
+# $NetBSD: options.mk,v 1.1 2015/06/15 09:46:27 marino Exp $
+
+PKG_OPTIONS_VAR= PKG_OPTIONS.gcc5-aux
+PKG_SUPPORTED_OPTIONS= fortran objc testsuite static bootstrap
+PKG_SUGGESTED_OPTIONS= fortran objc
+
+# disable nls for now (build error involving iconv)
+
+.include "../../mk/bsd.options.mk"
+
+
+# Bootstrap is essentially a maintainer option and it will ignore
+# all other options because it is intent on building a bootstrap compiler.
+
+
+#############################
+## ADD LANGUAGE: Fortran ##
+#############################
+
+.if empty(PKG_OPTIONS:Mfortran) || !empty(PKG_OPTIONS:Mbootstrap)
+EXTRA_CONFARGS+= --disable-libquadmath
+.else
+LANGS+= fortran
+APPLY_DIFFS+= fortran
+.if ${OPSYS} == NetBSD
+EXTRA_CONFARGS+= --disable-libquadmath
+.else
+EXTRA_CONFARGS+= --enable-libquadmath
+.endif
+.endif
+
+
+#################################
+## ADD LANGUAGE: Objective-C ##
+#################################
+
+.if !empty(PKG_OPTIONS:Mobjc) && empty(PKG_OPTIONS:Mbootstrap)
+LANGS+= objc
+.endif
+
+
+#########################
+## TESTSUITE SUPPORT ##
+#########################
+
+.if !empty(PKG_OPTIONS:Mtestsuite) && empty(PKG_OPTIONS:Mbootstrap)
+BUILD_DEPENDS+= dejagnu>=1.4:../../devel/dejagnu
+APPLY_DIFFS+= ada-testsuite
+APPLY_DIFFS+= cxx-testsuite
+APPLY_DIFFS+= gcc-testsuite
+.endif
+
+
+#################################
+## NATIONAL LANGUAGE SUPPORT ##
+#################################
+
+.if !empty(PKG_OPTIONS:Mnls) && empty(PKG_OPTIONS:Mbootstrap)
+USE_BUILTIN.iconv= no
+USE_TOOLS+= msgfmt
+EXTRA_CONFARGS+= --enable-nls
+EXTRA_CONFARGS+= --with-libiconv-prefix=${BUILDLINK_PREFIX.iconv}
+MY_MAKE_ENV+= ICONVPREFIX=${BUILDLINK_PREFIX.iconv}
+.include "../../converters/libiconv/buildlink3.mk"
+.include "../../devel/gettext-lib/buildlink3.mk"
+.else
+EXTRA_CONFARGS+= --disable-nls
+.endif
+
+
+###############################
+## STATICALLY BUILT OPTION ##
+###############################
+
+.if !empty(PKG_OPTIONS:Mstatic)
+STATIC_BUILD = yes
+.endif
+
+.if defined(STATIC_BUILD) && empty(PKG_OPTIONS:Mbootstrap)
+. if ${OPSYS} == SunOS
+PKG_FAIL_REASON+= SunOS does not support static builds
+. else
+EXTRA_CONFARGS+= --with-stage1-ldflags=-static
+. endif
+.endif
+
+
+#################################
+## BOOTSTRAP COMPILER OPTION ##
+#################################
+
+# Solaris does not support static linking system libraries, so bootstraps
+# on SunOS require gmp&co to be built with gcc. Also, OpenBSD x86-64
+# fails configuration during the linking of -lmpc -lmpfr -lgmp in a contest;
+# it complains of missing references in libm. These libraries are built by
+# a different compiler (the base) so perhaps that's the problem. Building
+# gmp&co in the tree allows the configure step to succeed on OpenBSD.
+
+.if ${OPSYS} == OpenBSD || ${OPSYS} == MirBSD || \
+ (${OPSYS} == SunOS && !empty(PKG_OPTIONS:Mbootstrap))
+.include "../../devel/gmp/inplace.mk"
+.include "../../math/mpcomplex/inplace.mk"
+.include "../../math/mpfr/inplace.mk"
+.else
+EXTRA_CONFARGS+= --with-gmp=${BUILDLINK_PREFIX.gmp}
+EXTRA_CONFARGS+= --with-mpfr=${BUILDLINK_PREFIX.mpfr}
+EXTRA_CONFARGS+= --with-mpc=${BUILDLINK_PREFIX.mpcomplex}
+.include "../../devel/gmp/buildlink3.mk"
+.include "../../math/mpfr/buildlink3.mk"
+.include "../../math/mpcomplex/buildlink3.mk"
+.endif
+
+.if !empty(PKG_OPTIONS:Mbootstrap)
+EXTRA_CONFARGS+= --disable-shared --disable-lto
+EXTRA_CONFARGS+= --disable-libstdcxx-pch
+. if ${OPSYS} != SunOS
+EXTRA_CONFARGS+= --with-stage1-ldflags=-static
+EXTRA_CONFARGS+= --with-boot-ldflags=-static
+EXTRA_CONFARGS+= --with-system-zlib
+. endif
+.else
+EXTRA_CONFARGS+= --enable-shared
+EXTRA_CONFARGS+= --disable-bootstrap
+
+.endif