Commit 94056e1d authored by jhb's avatar jhb
Browse files

Add a new port for an external FreeBSD toolchain based on GCC 9.

This port provides external GCC toolchains for GCC 9.2.0 for the aarch64,
amd64, i386, mips, mips64, powerpc, powerpc64, riscv64, and sparc64
platforms.

Note that at present I am not yet able to build a full FreeBSD system
on any of these platforms, but it will be easier to debug the remaining
issues (which may be issues to fix in FreeBSD rather than the port) with
the packages available to other developers.

Reviewed by:	bapt, cem
Approved by:	portmgr (bapt)
Differential Revision:	https://reviews.freebsd.org/D22863
parent 556cd6df
......@@ -708,6 +708,7 @@
SUBDIR += fpp
SUBDIR += frama-c
SUBDIR += freebsd-gcc6
SUBDIR += freebsd-gcc9
SUBDIR += frink
SUBDIR += fsmtrie
SUBDIR += fstrcmp
......
# $FreeBSD$
PORTNAME= gcc
PORTVERSION= 9.2.0
CATEGORIES= devel
MASTER_SITES= GCC/releases/gcc-${DISTVERSION}
PKGNAMEPREFIX= ${TARGETARCH}-
PKGNAMESUFFIX= ${SUFFIX}
MAINTAINER= jhb@FreeBSD.org
COMMENT= Cross GNU Compiler Collection for ${TARGETARCH}
LICENSE= GPLv3 GPLv3RLE
LICENSE_COMB= multi
LIB_DEPENDS= libgmp.so:math/gmp \
libmpfr.so:math/mpfr \
libmpc.so:math/mpc
BUILD_DEPENDS= ${BU_PREFIX}-as:devel/binutils@${TARGETARCH}
RUN_DEPENDS= ${BU_PREFIX}-as:devel/binutils@${TARGETARCH}
FLAVORS= aarch64 amd64 i386 mips mips64 powerpc powerpc64 riscv64 sparc64
TARGETARCH= ${FLAVOR}
USES= gmake iconv libtool tar:xz makeinfo compiler:c++11-lang
PLIST_SUB= OPSYS=${OPSYS:tl} \
SUFFIX=${SUFFIX} \
TARGETARCH=${TARGETARCH} \
GCC_TARGET=${GCC_TARGET} \
GCC_VERSION=${PORTVERSION}
SUB_FILES= xtoolchain.mk
SUB_LIST= GCC_TARGET=${GCC_TARGET} \
SUFFIX=${SUFFIX}
GCC_TARGET= ${FLAVOR:S/amd64/x86_64/}-unknown-${OPSYS:tl}${OSREL}
SUFFIX= ${PORTVERSION:C/([0-9]+).*/\1/}
BU_PREFIX= ${GCC_TARGET}
GNU_CONFIGURE= yes
CONFIGURE_OUTSOURCE= yes
CONFIGURE_ARGS+=--target=${GCC_TARGET} --disable-nls --enable-languages=c,c++ \
--enable-gnu-indirect-function \
--enable-initfini-array \
--program-prefix=${GCC_TARGET}- \
--program-suffix=${SUFFIX} \
--without-headers \
--with-gmp=${LOCALBASE} \
--with-pkgversion="FreeBSD Ports Collection for ${PKGNAMEPREFIX:C/-//g}" \
--with-system-zlib \
--with-gxx-include-dir=/usr/include/c++/v1/ \
--with-sysroot="/" \
--with-as=${LOCALBASE}/bin/${BU_PREFIX}-as \
--with-ld=${LOCALBASE}/bin/${BU_PREFIX}-ld
ALL_TARGET= all-gcc
INSTALL_TARGET= install-gcc
.include <bsd.port.pre.mk>
post-patch:
@${REINPLACE_CMD} -e '/LIBSTDCXX/ s/stdc\+\+/c\+\+/g ' \
${WRKSRC}//gcc/cp/g++spec.c
@${REINPLACE_CMD} -e '/LOCAL_INCLUDE_DIR/ d ' \
${WRKSRC}//gcc/Makefile.in
.if ${ARCH} == "amd64"
CONFIGURE_TARGET= x86_64-unknown-${OPSYS:tl}${OSREL}
.else
CONFIGURE_TARGET= ${ARCH}-unknown-${OPSYS:tl}${OSREL}
.endif
.if ${TARGETARCH} == "armv6" || ${TARGETARCH} == "aarch64"
. if ${COMPILER_TYPE} == clang
MAKE_ARGS+=CXXFLAGS=-fbracket-depth=512
. endif
.endif
# Disable LTO on aarch64 since we force aarch64-binutils to
# use STATIC
.if ${TARGETARCH} == "aarch64"
CONFIGURE_ARGS+= --disable-lto
PLIST_SUB+= LTO="@comment "
.else
PLIST_SUB+= LTO=""
.endif
.if ${ARCH} == "aarch64"
PLIST_SUB+= PLUGINS="@comment plugin does not build"
.else
PLIST_SUB+= PLUGINS=""
.endif
.if ${TARGETARCH} == "amd64" || ${TARGETARCH} == "i386"
PLIST_SUB+= FLOAT_H="@comment "
.else
PLIST_SUB+= FLOAT_H=""
.endif
PLIST= ${.CURDIR}/pkg-plist
.if ${TARGETARCH} == "aarch64"
PLIST+= ${.CURDIR}/pkg-plist.aarch64
.endif
.if ${TARGETARCH} == "aarch64" || ${TARGETARCH:Marm*}
PLIST+= ${.CURDIR}/pkg-plist.arm
.endif
.if ${TARGETARCH} == "amd64"
PLIST+= ${.CURDIR}/pkg-plist.amd64
.endif
.if ${TARGETARCH} == "amd64" || ${TARGETARCH} == "i386"
PLIST+= ${.CURDIR}/pkg-plist.i386
.endif
.if ${TARGETARCH:Mmips*}
PLIST+= ${.CURDIR}/pkg-plist.mips
.endif
.if ${TARGETARCH} == "powerpc64"
PLIST+= ${.CURDIR}/pkg-plist.powerpc64
.elif ${TARGETARCH:Mpowerpc*}
PLIST+= ${.CURDIR}/pkg-plist.powerpc
.endif
.if ${TARGETARCH:Mriscv*}
PLIST+= ${.CURDIR}/pkg-plist.riscv
.endif
.if ${TARGETARCH} == "sparc64"
PLIST+= ${.CURDIR}/pkg-plist.sparc64
.endif
post-install:
@${RM} ${STAGEDIR}${PREFIX}/bin/${GCC_TARGET}-${GCC_TARGET}-*
@${RM} ${STAGEDIR}${PREFIX}/share/info/*
@${RM} ${STAGEDIR}${PREFIX}/man/man7/*
@${RM} -r ${STAGEDIR}${PREFIX}/lib/gcc/${GCC_TARGET}/${PORTVERSION}/include-fixed
.if ${TARGETARCH} == "amd64" || ${TARGETARCH} == "i386"
# Conflicts with sys/x86/include/float.h
${RM} ${STAGEDIR}${PREFIX}/lib/gcc/${GCC_TARGET}/${PORTVERSION}/include/float.h
.endif
@${MKDIR} ${STAGEDIR}${PREFIX}/share/toolchains/
@${INSTALL_DATA} ${WRKDIR}/xtoolchain.mk \
${STAGEDIR}${PREFIX}/share/toolchains/${TARGETARCH}-gcc${SUFFIX}.mk
.include <bsd.port.post.mk>
TIMESTAMP = 1574959919
SHA256 (gcc-9.2.0.tar.xz) = ea6ef08f121239da5695f76c9b33637a118dcf63e24164422231917fa61fb206
SIZE (gcc-9.2.0.tar.xz) = 70607648
--- gcc/c-family/c-format.c.orig 2019-02-25 15:43:51.000000000 -0800
+++ gcc/c-family/c-format.c 2019-11-28 17:36:16.788253000 -0800
@@ -683,6 +683,26 @@ static const format_char_info print_char_table[] =
{ NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
};
+static const format_char_info fbsd_ext_char_info =
+{ NULL, 1, STD_EXT, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "cR", NULL };
+
+static const format_char_info fbsd_print_char_table[] =
+{
+ /* BSD conversion specifiers. */
+ /* FreeBSD kernel extensions (src/sys/kern/subr_prf.c).
+ The format %b is supported to decode error registers.
+ Its usage is: printf("reg=%b\n", regval, "<base><arg>*");
+ which produces: reg=3<BITTWO,BITONE>
+ The format %D provides a hexdump given a pointer and separator string:
+ ("%6D", ptr, ":") -> XX:XX:XX:XX:XX:XX
+ ("%*D", len, ptr, " ") -> XX XX XX XX ...
+ */
+ { "D", 1, STD_EXT, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "cR", &fbsd_ext_char_info },
+ { "b", 0, STD_EXT, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "", &fbsd_ext_char_info },
+ { "ry", 0, STD_EXT, { T89_I, BADLEN, BADLEN, T89_L, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "i", NULL },
+ { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
+};
+
static const format_char_info asm_fprintf_char_table[] =
{
/* C89 conversion specifiers. */
@@ -959,6 +979,12 @@ static const format_kind_info format_types_orig[] =
strfmon_flag_specs, strfmon_flag_pairs,
FMT_FLAG_ARG_CONVERT, 'w', '#', 'p', 0, 'L', 0,
NULL, NULL
+ },
+ { "printf0", printf_length_specs, print_char_table, " +#0-'I", NULL,
+ printf_flag_specs, printf_flag_pairs,
+ FMT_FLAG_ARG_CONVERT|FMT_FLAG_DOLLAR_MULTIPLE|FMT_FLAG_USE_DOLLAR|FMT_FLAG_EMPTY_PREC_OK|FMT_FLAG_NULL_FORMAT_OK,
+ 'w', 0, 'p', 0, 'L', 0,
+ &integer_type_node, &integer_type_node
}
};
@@ -1572,6 +1598,9 @@ check_format_arg (void *ctx, tree format_tree,
if (integer_zerop (format_tree))
{
+ if (!(format_types[info->format_type].flags & FMT_FLAG_NULL_FORMAT_OK))
+ warning (OPT_Wformat_, "null format string");
+
/* Skip to first argument to check, so we can see if this format
has any arguments (it shouldn't). */
while (arg_num + 1 < info->first_arg_num)
@@ -2401,6 +2430,13 @@ argument_parser::read_any_length_modifier ()
while (fli->name != 0
&& strncmp (fli->name, format_chars, strlen (fli->name)))
fli++;
+
+ /* Make sure FreeBSD's D format char takes preference over new DD
+ length specifier if FreeBSD format extensions are requested. */
+ if (fli->index == FMT_LEN_D && flag_format_extensions
+ && fki->conversion_specs == print_char_table)
+ while (fli->name != 0)
+ fli++;
if (fli->name != 0)
{
format_chars += strlen (fli->name);
@@ -2473,6 +2509,14 @@ argument_parser::find_format_char_info (char format_ch
while (fci->format_chars != 0
&& strchr (fci->format_chars, format_char) == 0)
++fci;
+ if (fci->format_chars == 0 && flag_format_extensions
+ && fki->conversion_specs == print_char_table)
+ {
+ fci = fbsd_print_char_table;
+ while (fci->format_chars != 0
+ && strchr (fci->format_chars, format_char) == 0)
+ ++fci;
+ }
if (fci->format_chars == 0)
{
format_warning_at_char (format_string_loc, format_string_cst,
--- gcc/c-family/c-format.h.orig 2019-01-01 04:31:55.000000000 -0800
+++ gcc/c-family/c-format.h 2019-11-28 17:24:29.601936000 -0800
@@ -75,11 +75,12 @@ enum
FMT_FLAG_DOLLAR_GAP_POINTER_OK = 128,
/* The format arg is an opaque object that will be parsed by an external
facility. */
- FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256
+ FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256,
/* Not included here: details of whether width or precision may occur
(controlled by width_char and precision_char); details of whether
'*' can be used for these (width_type and precision_type); details
of whether length modifiers can occur (length_char_specs). */
+ FMT_FLAG_NULL_FORMAT_OK = 512
};
/* Structure describing a length modifier supported in format checking, and
--- gcc/config/freebsd.opt.orig 2019-01-01 04:31:55.000000000 -0800
+++ gcc/config/freebsd.opt 2019-11-28 17:24:29.602437000 -0800
@@ -34,6 +34,10 @@ Driver Separate
defsym=
Driver JoinedOrMissing
+fformat-extensions
+Common Report Var(flag_format_extensions) Init(0)
+Allow FreeBSD kernel-specific printf format specifiers.
+
posix
Driver
diff --git gcc/config/freebsd.h gcc/config/freebsd.h
index e7ea42370c5..191e7da2071 100644
--- gcc/config/freebsd.h
+++ gcc/config/freebsd.h
@@ -44,6 +44,9 @@ along with GCC; see the file COPYING3. If not see
#undef LIB_SPEC
#define LIB_SPEC FBSD_LIB_SPEC
+#undef STARTFILE_PREFIX_SPEC
+#define STARTFILE_PREFIX_SPEC "/usr/lib/ "
+
#if defined(HAVE_LD_EH_FRAME_HDR)
#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
#endif
diff --git gcc/gcc.c gcc/gcc.c
index f70755679f4..890ef20fd43 100644
--- gcc/gcc.c
+++ gcc/gcc.c
@@ -4298,10 +4298,12 @@ process_command (unsigned int decoded_options_count,
}
set_std_prefix (gcc_exec_prefix, len);
+#if 0
add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
PREFIX_PRIORITY_LAST, 0, 0);
add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
PREFIX_PRIORITY_LAST, 0, 0);
+#endif
}
/* COMPILER_PATH and LIBRARY_PATH have values
@@ -4585,9 +4587,11 @@ process_command (unsigned int decoded_options_count,
add_prefix (&exec_prefixes,
concat (tooldir_prefix, "bin", dir_separator_str, NULL),
"BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
+#if 0
add_prefix (&startfile_prefixes,
concat (tooldir_prefix, "lib", dir_separator_str, NULL),
"BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
+#endif
free (tooldir_prefix);
#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
--- gcc/configure.orig 2019-11-29 16:01:46.850423000 -0800
+++ gcc/configure 2019-11-29 16:05:09.818243000 -0800
@@ -3673,7 +3673,9 @@ if test x${gcc_gxx_include_dir} = x; then
fi
elif test "${with_sysroot+set}" = set; then
gcc_gxx_without_sysroot=`expr "${gcc_gxx_include_dir}" : "${with_sysroot}"'\(.*\)'`
- if test "${gcc_gxx_without_sysroot}"; then
+ if test "${with_sysroot}" = "/"; then
+ gcc_gxx_include_dir_add_sysroot=1
+ elif test "${gcc_gxx_without_sysroot}"; then
gcc_gxx_include_dir="${gcc_gxx_without_sysroot}"
gcc_gxx_include_dir_add_sysroot=1
fi
--- gcc/config.gcc.orig 2019-08-03 13:16:22.000000000 -0700
+++ gcc/config.gcc 2019-11-29 14:01:59.942656000 -0800
@@ -2243,6 +2243,22 @@ riscv*-*-freebsd*)
# automatically detect that GAS supports it, yet we require it.
gcc_cv_initfini_array=yes
;;
+mips*-*-freebsd*) # FreeBSD/mips[64], either endian.
+ tm_file="${tm_file} elfos.h ${fbsd_tm_file} mips/elf.h mips/freebsd.h"
+ target_cpu_default="MASK_ABICALLS|MASK_SOFT_FLOAT_ABI"
+ tm_defines="${tm_defines} MIPS_ISA_DEFAULT=3"
+ case ${target} in
+ mips64*-*-freebsd*)
+ tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_64"
+ ;;
+ mipsn32*-*-freebsd*)
+ tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_N32"
+ ;;
+ mips*-*-freebsd*)
+ tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_32 MIPS_ISA_DEFAULT=3"
+ ;;
+ esac
+ ;;
mips*-*-netbsd*) # NetBSD/mips, either endian.
target_cpu_default="MASK_ABICALLS"
tm_file="elfos.h ${tm_file} mips/elf.h ${nbsd_tm_file} mips/netbsd.h"
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index c1d5553..5d882e3 100644
--- gcc/config/elfos.h
+++ gcc/config/elfos.h
@@ -198,7 +198,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define ASCII_DATA_ASM_OP "\t.ascii\t"
/* Support a read-only data section. */
+#ifndef READONLY_DATA_SECTION_ASM_OP
#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata"
+#endif
/* On svr4, we *do* have support for the .init and .fini sections, and we
can put stuff in there to be executed before and after `main'. We let
@@ -292,6 +294,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define USE_GNU_UNIQUE_OBJECT 0
#endif
+#ifndef ASM_DECLARE_OBJECT_NAME
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
do \
{ \
@@ -320,6 +323,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
ASM_OUTPUT_LABEL (FILE, NAME); \
} \
while (0)
+#endif
/* Output the size directive for a decl in rest_of_decl_compilation
in the case where we did not do so before the initializer.
diff --git a/gcc/config/mips/freebsd.h b/gcc/config/mips/freebsd.h
new file mode 100644
index 0000000..56a921e
--- /dev/null
+++ gcc/config/mips/freebsd.h
@@ -0,0 +1,325 @@
+/* Definitions for MIPS varients running FreeBSD with ELF format
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Continued by David O'Brien <obrien@freebsd.org>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to
+the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
+
+/* $FreeBSD$ */
+
+#undef SUBTARGET_EXTRA_SPECS /* mips.h bogusly defines it. */
+#define SUBTARGET_EXTRA_SPECS \
+ { "fbsd_dynamic_linker", FBSD_DYNAMIC_LINKER}, \
+ { "fbsd_link_spec", FBSD_LINK_SPEC }
+
+/* config/mips/mips.h defines CC1_SPEC,
+ but gives us an "out" with SUBTARGET_CC1_SPEC. */
+#undef SUBTARGET_CC1_SPEC
+#define SUBTARGET_CC1_SPEC "%{profile:-p}"
+
+/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
+ for the special GCC options -static and -shared, which allow us to
+ link things in one of these three modes by applying the appropriate
+ combinations of options at link-time. We like to support here for
+ as many of the other GNU linker options as possible. But I don't
+ have the time to search for those flags. I am sure how to add
+ support for -soname shared_object_name. H.J.
+
+ When the -shared link option is used a final link is not being
+ done. */
+
+#define FBSD_LINK_SPEC "\
+ %{p:%nconsider using `-pg' instead of `-p' with gprof(1) } \
+ %{v:-V} \
+ %{assert*} %{R*} %{rpath*} %{defsym*} \
+ %{shared:-Bshareable %{h*} %{soname*}} \
+ %{!static:--enable-new-dtags} \
+ %{!shared: \
+ %{!static: \
+ %{rdynamic: -export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \
+ %{static:-Bstatic}} \
+ %{symbolic:-Bsymbolic} "
+
+#undef LINK_SPEC
+#define LINK_SPEC "\
+ %{EB} %{EL} %(endian_spec) \
+ %{G*} %{mips1} %{mips2} %{mips3} %{mips4} \
+ %{mips32} %{mips32r2} %{mips64} %{mips64r2} \
+ %{bestGnum} %{call_shared} %{no_archive} %{exact_version} \
+ %{mabi=32:-melf32%{EB:b}%{EL:l}tsmip_fbsd} \
+ %{mabi=n32:-melf32%{EB:b}%{EL:l}tsmipn32_fbsd} \
+ %{mabi=64:-melf64%{EB:b}%{EL:l}tsmip_fbsd} \
+ %{mabi=o64:-melf64%{EB:b}%{EL:l}tsmip_fbsd} \
+ %(fbsd_link_spec)"
+
+#undef LINK_GCC_C_SEQUENCE_SPEC
+#define LINK_GCC_C_SEQUENCE_SPEC \
+ "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+
+/* Reset our STARTFILE_SPEC which was properly set in config/freebsd.h
+ but trashed by config/mips/elf.h. */
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC FBSD_STARTFILE_SPEC
+
+/* Provide an ENDFILE_SPEC appropriate for FreeBSD/mips. */
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC FBSD_ENDFILE_SPEC
+
+/* Reset our LIB_SPEC which was properly set in config/freebsd.h
+ but trashed by config/mips/elf.h. */
+#undef LIB_SPEC
+#define LIB_SPEC FBSD_LIB_SPEC
+
+/* config/mips/mips.h defines CPP_SPEC, and it expects SUBTARGET_CPP_SPEC. */
+#undef SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC FBSD_CPP_SPEC
+
+
+/************************[ Target stuff ]***********************************/
+
+/* Define the actual types of some ANSI-mandated types.
+ Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c,
+ c-common.c, and config/<arch>/<arch>.h. */
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_ABICALLS | MASK_SOFT_FLOAT_ABI)
+
+/* The generic MIPS TARGET_CPU_CPP_BUILTINS are incorrect for FreeBSD.
+ Specifically, they define too many namespace-invasive macros. Override
+ them here. Note this is structured for easy comparison to the version
+ in mips.h. */
+
+#undef TARGET_CPU_CPP_BUILTINS
+#define TARGET_CPU_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("machine=mips"); \
+ builtin_assert ("cpu=mips"); \
+ builtin_define ("__mips__"); \
+ \
+ if (TARGET_64BIT) \
+ builtin_define ("__mips64"); \
+ \
+ if (TARGET_FLOAT64) \
+ builtin_define ("__mips_fpr=64"); \
+ else \
+ builtin_define ("__mips_fpr=32"); \
+ \
+ if (TARGET_MIPS16) \
+ builtin_define ("__mips16"); \
+ \
+ if (mips_abi == ABI_N32) \
+ { \
+ builtin_define ("__mips_n32"); \
+ builtin_define ("_ABIN32=2"); \
+ builtin_define ("_MIPS_SIM=_ABIN32"); \
+ builtin_define ("_MIPS_SZLONG=32"); \
+ builtin_define ("_MIPS_SZPTR=32"); \
+ } \
+ else if (mips_abi == ABI_64) \
+ { \
+ builtin_define ("__mips_n64"); \
+ builtin_define ("_ABI64=3"); \
+ builtin_define ("_MIPS_SIM=_ABI64"); \
+ builtin_define ("_MIPS_SZLONG=64"); \
+ builtin_define ("_MIPS_SZPTR=64"); \
+ } \
+ else if (mips_abi == ABI_O64) \
+ { \
+ builtin_define ("__mips_o64"); \
+ builtin_define ("_ABIO64=4"); \
+ builtin_define ("_MIPS_SIM=_ABIO64"); \
+ builtin_define ("_MIPS_SZLONG=64"); \
+ builtin_define ("_MIPS_SZPTR=64"); \
+ } \
+ else if (mips_abi == ABI_EABI) \
+ { \
+ builtin_define ("__mips_eabi"); \
+ builtin_define ("_ABIEMB=5"); \
+ builtin_define ("_MIPS_SIM=_ABIEMB"); \
+ if (TARGET_LONG64) \
+ builtin_define ("_MIPS_SZLONG=64"); \
+ else \
+ builtin_define ("_MIPS_SZLONG=32"); \
+ if (TARGET_64BIT) \
+ builtin_define ("_MIPS_SZPTR=64"); \
+ else \
+ builtin_define ("_MIPS_SZPTR=32"); \
+ } \
+ else \
+ { \
+ builtin_define ("__mips_o32"); \
+ builtin_define ("_ABIO32=1"); \
+ builtin_define ("_MIPS_SIM=_ABIO32"); \
+ builtin_define ("_MIPS_SZLONG=32"); \
+ builtin_define ("_MIPS_SZPTR=32"); \
+ } \
+ if (TARGET_FLOAT64) \
+ builtin_define ("_MIPS_FPSET=32"); \
+ else \
+ builtin_define ("_MIPS_FPSET=16"); \
+ \
+ builtin_define ("_MIPS_SZINT=32"); \
+ \
+ MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info); \
+ MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info); \
+ \
+ if (ISA_MIPS1) \
+ { \
+ builtin_define ("__mips=1"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS1"); \
+ } \
+ else if (ISA_MIPS2) \
+ { \
+ builtin_define ("__mips=2"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS2"); \
+ } \
+ else if (ISA_MIPS3) \
+ { \
+ builtin_define ("__mips=3"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS3"); \
+ } \
+ else if (ISA_MIPS4) \
+ { \
+ builtin_define ("__mips=4"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS4"); \
+ } \
+ else if (ISA_MIPS32) \
+ { \
+ builtin_define ("__mips=32"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
+ builtin_define ("__mips_isa_rev=1"); \
+ } \
+ else if (ISA_MIPS32R2) \
+ { \
+ builtin_define ("__mips=32"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
+ builtin_define ("__mips_isa_rev=2"); \
+ } \
+ else if (ISA_MIPS64) \
+ { \
+ builtin_define ("__mips=64"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
+ builtin_define ("__mips_isa_rev=1"); \
+ } \
+ else if (ISA_MIPS64R2) \
+ { \
+ builtin_define ("__mips=64"); \
+ builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
+ builtin_define ("__mips_isa_rev=2"); \
+ } \
+ \
+ if (TARGET_HARD_FLOAT) \
+ builtin_define ("__mips_hard_float"); \
+ else if (TARGET_SOFT_FLOAT) \
+ builtin_define ("__mips_soft_float"); \