aboutsummaryrefslogtreecommitdiff
path: root/lang/gcc5-aux
diff options
context:
space:
mode:
authorJohn Marino <marino@FreeBSD.org>2015-03-14 21:32:03 +0000
committerJohn Marino <marino@FreeBSD.org>2015-03-14 21:32:03 +0000
commit05a3c66723459912bdaba4edf00aa21113c7e728 (patch)
treec20f773a504f65ec04c1837e138fcd537b4bd9a3 /lang/gcc5-aux
parent09c2ae3d378c06d810169f3859c83490fbc4edc4 (diff)
downloadports-05a3c66723459912bdaba4edf00aa21113c7e728.tar.gz
ports-05a3c66723459912bdaba4edf00aa21113c7e728.zip
Add new port lang/gcc5-aux (next Ada compiler)
This is the initial version of gcc5-aux, which will eventually become the default Ada compiler. It's not hooked into Mk/Uses/ada.mk yet, but it does pass all Ada tests on both DragonFly64 and FreeBSD64. For FreeBSD 10 amd64, the compiler built fine outside of poudriere but the bootstrap compiler failed inside of it (seemingly as a result of using base linker). Eventually a new bootstrap compiler needs to be made, but for now gcc5-aux is built with a full bootstrap on FreeBSD. On DragonFly, only a single stage is built as the bootstrap compiler still works fine.
Notes
Notes: svn path=/head/; revision=381294
Diffstat (limited to 'lang/gcc5-aux')
-rw-r--r--lang/gcc5-aux/Makefile291
-rw-r--r--lang/gcc5-aux/Makefile.common143
-rw-r--r--lang/gcc5-aux/Makefile.version20
-rw-r--r--lang/gcc5-aux/distinfo14
-rw-r--r--lang/gcc5-aux/files/android.exp106
-rw-r--r--lang/gcc5-aux/files/diff-ada3277
-rw-r--r--lang/gcc5-aux/files/diff-ada-testsuite584
-rw-r--r--lang/gcc5-aux/files/diff-core349
-rw-r--r--lang/gcc5-aux/files/diff-cxx12
-rw-r--r--lang/gcc5-aux/files/diff-cxx-testsuite24
-rw-r--r--lang/gcc5-aux/files/diff-gcc-testsuite46
-rw-r--r--lang/gcc5-aux/files/gnatdroid.exp14
-rw-r--r--lang/gcc5-aux/pkg-descr14
13 files changed, 4894 insertions, 0 deletions
diff --git a/lang/gcc5-aux/Makefile b/lang/gcc5-aux/Makefile
new file mode 100644
index 000000000000..dac1cc028063
--- /dev/null
+++ b/lang/gcc5-aux/Makefile
@@ -0,0 +1,291 @@
+# Created by: John Marino <marino@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= gcc5-aux
+PORTVERSION= ${SNAPSHOT}
+PORTREVISION= ${MAIN_PR}
+CATEGORIES= lang
+MASTER_SITES= http://downloads.dragonlace.net/src/:boot \
+ LOCAL/marino:boot ${MASTER_SITE_GCC}
+MASTER_SITE_SUBDIR= ${MS_SUBDIR}
+DISTFILES= ${IDENTIFICATION}.tar.bz2
+
+MAINTAINER= marino@FreeBSD.org
+COMMENT= Version of GCC ${GCC_BRANCH} with full Ada support
+
+LICENSE= GPLv3 GPLv3RLE
+LICENSE_COMB= multi
+
+.include "${.CURDIR}/Makefile.common"
+
+LANGS= c c++ ada
+APPLY_DIFFS= core cxx ada
+INTENDED_COMPILER= NATIVE
+GARCH= ${ARCH:S/amd64/x86_64/}
+BOOTSTRAP_COMPILER= gnat-bootstrap.${GARCH}.${OPSYS:tl}.tar.bz2
+BLD_TARGET= ${GARCH}-aux-${OPSYS:tl}${OSREL}
+FULL_GNATGCC= NOT_SET
+OS_LABEL4VERS= [${OPSYS}${GARCH:M*64:S/amd_//:S/x86_//}]
+NO_MTREE= yes
+
+OPTIONS_GROUP= Standard Bootstrap
+OPTIONS_GROUP_Standard= FORT OBJC NLS TESTSUITE STATIC
+OPTIONS_GROUP_Bootstrap=BOOTSTRAP
+OPTIONS_DEFAULT= FORT OBJC
+NO_OPTIONS_SORT= yes
+
+FORT_DESC= Fortran language support
+OBJC_DESC= Objective-C language support
+TESTSUITE_DESC= Activate test support
+STATIC_DESC= Link compilers and drivers statically
+BOOTSTRAP_DESC= Create bootstrap compiler (overrides other options)
+
+# The BOOTSTRAP option overrides all the others. "make stage" will build a
+# static compiler that supports C, C++, and Ada languages and then create
+# a new distfile in $WRKDIR/newbsd with the name following the pattern:
+# ada-bootstrap.$ARCH.$OPSYS.XY.tar.bz2. There is no need to "make install"
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD
+MODERN_BINUTILS= yes
+. if ${OSVERSION} < 900000
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.freebsd.84.tar.bz2
+. else
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.freebsd.100B.tar.bz2
+. endif
+.endif
+.if ${OPSYS} == DragonFly
+BOOTSTRAP_COMPILER= ada-bootstrap.${GARCH}.dragonfly.36A.tar.bz2
+.endif
+
+.if defined(MODERN_BINUTILS)
+# Apparently gcc 4.9 needs binutils 2.23 or greater to link Ada correctly
+USE_BINUTILS= yes
+RUN_DEPENDS+= ${LOCALBASE}/bin/as:${PORTSDIR}/devel/binutils
+EXTRA_CONFIG+= --with-ld=${LOCALBASE}/bin/ld
+EXTRA_CONFIG+= --with-as=${LOCALBASE}/bin/as
+.else
+EXTRA_CONFIG+= --with-ld=/usr/bin/ld
+EXTRA_CONFIG+= --with-as=/usr/bin/as
+.endif
+
+WRKSRC= ${WRKDIR}/${IDENTIFICATION}
+BUILDDIR= ${WRKDIR}/build
+NEWBSDIR= ${WRKDIR}/newbs/bootstrap
+CFG_SCRIPT= ${WRKSRC}/configure
+REVFILE= ${WRKSRC}/gcc/REVISION
+BOOTSTRAP_PREFIX= ${WRKDIR}/bootstrap
+PKG_PREFIX= ${PREFIX}/${PORTNAME}
+MANPREFIX= ${PREFIX}/${PORTNAME}/share
+BSFILENAME= ada-bootstrap.${GARCH}.${OPSYS:tl}.${OSREL:S/.//}.tar.bz2
+
+# If we find gnatmake and friends in a standard location, then we'll use this
+# compiler instead of downloading the bootstrap.
+.if exists (${LOCALBASE}/${PORTNAME}/bin/ada)
+.if exists (${LOCALBASE}/${PORTNAME}/bin/gnatbind)
+.if exists (${LOCALBASE}/${PORTNAME}/bin/gnatlink)
+.if exists (${LOCALBASE}/${PORTNAME}/bin/gnatmake)
+FULL_GNATGCC=${LOCALBASE}/${PORTNAME}/bin/ada
+FULL_GNATGXX=${LOCALBASE}/${PORTNAME}/bin/g++
+FULL_PATH=/sbin:/bin:/usr/sbin:/usr/bin:${PREFIX}/${PORTNAME}/bin:${PREFIX}/bin
+.endif
+.endif
+.endif
+.endif
+
+# If FULL_GNATGCC is not set, we'll request the bootstrap compiler
+.if ${FULL_GNATGCC} == NOT_SET
+INTENDED_COMPILER=BOOTSTRAP
+FULL_GNATGCC=${BOOTSTRAP_PREFIX}/bin/gcc
+FULL_GNATGXX=${BOOTSTRAP_PREFIX}/bin/g++
+FULL_PATH=${BOOTSTRAP_PREFIX}/bin:/sbin:/bin:/usr/sbin:/usr/bin:${PREFIX}/bin
+DISTFILES+= ${BOOTSTRAP_COMPILER}:boot
+.endif
+
+# for port maintenance, invoke "make makesum PLUS_BOOTSTRAPS=1"
+.if defined(PLUS_BOOTSTRAPS)
+DISTFILES= \
+ ${IDENTIFICATION}.tar.bz2 \
+ ada-bootstrap.i386.dragonfly.36A.tar.bz2:boot \
+ ada-bootstrap.i386.freebsd.84.tar.bz2:boot \
+ ada-bootstrap.i386.freebsd.100B.tar.bz2:boot \
+ ada-bootstrap.x86_64.dragonfly.36A.tar.bz2:boot \
+ ada-bootstrap.x86_64.freebsd.84.tar.bz2:boot \
+ ada-bootstrap.x86_64.freebsd.100B.tar.bz2:boot
+.endif
+
+.if ${PORT_OPTIONS:MFORT} && !${PORT_OPTIONS:MBOOTSTRAP}
+LANGS+= fortran
+#APPLY_DIFFS+= fortran
+EXTRA_CONFIG+= --enable-libquadmath
+.else
+EXTRA_CONFIG+= --disable-libquadmath
+.endif
+
+.if ${PORT_OPTIONS:MOBJC} && !${PORT_OPTIONS:MBOOTSTRAP}
+LANGS+= objc
+.endif
+
+.if ${PORT_OPTIONS:MTESTSUITE} && !${PORT_OPTIONS:MBOOTSTRAP}
+BUILD_DEPENDS+= dejagnu>=1.4:${PORTSDIR}/misc/dejagnu
+APPLY_DIFFS+= ada-testsuite
+APPLY_DIFFS+= cxx-testsuite
+APPLY_DIFFS+= gcc-testsuite
+.endif
+
+.if ${PORT_OPTIONS:MNLS} && !${PORT_OPTIONS:MBOOTSTRAP}
+USES+= gettext-tools
+EXTRA_CONFIG+= --enable-nls
+.else
+EXTRA_CONFIG+= --disable-nls
+.endif
+
+.if ${PORT_OPTIONS:MSTATIC} && !${PORT_OPTIONS:MBOOTSTRAP}
+EXTRA_CONFIG+= --with-stage1-ldflags=-static
+.endif
+
+.if ${PORT_OPTIONS:MBOOTSTRAP}
+EXTRA_CONFIG+= --disable-shared --disable-lto
+EXTRA_CONFIG+= --with-boot-ldflags=-static
+.else
+. if ${OPSYS} == DragonFly
+EXTRA_CONFIG+= --disable-bootstrap
+. endif
+.endif
+
+# Establish Ada-aware compiler for use
+ADA_CONFIGURE_ENV+= CC=${FULL_GNATGCC}
+ADA_CONFIGURE_ENV+= CXX=${FULL_GNATGXX}
+ADA_CONFIGURE_ENV+= PATH=${FULL_PATH}
+ADA_MAKE_ENV+= PATH=${FULL_PATH}
+ADA_MAKE_ENV+= LD_LIBRARY_PATH=${BUILDDIR}/gcc
+
+# The standard configuration options
+ADA_CONFIG_ARGS= --enable-languages=${LANGS:Q}
+ADA_CONFIG_ARGS+= --build=${BLD_TARGET}
+ADA_CONFIG_ARGS+= --prefix=${PKG_PREFIX:Q}
+ADA_CONFIG_ARGS+= --with-system-zlib
+ADA_CONFIG_ARGS+= --with-gmp=${PREFIX}
+ADA_CONFIG_ARGS+= --with-mpfr=${PREFIX}
+ADA_CONFIG_ARGS+= --with-mpc=${PREFIX}
+ADA_CONFIG_ARGS+= ${ICONV_CONFIGURE_ARG}
+ADA_CONFIG_ARGS+= --enable-shared
+ADA_CONFIG_ARGS+= --enable-threads=posix
+ADA_CONFIG_ARGS+= --disable-libmudflap
+ADA_CONFIG_ARGS+= --disable-libgomp
+ADA_CONFIG_ARGS+= --disable-libssp
+ADA_CONFIG_ARGS+= ${EXTRA_CONFIG}
+
+post-extract:
+ # Personalize GNAT for each different machine
+ @${ECHO} "-=> GNAT AUX ${OS_LABEL4VERS}" > ${REVFILE}
+
+ # 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
+ # Try to test more locale stuff than stock GCC
+ @(cd ${WRKSRC}/libstdc++-v3/testsuite/22_locale && ${REINPLACE_CMD} \
+ -e 's|ISO-8859|ISO8859|g' \
+ -e 's|ja_JP.eucjp|ja_JP.eucJP|g' \
+ -e 's|en_HK|zh_HK|g' \
+ -e 's|en_PH|en_NZ|g' \
+ -e 's|se_NO|no_NO|g' \
+ -e 's|es_MX|es_ES|g' \
+ -e 's|ru_RU.UTF8|ru_RU.UTF-8|g' ${LOCALE22FIX})
+.if ${PORT_OPTIONS:MSTATIC} || ${PORT_OPTIONS:MBOOTSTRAP}
+ # Ensure GNAT tools are built statically
+ ${REINPLACE_CMD} -e 's/^GCC_LINK_FLAGS=.*/GCC_LINK_FLAGS=-static/' \
+ ${WRKSRC}/gcc/ada/gcc-interface/Makefile.in
+.endif
+.if ${PORT_OPTIONS:MBOOTSTRAP} && ${OPSYS} == FreeBSD
+ # FreeBSD 8 linker doesn't understand --hash-style, so do not
+ # allow the bootstrap to use it.
+ ${REINPLACE_CMD} -e 's|" ELF_HASH_STYLE "||' \
+ ${WRKSRC}/gcc/config/i386/freebsd64.h \
+ ${WRKSRC}/gcc/config/i386/freebsd.h
+.endif
+ # Update LINK_SPEC to add gcc-aux lib runpath in every binary
+ @${ECHO} "Configuring LINK_SPEC runpath"
+ @${REINPLACE_CMD} -e 's;\@PREFIX\@;${PREFIX};' \
+ -e 's;\@GCCAUX\@;${PORTNAME};' \
+ ${WRKSRC}/gcc/config/dragonfly.h \
+ ${WRKSRC}/gcc/config/i386/freebsd64.h \
+ ${WRKSRC}/gcc/config/i386/freebsd.h
+.if defined(MODERN_BINUTILS)
+ # Use dwarf4-compatible addr2line (affects FreeBSD only)
+ ${REINPLACE_CMD} -e 's|/usr/bin/addr2line|${PREFIX}/bin/addr2line|g' \
+ ${WRKSRC}/gcc/ada/traceback_symbolic.c
+.endif
+
+do-configure:
+ ${MKDIR} ${BUILDDIR}
+ cd ${BUILDDIR} && ${SETENV} ${ADA_CONFIGURE_ENV} \
+ ${CFG_SCRIPT} ${ADA_CONFIG_ARGS}
+
+do-build:
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -j${MAKE_JOBS_NUMBER} ${MAKE_ARGS} all
+
+.if ${PORT_OPTIONS:MTESTSUITE} && !${PORT_OPTIONS:MBOOTSTRAP}
+test: build test-ada test-fortran test-objc test-cxx test-c
+
+test-ada:
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -sk check-ada
+
+test-cxx:
+ # libstdc++ testsuite will break every time, for TRUE to continue
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -sk check-c++ || true
+
+test-c:
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -sk check-c
+
+test-fortran:
+. if ${PORT_OPTIONS:MFORT}
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -sk check-fortran
+. endif
+
+test-objc:
+. if ${PORT_OPTIONS:MOBJC}
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} -sk check-objc
+. endif
+.endif
+
+do-install:
+ cd ${BUILDDIR} && ${SETENV} ${ADA_MAKE_ENV} \
+ ${MAKE_CMD} install-strip ${MAKE_ARGS}
+ ${MV} ${STAGEDIR}${PKG_PREFIX}/share ${WRKDIR}/moved_share
+# Don't activate until this port builds gnatdroid
+# Otherwise it will conflict with lang/gcc-aux
+# ${MKDIR} ${STAGEDIR}${PREFIX}/share/dejagnu/baseboards \
+# ${STAGEDIR}${PREFIX}/share/dejagnu/config
+# ${INSTALL_DATA} ${FILESDIR}/android.exp \
+# ${STAGEDIR}${PREFIX}/share/dejagnu/config
+# ${INSTALL_DATA} ${FILESDIR}/gnatdroid.exp \
+# ${STAGEDIR}${PREFIX}/share/dejagnu/baseboards
+
+post-stage:
+ (cd ${STAGEDIR}${PKG_PREFIX}; ${FIND} * -type d -empty | \
+ ${SORT} -dr | ${XARGS} ${RMDIR})
+ (cd ${STAGEDIR}${PREFIX}; ${FIND} ${PORTNAME} share \
+ \( -type f -or -type l \) | ${SORT} | ${SED} \
+ -e 's/\/man\/man[1578]\/.*[1578]$$/&.gz/' >> ${TMPPLIST})
+.if ${PORT_OPTIONS:MBOOTSTRAP}
+ ${MKDIR} ${NEWBSDIR}
+ ${CP} -a ${STAGEDIR}${PKG_PREFIX}/bin ${NEWBSDIR}/
+ ${CP} -a ${STAGEDIR}${PKG_PREFIX}/lib ${NEWBSDIR}/
+ ${CP} -a ${STAGEDIR}${PKG_PREFIX}/include ${NEWBSDIR}/
+ ${CP} -a ${STAGEDIR}${PKG_PREFIX}/libexec ${NEWBSDIR}/
+ ${RM} ${NEWBSDIR}/bin/${GARCH}*
+ ${RM} -rf ${NEWBSDIR}/lib/gcc/${BLD_TARGET}/${GCC_VERSION}/include-fixed
+ (cd ${NEWBSDIR}/.. ; ${TAR} -cyf ${BSFILENAME} bootstrap)
+.endif
+
+.include <bsd.port.mk>
diff --git a/lang/gcc5-aux/Makefile.common b/lang/gcc5-aux/Makefile.common
new file mode 100644
index 000000000000..6f76983ffa22
--- /dev/null
+++ b/lang/gcc5-aux/Makefile.common
@@ -0,0 +1,143 @@
+# $FreeBSD$
+
+.include "Makefile.version"
+
+LIB_DEPENDS= libgmp.so:${PORTSDIR}/math/gmp
+LIB_DEPENDS+= libmpfr.so:${PORTSDIR}/math/mpfr
+LIB_DEPENDS+= libmpc.so:${PORTSDIR}/math/mpc
+
+ONLY_FOR_ARCHS= i386 amd64
+
+GNU_CONFIGURE= yes
+USES= gmake iconv libtool perl5 tar:bzip2
+USE_PERL5= build
+ALL_TARGET= default
+
+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 000000000000..a2f7b3c88abf
--- /dev/null
+++ b/lang/gcc5-aux/Makefile.version
@@ -0,0 +1,20 @@
+# $FreeBSD$
+
+GCC_BRANCH= 5
+GCC_POINT= 0.0
+GCC_VERSION= ${GCC_BRANCH}.${GCC_POINT}
+SNAPSHOT= 20150308
+BUILD_RELEASE= no
+MAIN_PR= 0
+UTIL_PR= 0
+ARMV7_PR= 0
+
+.if ${BUILD_RELEASE:Mno}
+# Snapshot naming pattern
+IDENTIFICATION= gcc-${GCC_BRANCH}-${SNAPSHOT}
+MS_SUBDIR= snapshots/${GCC_BRANCH}-${SNAPSHOT}
+.else
+# Release naming pattern
+IDENTIFICATION= gcc-${GCC_VERSION}
+MS_SUBDIR= releases/gcc-${GCC_VERSION}
+.endif
diff --git a/lang/gcc5-aux/distinfo b/lang/gcc5-aux/distinfo
new file mode 100644
index 000000000000..a5b2363fe550
--- /dev/null
+++ b/lang/gcc5-aux/distinfo
@@ -0,0 +1,14 @@
+SHA256 (gcc-5-20150308.tar.bz2) = c0137e2768971bf03c08fa47161e5b295f61d94fd7c40e4798c80633b678191f
+SIZE (gcc-5-20150308.tar.bz2) = 90652639
+SHA256 (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 6b1a6ff0fe0e3bf13c667db2fef177b811329cd998400a1303969a86911cb1c8
+SIZE (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 39357314
+SHA256 (ada-bootstrap.i386.freebsd.84.tar.bz2) = b410336cb0e71c8a29dd5f831a17b4b7282e7d590f452475a94c6a625cfc8846
+SIZE (ada-bootstrap.i386.freebsd.84.tar.bz2) = 39727003
+SHA256 (ada-bootstrap.i386.freebsd.100B.tar.bz2) = 7231209f2600275f554f788ad1d036cf633c4339ebd25bd479a5bb1ddcddedf3
+SIZE (ada-bootstrap.i386.freebsd.100B.tar.bz2) = 41229192
+SHA256 (ada-bootstrap.x86_64.dragonfly.36A.tar.bz2) = ba9b193f1f5c780c0e94086a9af6f1c8e843b6782c133b9948789b95b2e605c4
+SIZE (ada-bootstrap.x86_64.dragonfly.36A.tar.bz2) = 40747242
+SHA256 (ada-bootstrap.x86_64.freebsd.84.tar.bz2) = ba1a407d936e7b3f2bfe825d1fb5a1f0e85e8edbdd9e8440bb49ef643fec05fc
+SIZE (ada-bootstrap.x86_64.freebsd.84.tar.bz2) = 40227668
+SHA256 (ada-bootstrap.x86_64.freebsd.100B.tar.bz2) = 1066d7c5e71d78b4416de3b73348227678ca07db52488409e270db7b00467f55
+SIZE (ada-bootstrap.x86_64.freebsd.100B.tar.bz2) = 42163803
diff --git a/lang/gcc5-aux/files/android.exp b/lang/gcc5-aux/files/android.exp
new file mode 100644
index 000000000000..b3eb17563371
--- /dev/null
+++ b/lang/gcc5-aux/files/android.exp
@@ -0,0 +1,106 @@
+# This file is part of DejaGnu.
+
+if {![info exists board]} {
+ error "must set $board before loading android.exp"
+}
+
+# For rcp_download, rsh_exec.
+load_lib remote.exp
+
+#
+# unix_load -- load the program and execute it
+#
+# See default.exp for explanation of arguments and results.
+#
+
+
+proc unix_load { dest prog args } {
+ global ld_library_path
+ set output ""
+ set orig_ld_library_path ""
+
+ if { [llength $args] > 0 } {
+ set parg [lindex $args 0]
+ } else {
+ set parg ""
+ }
+
+ if { [llength $args] > 1 } {
+ set inp [lindex $args 1]
+ } else {
+ set inp ""
+ }
+
+ if {![file exists $prog]} then {
+ # We call both here because this should never happen.
+ perror "$prog does not exist in unix_load."
+ verbose -log "$prog does not exist." 3
+ return "untested"
+ }
+ verbose "loading to $dest" 2
+ if {![is_remote $dest]} {
+ if { "$inp" != "" } {
+ set command "$prog $parg < $inp"
+ } else {
+ set command "$prog $parg"
+ }
+
+ if {![info exists ld_library_path]} {
+ set ld_library_path ""
+ }
+
+ set orig_ld_library_path "[getenv LD_LIBRARY_PATH]"
+ setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path"
+ setenv SHLIB_PATH "$ld_library_path:$orig_ld_library_path"
+ verbose -log "Setting LD_LIBRARY_PATH to $ld_library_path:$orig_ld_library_path" 2
+
+ set id [remote_spawn $dest "$command" "readonly"]
+ if { $id < 0 } {
+ set output "remote_spawn failed"
+ set status -1
+ } else {
+ set status [remote_wait $dest 300]
+ set output [lindex $status 1]
+ set status [lindex $status 0]
+ }
+ # Unset them so we don't potentially get hosed when we try to run a
+ # non-testcase executable. (Setting LD_LIBRARY_PATH is the wrong
+ # fix in the first place; this just tries to minimize the resulting
+ # crap.)
+ if {[info exists ld_library_path]} {
+ setenv LD_LIBRARY_PATH $orig_ld_library_path
+ setenv SHLIB_PATH $orig_ld_library_path
+ }
+ } else {
+ set remotefile "/data/local/testsuite/[file tail $prog].[pid]"
+ set remotefile [remote_download $dest $prog $remotefile]
+ if { $remotefile == "" } {
+ verbose -log "Download of $prog to [board_info $dest name] failed." 3
+ return [list "unresolved" ""]
+ }
+ set status [remote_exec $dest "$remotefile" $parg $inp]
+ remote_file $dest delete $remotefile.o $remotefile
+ if { [lindex $status 0] < 0 } {
+ verbose -log "Couldn't execute $prog, [lindex $status 1]" 3
+ return [list "unresolved" ""]
+ }
+ set output [lindex $status 1]
+ set status [lindex $status 0]
+ }
+
+ setenv LD_LIBRARY_PATH $orig_ld_library_path
+ setenv SHLIB_PATH $orig_ld_library_path
+
+ verbose "Executed $prog, status $status" 2
+ if {![string match "" $output]} {
+ verbose -- "$output" 2
+ }
+ if { $status == 0 } {
+ set result "pass"
+ } else {
+ set result "fail"
+ }
+ return [list $result $output]
+}
+
+set_board_info protocol "unix"
diff --git a/lang/gcc5-aux/files/diff-ada b/lang/gcc5-aux/files/diff-ada
new file mode 100644
index 000000000000..c7335901041c
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-ada
@@ -0,0 +1,3277 @@
+--- gcc/ada/a-exetim-posix.adb.orig
++++ gcc/ada/a-exetim-posix.adb
+@@ -105,11 +105,11 @@
+ -- Time is equal to Duration (although it is a private type) and
+ -- CPU_Time is equal to Time.
+
+- function clock_gettime
++ function clock_gettime_int
+ (clock_id : Interfaces.C.int;
+ tp : access timespec)
+ return int;
+- pragma Import (C, clock_gettime, "clock_gettime");
++ pragma Import (C, clock_gettime_int, "clock_gettime");
+ -- Function from the POSIX.1b Realtime Extensions library
+
+ begin
+@@ -117,7 +117,7 @@
+ raise Program_Error;
+ end if;
+
+- Result := clock_gettime
++ Result := clock_gettime_int
+ (clock_id => CLOCK_THREAD_CPUTIME_ID, tp => TS'Unchecked_Access);
+ pragma Assert (Result = 0);
+
+--- /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;
+--- 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
+@@ -600,8 +600,8 @@
+ type time_t is new long;
+
+ 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-osprim-bsd32.adb
+@@ -0,0 +1,186 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ P R I M I T I V E S --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 1998-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. --
++-- Extensive contributions were provided by Ada Core Technologies, Inc. --
++-- --
++-- Copyright (C) 2010, 2011 John Marino <www.dragonlace.net> --
++------------------------------------------------------------------------------
++
++-- This version is for BSD operating systems using 32-bit time types.
++
++with Interfaces.C;
++
++package body System.OS_Primitives is
++
++ -- ??? These definitions are duplicated from System.OS_Interface
++ -- because we don't want to depend on any package. Consider removing
++ -- these declarations in System.OS_Interface and move these ones in
++ -- the spec.
++
++ subtype int is Interfaces.C.int;
++ subtype long is Interfaces.C.long;
++
++ type time_t is new int;
++
++ type timespec is record
++ tv_sec : time_t;
++ tv_nsec : long;
++ end record;
++ pragma Convention (C, timespec);
++
++ type timezone is record
++ tz_minuteswest : int;
++ tz_dsttime : int;
++ end record;
++ pragma Convention (C, timezone);
++
++ function nanosleep (rqtp, rmtp : access timespec) return int;
++ pragma Import (C, nanosleep, "nanosleep");
++
++ -----------
++ -- Clock --
++ -----------
++
++ function Clock return Duration is
++ type timeval is array (1 .. 2) of Long_Integer;
++ tzresult : aliased timezone;
++
++ procedure timeval_to_duration
++ (T : not null access timeval;
++ sec : not null access Long_Integer;
++ usec : not null access Long_Integer);
++ pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
++
++ Micro : constant := 10**6;
++ sec : aliased Long_Integer;
++ usec : aliased Long_Integer;
++ TV : aliased timeval;
++ Result : int;
++
++ function gettimeofday
++ (Tv : access timeval;
++ Tz : access timezone) return int;
++ pragma Import (C, gettimeofday, "gettimeofday");
++
++ pragma Unreferenced (Result);
++ begin
++ -- The return codes for gettimeofday are as follows (from man pages):
++ -- EPERM settimeofday is called by someone other than the superuser
++ -- EINVAL Timezone (or something else) is invalid
++ -- EFAULT One of tv or tz pointed outside accessible address space
++
++ -- None of these codes signal a potential clock skew, hence the return
++ -- value is never checked.
++
++ Result := gettimeofday (TV'Access, tzresult'Access);
++ timeval_to_duration (TV'Access, sec'Access, usec'Access);
++ return Duration (sec) + Duration (usec) / Micro;
++ end Clock;
++
++ ---------------------
++ -- Monotonic_Clock --
++ ---------------------
++
++ function Monotonic_Clock return Duration renames Clock;
++
++ -----------------
++ -- To_Timespec --
++ -----------------
++
++ function To_Timespec (D : Duration) return 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'(tv_sec => S,
++ tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
++ end To_Timespec;
++
++ -----------------
++ -- Timed_Delay --
++ -----------------
++
++ procedure Timed_Delay
++ (Time : Duration;
++ Mode : Integer)
++ is
++ Request : aliased timespec;
++ Remaind : aliased timespec;
++ Rel_Time : Duration;
++ Abs_Time : Duration;
++ Base_Time : constant Duration := Clock;
++ Check_Time : Duration := Base_Time;
++
++ Result : int;
++ pragma Unreferenced (Result);
++
++ begin
++ if Mode = Relative then
++ Rel_Time := Time;
++ Abs_Time := Time + Check_Time;
++ else
++ Rel_Time := Time - Check_Time;
++ Abs_Time := Time;
++ end if;
++
++ if Rel_Time > 0.0 then
++ loop
++ Request := To_Timespec (Rel_Time);
++ Result := nanosleep (Request'Access, Remaind'Access);
++ Check_Time := Clock;
++
++ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
++
++ Rel_Time := Abs_Time - Check_Time;
++ end loop;
++ end if;
++ end Timed_Delay;
++
++ ----------------
++ -- Initialize --
++ ----------------
++
++ procedure Initialize is
++ begin
++ null;
++ end Initialize;
++
++end System.OS_Primitives;
+--- /dev/null
++++ gcc/ada/s-osprim-bsd64.adb
+@@ -0,0 +1,192 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
++-- --
++-- S Y S T E M . O S _ P R I M I T I V E S --
++-- --
++-- B o d y --
++-- --
++-- Copyright (C) 1998-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. --
++-- Extensive contributions were provided by Ada Core Technologies, Inc. --
++-- --
++-- Copyright (C) 2010, 2011 John Marino <www.dragonlace.net> --
++------------------------------------------------------------------------------
++
++-- This version is for BSD operating systems using 64-bit time types.
++
++with Interfaces.C;
++
++package body System.OS_Primitives is
++
++ -- ??? These definitions are duplicated from System.OS_Interface
++ -- because we don't want to depend on any package. Consider removing
++ -- these declarations in System.OS_Interface and move these ones in
++ -- the spec.
++
++ subtype int is Interfaces.C.int;
++ subtype long is Interfaces.C.long;
++ subtype int64_t is Interfaces.Integer_64;
++
++ type time_t is new int64_t;
++
++ type timespec is record
++ tv_sec : time_t;
++ tv_nsec : long;
++ end record;
++ pragma Convention (C, timespec);
++
++ type timezone is record
++ tz_minuteswest : int;
++ tz_dsttime : int;
++ end record;
++ pragma Convention (C, timezone);
++
++ type timeval is record
++ tv_sec : time_t;
++ tv_usec : long; -- Not for NetBSD! FreeBSD/DragonFly
++ end record;
++ pragma Convention (C, timeval);
++
++ function nanosleep (rqtp, rmtp : access timespec) return int;
++ pragma Import (C, nanosleep, "nanosleep");
++
++ -----------
++ -- Clock --
++ -----------
++
++ function Clock return Duration is
++
++ procedure timeval_to_duration
++ (T : not null access timeval;
++ sec : not null access Long_Integer;
++ usec : not null access Long_Integer);
++ pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
++
++ Micro : constant := 10**6;
++ sec : aliased Long_Integer;
++ usec : aliased Long_Integer;
++ TV : aliased timeval;
++ tzresult : aliased timezone;
++ Result : int;
++
++ function gettimeofday
++ (Tv : access timeval;
++ Tz : access timezone) return int;
++ pragma Import (C, gettimeofday, "gettimeofday");
++
++ pragma Unreferenced (Result);
++ begin
++ -- The return codes for gettimeofday are as follows (from man pages):
++ -- EPERM settimeofday is called by someone other than the superuser
++ -- EINVAL Timezone (or something else) is invalid
++ -- EFAULT One of tv or tz pointed outside accessible address space
++
++ -- None of these codes signal a potential clock skew, hence the return
++ -- value is never checked.
++
++ Result := gettimeofday (TV'Access, tzresult'Access);
++ timeval_to_duration (TV'Access, sec'Access, usec'Access);
++ return Duration (sec) + Duration (usec) / Micro;
++ end Clock;
++
++ ---------------------
++ -- Monotonic_Clock --
++ ---------------------
++
++ function Monotonic_Clock return Duration renames Clock;
++
++ -----------------
++ -- To_Timespec --
++ -----------------
++
++ function To_Timespec (D : Duration) return 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'(tv_sec => S,
++ tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
++ end To_Timespec;
++
++ -----------------
++ -- Timed_Delay --
++ -----------------
++
++ procedure Timed_Delay
++ (Time : Duration;
++ Mode : Integer)
++ is
++ Request : aliased timespec;
++ Remaind : aliased timespec;
++ Rel_Time : Duration;
++ Abs_Time : Duration;
++ Base_Time : constant Duration := Clock;
++ Check_Time : Duration := Base_Time;
++
++ Result : int;
++ pragma Unreferenced (Result);
++
++ begin
++ if Mode = Relative then
++ Rel_Time := Time;
++ Abs_Time := Time + Check_Time;
++ else
++ Rel_Time := Time - Check_Time;
++ Abs_Time := Time;
++ end if;
++
++ if Rel_Time > 0.0 then
++ loop
++ Request := To_Timespec (Rel_Time);
++ Result := nanosleep (Request'Access, Remaind'Access);
++ Check_Time := Clock;
++
++ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
++
++ Rel_Time := Abs_Time - Check_Time;
++ end loop;
++ end if;
++ end Timed_Delay;
++
++ ----------------
++ -- Initialize --
++ ----------------
++
++ procedure Initialize is
++ begin
++ null;
++ end Initialize;
++
++end System.OS_Primitives;
+--- /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.ads
+@@ -0,0 +1,144 @@
++------------------------------------------------------------------------------
++-- --
++-- GNAT RUN-TIME COMPONENTS --
++-- --
++-- S Y S T E M --
++-- --
++-- S p e c --
++-- (DragonFly BSD/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-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;
+--- 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 \
+@@ -1149,10 +1150,6 @@
+ a-exexpr.adb<a-exexpr-gcc.adb \
+ s-excmac.ads<s-excmac-arm.ads
+
+- TOOLS_TARGET_PAIRS = \
+- mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+- indepsw.adb<indepsw-gnu.adb
+-
+ EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+ EXTRA_LIBGNAT_OBJS+=raise-gcc.o sigtramp-armdroid.o
+ EXTRA_GNATRTL_NONTASKING_OBJS+=g-cppexc.o s-excmac.o
+@@ -1166,6 +1163,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 +1206,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,
+@@ -1419,12 +1419,17 @@
+ # x86 FreeBSD
+ ifeq ($(strip $(filter-out %86 freebsd%,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
+ 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 \
++ s-osprim.adb<s-osprim-bsd32.adb \
+ s-taprop.adb<s-taprop-posix.adb \
+ s-taspri.ads<s-taspri-posix.ads \
+ s-tpopsp.adb<s-tpopsp-posix.adb \
+@@ -1432,11 +1437,12 @@
+ $(X86_TARGET_PAIRS) \
+ system.ads<system-freebsd-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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
+
+ EH_MECHANISM=-gcc
+ THREADSLIB= -lpthread
+@@ -1448,12 +1454,17 @@
+ # x86-64 FreeBSD
+ ifeq ($(strip $(filter-out %86_64 freebsd%,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
+ 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 \
++ s-osprim.adb<s-osprim-bsd64.adb \
+ s-taprop.adb<s-taprop-posix.adb \
+ s-taspri.ads<s-taspri-posix.ads \
+ s-tpopsp.adb<s-tpopsp-posix.adb \
+@@ -1461,11 +1472,240 @@
+ $(X86_64_TARGET_PAIRS) \
+ system.ads<system-freebsd-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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86 DragonFly
++ifeq ($(strip $(filter-out %86 dragonfly%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ 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_TARGET_PAIRS) \
++ system.ads<system-dragonfly-x86.ads
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.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-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ 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
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86 OpenBSD
++ifeq ($(strip $(filter-out %86 openbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ a-intnam.ads<a-intnam-openbsd.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-openbsd.adb \
++ s-osinte.ads<s-osinte-openbsd.ads \
++ s-osprim.adb<s-osprim-bsd32.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-openbsd-x86.ads
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
++
++ EH_MECHANISM=
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86_64 OpenBSD
++ifeq ($(strip $(filter-out x86_64 openbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ a-intnam.ads<a-intnam-openbsd.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-openbsd.adb \
++ s-osinte.ads<s-osinte-openbsd.ads \
++ s-osprim.adb<s-osprim-bsd32.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-openbsd-x86_64.ads
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
++
++ EH_MECHANISM=
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86 NetBSD (5+ only)
++ifeq ($(strip $(filter-out %86 netbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ a-intnam.ads<a-intnam-netbsd.ads \
++ g-socthi.adb<g-socthi-netbsd.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-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
++
++ ifeq ($(strip $(filter-out %86 netbsdelf5%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS+= \
++ s-osinte.ads<s-osinte-netbsd.ads \
++ s-osprim.adb<s-osprim-bsd32.adb
++ else
++ LIBGNAT_TARGET_PAIRS+= \
++ g-socthi.ads<g-socthi-netbsd6.ads \
++ s-osinte.ads<s-osinte-netbsd6.ads \
++ s-osprim.adb<s-osprim-bsdn6.adb
++ endif
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
++
++ EH_MECHANISM=-gcc
++ THREADSLIB= -lpthread
++ GMEM_LIB = gmemlib
++ LIBRARY_VERSION := $(LIB_VERSION)
++ MISCLIB = -lutil
++endif
++
++# x86_64 NetBSD (5+ only)
++ifeq ($(strip $(filter-out x86_64 netbsd%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS = \
++ a-exetim.adb<a-exetim-posix.adb \
++ a-exetim.ads<a-exetim-default.ads \
++ a-intnam.ads<a-intnam-netbsd.ads \
++ g-socthi.adb<g-socthi-netbsd.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-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
++
++ ifeq ($(strip $(filter-out x86_64 netbsd5%,$(target_cpu) $(target_os))),)
++ LIBGNAT_TARGET_PAIRS+= \
++ s-osinte.ads<s-osinte-netbsd.ads \
++ s-osprim.adb<s-osprim-bsd32.adb
++ else
++ LIBGNAT_TARGET_PAIRS+= \
++ g-socthi.ads<g-socthi-netbsd6.ads \
++ s-osinte.ads<s-osinte-netbsd6.ads \
++ s-osprim.adb<s-osprim-bsdn6.adb
++ endif
++
++ 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
++ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o
+
+ EH_MECHANISM=-gcc
+ THREADSLIB= -lpthread
+--- 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 000000000000..725726e66c85
--- /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 000000000000..04cf9e732273
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-core
@@ -0,0 +1,349 @@
+--- 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,198 @@
++/* DWARF2 EH unwinding support for FreeBSD: AMD x86-64 and x86.
++ * Copyright (C) 2010, 2012, 2014 John Marino <draco@marino.st>
++ *
++ * Do code reading to identify a signal frame, and set the frame
++ * state data appropriately. See unwind-dw2.c for the structs.
++ */
++
++#include <sys/types.h>
++#include <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
++
++#if (__FreeBSD__ < 9)
++#include <sys/sysctl.h>
++static void
++x86_64_sigtramp_range (unsigned char **start, unsigned char **end)
++{
++ unsigned long ps_strings;
++ int mib[2];
++ size_t len;
++
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PS_STRINGS;
++ len = sizeof (ps_strings);
++ sysctl (mib, 2, &ps_strings, &len, NULL, 0);
++
++ *start = (unsigned char *)ps_strings - 32;
++ *end = (unsigned char *)ps_strings;
++}
++#endif
++
++
++static _Unwind_Reason_Code
++x86_64_freebsd_fallback_frame_state
++(struct _Unwind_Context *context, _Unwind_FrameState *fs)
++{
++ struct sigframe *sf;
++ long new_cfa;
++
++#if (__FreeBSD__ < 9)
++ unsigned char *pc = context->ra;
++ unsigned char *sigtramp_start, *sigtramp_end;
++
++ x86_64_sigtramp_range(&sigtramp_start, &sigtramp_end);
++ if (pc >= sigtramp_end || pc < sigtramp_start)
++ return _URC_END_OF_STACK;
++#else
++ /* 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. We are
++ stuck looking for frame patterns again (sys/amd64/amd64/sigtramp.S):
++
++ <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;
++#endif
++
++ 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.
++
++#include <sys/sysctl.h>
++static void
++x86_sigtramp_range (unsigned char **start, unsigned char **end)
++{
++ unsigned long ps_strings;
++ int mib[2];
++ size_t len;
++
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PS_STRINGS;
++ len = sizeof (ps_strings);
++ sysctl (mib, 2, &ps_strings, &len, NULL, 0);
++
++ *start = (unsigned char *)ps_strings - 128;
++ *end = (unsigned char *)ps_strings;
++}
++*/
++
++
++static _Unwind_Reason_Code
++x86_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__ */
+--- 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/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 \
+@@ -1510,6 +1509,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
+@@ -1517,6 +1517,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
+@@ -2163,6 +2168,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)
+@@ -2180,6 +2186,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
+@@ -567,9 +567,11 @@
+ ;;
+ 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*)
+ ;;
diff --git a/lang/gcc5-aux/files/diff-cxx b/lang/gcc5-aux/files/diff-cxx
new file mode 100644
index 000000000000..6646a04b444e
--- /dev/null
+++ b/lang/gcc5-aux/files/diff-cxx
@@ -0,0 +1,12 @@
+--- 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 000000000000..4f7388a9a662
--- /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-gcc-testsuite b/lang/gcc5-aux/files/diff-gcc-testsuite
new file mode 100644
index 000000000000..a9a330ecf553
--- /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/files/gnatdroid.exp b/lang/gcc5-aux/files/gnatdroid.exp
new file mode 100644
index 000000000000..978319f8a9b1
--- /dev/null
+++ b/lang/gcc5-aux/files/gnatdroid.exp
@@ -0,0 +1,14 @@
+# gnatdroid testsuite running over ssh.
+
+load_generic_config "android"
+
+process_multilib_options ""
+
+# The default compiler for this target.
+set_board_info compiler "[find_gcc]"
+
+set_board_info rsh_prog /usr/bin/ssh
+set_board_info rcp_prog /usr/bin/scp
+set_board_info protocol standard
+set_board_info hostname tablet
+set_board_info username root
diff --git a/lang/gcc5-aux/pkg-descr b/lang/gcc5-aux/pkg-descr
new file mode 100644
index 000000000000..c7eff9c4711d
--- /dev/null
+++ b/lang/gcc5-aux/pkg-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 uses 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.
+
+WWW: http://www.dragonlace.net/