Commit be5854d6 authored by jhb's avatar jhb
Browse files

Add freebsd-gcc6 port.

This port is basically identical to the existing <arch>-gcc ports
that use GCC6.  However, it uses flavors for the different
architectures instead of slave ports.  It also includes the external
toolchain makefile and thus subsumes the <arch>-xtoolchain-gcc
port into the new packages.

This should permit us to have ports for different major versions of
GCC (e.g. a freebsd-gcc9 port).

aarch64-gcc6 disables LTO support to work with aaarch64-binutils
which builds a static ld.bfd binary by default which is unable to work
with LTO.

Reviewed by:	imp, brooks
Approved by:	portmgr (swills)
Differential Revision:	https://reviews.freebsd.org/D22147
parent a6758386
......@@ -703,6 +703,7 @@
SUBDIR += fpc-zlib
SUBDIR += fpp
SUBDIR += frama-c
SUBDIR += freebsd-gcc6
SUBDIR += frink
SUBDIR += fsmtrie
SUBDIR += fstrcmp
......
# $FreeBSD$
PORTNAME= gcc
PORTVERSION= 6.4.0
CATEGORIES= devel
MASTER_SITES= GCC/releases/gcc-${DISTVERSION}
PKGNAMEPREFIX= ${TARGETARCH}-
PKGNAMESUFFIX= ${SUFFIX}
MAINTAINER= ports@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 powerpc64 sparc64
TARGETARCH= ${FLAVOR}
CONFLICTS= ${TARGETARCH}-gcc
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}
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} == "aarch64"
PLIST_SUB+= ARM=""
PLIST_SUB+= AARCH64=""
.else
PLIST_SUB+= ARM="@comment "
PLIST_SUB+= AARCH64="@comment "
.endif
.if ${TARGETARCH} == "amd64" || ${TARGETARCH} == "i386"
PLIST_SUB+= I386="" \
FLOAT_H="@comment "
.else
PLIST_SUB+= I386="@comment " \
FLOAT_H=""
.endif
.if ${TARGETARCH} == "amd64"
PLIST_SUB+= AMD64=""
.else
PLIST_SUB+= AMD64="@comment "
.endif
.if ${TARGETARCH:Mmips*}
PLIST_SUB+= MIPS=""
.else
PLIST_SUB+= MIPS="@comment "
.endif
.if ${TARGETARCH:Mpowerpc*}
PLIST_SUB+= POWERPC=""
.else
PLIST_SUB+= POWERPC="@comment "
.endif
.if ${TARGETARCH} == "sparc64"
PLIST_SUB+= SPARC64=""
.else
PLIST_SUB+= SPARC64="@comment "
.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 = 1514072608
SHA256 (gcc-6.4.0.tar.xz) = 850bf21eafdfe5cd5f6827148184c08c4a0852a37ccf36ce69855334d2c914d4
SIZE (gcc-6.4.0.tar.xz) = 76156220
Index: gcc/c-family/c-format.c
===================================================================
--- gcc/c-family/c-format.c (revision 216017)
+++ gcc/c-family/c-format.c (working copy)
@@ -622,6 +622,26 @@
{ 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. */
@@ -872,6 +892,12 @@
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
}
};
@@ -1426,6 +1452,9 @@
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)
@@ -1926,6 +1955,14 @@
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);
@@ -1993,6 +2030,14 @@
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)
{
if (ISGRAPH (format_char))
Index: gcc/c-family/c-format.h
===================================================================
--- gcc/c-family/c-format.h (revision 216017)
+++ gcc/c-family/c-format.h (working copy)
@@ -75,11 +75,12 @@
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
Index: gcc/config/freebsd.opt
===================================================================
--- gcc/config/freebsd.opt (revision 216017)
+++ gcc/config/freebsd.opt (working copy)
@@ -34,6 +34,10 @@
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)
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 90d4f71..5a05e22 100644
--- gcc/config.gcc
+++ gcc/config.gcc
@@ -1949,6 +1949,26 @@ microblaze*-*-elf)
cxx_target_objs="${cxx_target_objs} microblaze-c.o"
tmake_file="${tmake_file} microblaze/t-microblaze"
;;
+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"
+ 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
+ case ${target} in
+ mips*el-*-freebsd*)
+ tm_defines="${tm_defines} TARGET_ENDIAN_DEFAULT=0";
+ ;;
+ esac
+ ;;
mips*-*-netbsd*) # NetBSD/mips, either endian.
target_cpu_default="MASK_ABICALLS"
tm_file="elfos.h ${tm_file} mips/elf.h netbsd.h netbsd-elf.h 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"); \
+ \
+ if (TARGET_SINGLE_FLOAT) \
+ builtin_define ("__mips_single_float"); \
+ \