config.gcc (mips64*-*-linux*): Added.

* config.gcc (mips64*-*-linux*): Added.
* config/mips/linux64.h, config/mips/t-linux64: New file.
* config/mips/iris6.h (MIPS_TFMODE_FORMAT): Define.
* config/mips/mips.c (override_options): Use it.
* config/mips/mips.h (TARGET_SWITCHES): Added...
(SUBTARGET_TARGET_SWITCHES): New, empty by default.
* Makefile.in (SPECS): New.
(STAGESTUFF, specs, mostlyclean, install-common): Use it.
* gcc.c (process_command): Move self-spec processing past spec
file loading.
* doc/tm.texi (DRIVER_SELF_SPECS): Document the change.
* doc/fragments.texi (MULTILIB_EXTRA_OPTS): Document need for
CRTSTUFF_T_CFLAGS.
(SPECS): Document.
* doc/invoke.texi (-mabi-fake-default): Document.

From-SVN: r61481
This commit is contained in:
Alexandre Oliva 2003-01-19 13:04:24 +00:00 committed by Alexandre Oliva
parent e9f13564bb
commit 3bd6d4c458
12 changed files with 262 additions and 21 deletions

View File

@ -1,3 +1,21 @@
2003-01-19 Alexandre Oliva <aoliva@redhat.com>
* config.gcc (mips64*-*-linux*): Added.
* config/mips/linux64.h, config/mips/t-linux64: New file.
* config/mips/iris6.h (MIPS_TFMODE_FORMAT): Define.
* config/mips/mips.c (override_options): Use it.
* config/mips/mips.h (TARGET_SWITCHES): Added...
(SUBTARGET_TARGET_SWITCHES): New, empty by default.
* Makefile.in (SPECS): New.
(STAGESTUFF, specs, mostlyclean, install-common): Use it.
* gcc.c (process_command): Move self-spec processing past spec
file loading.
* doc/tm.texi (DRIVER_SELF_SPECS): Document the change.
* doc/fragments.texi (MULTILIB_EXTRA_OPTS): Document need for
CRTSTUFF_T_CFLAGS.
(SPECS): Document.
* doc/invoke.texi (-mabi-fake-default): Document.
2003-01-19 Stephane Carrez <stcarrez@nerim.fr>
* config/m68hc11/m68hc11.c (stack_push_word, stack_pop_word,

View File

@ -549,6 +549,13 @@ T =
T_TARGET =
T_TARGET : $(T_TARGET)
# This should name the specs file that we're going to install. Target
# Makefiles may override it and name another file to be generated from
# the built-in specs and installed as the default spec, as long as
# they also introduce a rule to generate a file name specs, to be used
# at build time.
SPECS = specs
# End of variables for you to override.
# Definition of `all' is here so that new rules inserted by sed
@ -788,7 +795,7 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
xgcc$(exeext) cpp$(exeext) cc1$(exeext) $(EXTRA_PASSES) \
$(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) cc1obj$(exeext) \
protoize$(exeext) unprotoize$(exeext) \
specs collect2$(exeext) $(USE_COLLECT2) \
$(SPECS) collect2$(exeext) $(USE_COLLECT2) \
gcov-iov$(build_exeext) gcov$(exeext) gcov-dump$(exeext) \
*.[0-9][0-9].* *.[si] libcpp.a libbackend.a libgcc.mk \
$(LANG_STAGESTUFF)
@ -994,9 +1001,9 @@ cpp$(exeext): gcc.o cppspec.o version.o intl.o prefix.o \
prefix.o version.o $(EXTRA_GCC_OBJS) $(LIBS)
# Dump a specs file to make -B./ read these specs over installed ones.
specs: xgcc$(exeext)
$(SPECS): xgcc$(exeext)
$(GCC_FOR_TARGET) -dumpspecs > tmp-specs
mv tmp-specs specs
mv tmp-specs $(SPECS)
# We do want to create an executable named `xgcc', so we can use it to
# compile libgcc2.a.
@ -2668,7 +2675,7 @@ mostlyclean: $(INTL_MOSTLYCLEAN) lang.mostlyclean
# Delete debugging dump files.
-rm -f *.[0-9][0-9].* */*.[0-9][0-9].*
# Delete some files made during installation.
-rm -f specs SYSCALLS.c.X SYSCALLS.c
-rm -f specs $(SPECS) SYSCALLS.c.X SYSCALLS.c
-rm -f collect collect2 mips-tfile mips-tdump
# Delete files generated for fixproto
-rm -rf fix-header$(build_exeext) xsys-protos.h deduced.h tmp-deduced.h \
@ -2841,7 +2848,7 @@ install-common: native $(EXTRA_PARTS) lang.install-common
# Don't mess with specs if it doesn't exist yet.
-if [ -f specs ] ; then \
rm -f $(DESTDIR)$(libsubdir)/specs; \
$(INSTALL_DATA) specs $(DESTDIR)$(libsubdir)/specs; \
$(INSTALL_DATA) $(SPECS) $(DESTDIR)$(libsubdir)/specs; \
chmod a-x $(DESTDIR)$(libsubdir)/specs; \
fi
# Install protoize if it was compiled.

View File

@ -1,5 +1,6 @@
# GCC build-, host- and target-specific configuration file.
# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
#This file is part of GCC.
@ -1802,6 +1803,24 @@ mips*-*-netbsd*) # NetBSD/mips, either endian.
tm_file="elfos.h ${tm_file} mips/netbsd.h"
tmake_file="${tmake_file}"
;;
mips64*-*-linux*)
tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h mips/linux64.h"
tmake_file="t-slibgcc-elf-ver t-linux mips/t-linux mips/t-linux64"
# This default ABI is a partial lie: t-linux64 overrides the
# DRIVER_SELF_SPEC that sets the default abi, in the spec file
# that is installed. What GCC thinks of as the default must
# remain as ABI_32 such that the SONAMEs of the libgcc shared
# libraries remain compatible with those of mips-linux-gnu.
tm_defines="MIPS_ISA_DEFAULT=1 MIPS_ABI_DEFAULT=ABI_32"
target_cpu_default="MASK_ABICALLS|MASK_FLOAT64|MASK_64BIT"
extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
gnu_ld=yes
gas=yes
if test x$enable_threads = xyes; then
thread_file='posix'
fi
;;
mips*-*-linux*) # Linux MIPS, either endian.
tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h"
case $machine in

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. Iris version 6.
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GNU CC.
@ -509,3 +509,5 @@ do { \
%{shared:-hidden_symbol __do_global_ctors,__do_global_ctors_1,__do_global_dtors} \
-_SYSTYPE_SVR4 -woff 131 \
%{mabi=32: -32}%{mabi=n32: -n32}%{mabi=64: -64}%{!mabi*: -n32}"
#define MIPS_TFMODE_FORMAT ibm_extended_format

99
gcc/config/mips/linux64.h Normal file
View File

@ -0,0 +1,99 @@
/* Definitions for MIPS running Linux-based GNU systems with ELF format
using n32/64 abi.
Copyright 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 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, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* This sets the post-install default ABI to n32. This must NOT be
kept in sync with the default ABI in gcc/config.gcc; it's actually
meant to override that. However, for correct behavior at build
time, we also need t-linux64 to get the build-time specs in line
with the setting in config.gcc. */
#define DRIVER_DEFAULT_ABI_SELF_SPEC "%{!mabi=*:-mabi=n32}"
#define SUBTARGET_EXTRA_SPECS \
{ "driver_default_abi_self_spec", DRIVER_DEFAULT_ABI_SELF_SPEC },
#define DRIVER_SELF_SPECS \
"%{mabi-fake-default:%{!mabi=*:-mabi=32}}", \
"%(driver_default_abi_self_spec)", \
"%{!mips*:%{mabi=32:-mips1}%{mabi=n32:-mips3}%{mabi=64:-mips4}}"
#undef SUBTARGET_TARGET_SWITCHES
#define SUBTARGET_TARGET_SWITCHES \
{ "abi-fake-default", 0, N_("Same as -mabi=32, just trickier") },
#undef SUBTARGET_ASM_SPEC
#define SUBTARGET_ASM_SPEC "\
%{!fno-PIC:%{!fno-pic:-KPIC}} \
%{fno-PIC:-non_shared} %{fno-pic:-non_shared} \
%{mabi=64:-64} %{mabi=n32:-n32} \
%{!mips*: %{mabi=n32|mabi=32:-mips3} %{mabi=64:-mips4}}"
#undef LIB_SPEC
#define LIB_SPEC "\
%{!static: \
%{mabi=n32:-rpath-link %R/lib32:%R/usr/lib32} \
%{mabi=64:-rpath-link %R/lib64:%R/usr/lib64} \
%{mabi=32:-rpath-link %R/lib:%R/usr/lib}} \
%{!shared: %{pthread:-lthread} %{profile:-lc_p} %{!profile: -lc}}"
#undef LINK_SPEC
#define LINK_SPEC "\
%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} \
%{bestGnum} %{shared} %{non_shared} \
%{call_shared} %{no_archive} %{exact_version} \
%(endian_spec) \
%{!shared: \
%{!ibcs: \
%{!static: \
%{rdynamic:-export-dynamic} \
%{!dynamic-linker: \
%{mabi=n32: -dynamic-linker /lib32/ld.so.1} \
%{mabi=64: -dynamic-linker /lib64/ld.so.1} \
%{mabi=32: -dynamic-linker /lib/ld.so.1}}} \
%{static:-static}}} \
%{mabi=n32: -melf32btsmipn32} \
%{mabi=64: -melf64btsmip} \
%{mabi=32: -melf32btsmip}"
#undef STARTFILE_PREFIX_SPEC
#define STARTFILE_PREFIX_SPEC "\
%{mabi=n32: /lib32/ /usr/lib32/} \
%{mabi=64: /lib64/ /usr/lib64/} \
%{mabi=32: /lib/ /usr/lib/}"
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX ((mips_abi == ABI_32 || mips_abi == ABI_O64) \
? "$" : ".")
/* The size in bytes of a DWARF field indicating an offset or length
relative to a debug info section, specified to be 4 bytes in the DWARF-2
specification. The SGI/MIPS ABI defines it to be the same as PTR_SIZE. */
#define DWARF_OFFSET_SIZE PTR_SIZE
#undef ASM_PREFERRED_EH_DATA_FORMAT
#if 0 /* We can't use relative addressing modes on NEWABI :-( */
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
(flag_pic \
? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_sdata4 \
: DW_EH_PE_absptr)
#endif
/* GNU/Linux doesn't use the same floating-point format that IRIX uses
for long double. There's no need to override this here, since
ieee_quad_format is the default, but let's put this here to make
sure nobody thinks we just forgot to set it to something else. */
#define MIPS_TFMODE_FORMAT ieee_quad_format

View File

@ -5359,6 +5359,10 @@ override_options ()
else
mips16 = 0;
#ifdef MIPS_TFMODE_FORMAT
real_format_for_mode[TFmode - QFmode] = &MIPS_TFMODE_FORMAT;
#endif
mips_print_operand_punct['?'] = 1;
mips_print_operand_punct['#'] = 1;
mips_print_operand_punct['&'] = 1;

View File

@ -534,6 +534,7 @@ extern void sbss_section PARAMS ((void));
#define TARGET_SWITCHES \
{ \
SUBTARGET_TARGET_SWITCHES \
{"no-crt0", 0, \
N_("No default crt0.o") }, \
{"int64", MASK_INT64 | MASK_LONG64, \
@ -993,6 +994,7 @@ extern void sbss_section PARAMS ((void));
#define GAS_ASM_SPEC "%{mtune=*} %{v}"
#define SUBTARGET_TARGET_SWITCHES
extern int mips_abi;

41
gcc/config/mips/t-linux64 Normal file
View File

@ -0,0 +1,41 @@
MULTILIB_OPTIONS = mabi=32/mabi=n32/mabi=64
MULTILIB_DIRNAMES = o32 32 64
MULTILIB_OSDIRNAMES = ../lib ../lib32 ../lib64
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
LIB2FUNCS_EXTRA = $(srcdir)/config/mips/_tilib.c
TPBIT = tp-bit.c
tp-bit.c: $(srcdir)/config/fp-bit.c
echo '#ifdef __MIPSEL__' > tp-bit.c
echo '# define FLOAT_BIT_ORDER_MISMATCH' >> tp-bit.c
echo '#endif' >> tp-bit.c
echo '#if __LDBL_MANT_DIG__ == 113' >> tp-bit.c
echo '# define TFLOAT' >> tp-bit.c
cat $(srcdir)/config/fp-bit.c >> tp-bit.c
echo '#endif' >> tp-bit.c
# This arranges for us to extract the built-in specs of the compiler
# into specs.install. It's this file that we're going to install as
# specs. Howver, at toolchain build time, we must use specs that
# enforce the defaults that the compiler expects, namely, the o32 ABI,
# instead of n32, that we want to use as the default post install.
SPECS = specs.install
specs: specs.install
# Changing the build-time default ABI from n32 to o32
# The post-install default ABI will remain n32
@if test "x`grep '!mabi=\*:-mabi=n32' specs.install`" = \
"x%{!mabi=*:-mabi=n32}"; then \
sed 's,\(!mabi=\*:-mabi\)=n32,\1=32,' < specs.install > $@ ; \
else \
echo failed, gcc/config/mips/t-linux64 needs updating >&2; \
false; \
fi
# This arranges for anyone who uses gcc -print-multi-lib post
# installation to get lists of options for each multilib to get
# options that actually work.
MULTILIB_EXTRA_OPTS = mabi-fake-default
CRTSTUFF_T_CFLAGS = -mabi-fake-default

View File

@ -1,5 +1,5 @@
@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
@c 1999, 2000, 2001 Free Software Foundation, Inc.
@c 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@ -147,7 +147,24 @@ at the same time. Therefore @code{MULTILIB_EXCEPTIONS} is set to
Sometimes it is desirable that when building multiple versions of
@file{libgcc.a} certain options should always be passed on to the
compiler. In that case, set @code{MULTILIB_EXTRA_OPTS} to be the list
of options to be used for all builds.
of options to be used for all builds. If you set this, you should
probably set @code{CRTSTUFF_T_CFLAGS} to a dash followed by it.
@findex SPECS
@item SPECS
Unfortunately, setting @code{MULTILIB_EXTRA_OPTS} is not enough, since
it does not affect the build of target libraries, at least not the
build of the default multilib. One possible work-around is to use
@code{DRIVER_SELF_SPECS} to bring options from the @file{specs} file
as if they had been passed in the compiler driver command line.
However, you don't want to be adding these options after the toolchain
is installed, so you can instead tweak the @file{specs} file that will
be used during the toolchain build, while you still install the
original, built-in @file{specs}. The trick is to set @code{SPECS} to
some other filename (say @file{specs.install}), that will then be
created out of the built-in specs, and introduce a @file{Makefile}
rule to generate the @file{specs} file that's going to be used at
build time out of your @file{specs.install}.
@end table
@node Host Fragment

View File

@ -491,7 +491,7 @@ in the following sections.
-mrnames -msoft-float @gol
-m4650 -msingle-float -mmad @gol
-mstats -EL -EB -G @var{num} -nocpp @gol
-mabi=32 -mabi=n32 -mabi=64 -mabi=eabi @gol
-mabi=32 -mabi=n32 -mabi=64 -mabi=eabi -mabi-fake-default @gol
-mfix7000 -mno-crt0 -mflush-func=@var{func} -mno-flush-func @gol
-mbranch-likely -mno-branch-likely}
@ -7465,6 +7465,37 @@ selects the one defined by MIPS@. Both these ABIs have
64-bit code when you select a 64-bit architecture, but you
can use @option{-mgp32} to get 32-bit code instead.
@item -mabi-fake-default
@opindex mabi-fake-default
You don't want to know what this option does. No, really. I mean
it. Move on to the next option.
What? You're still here? Oh, well@enddots{} Ok, here's the deal. GCC
wants the default set of options to get the root of the multilib tree,
and the shared library SONAMEs without any multilib-indicating
suffixes. This is not convenience for @samp{mips64-linux-gnu}, since
we want to default to the N32 ABI, while still being binary-compatible
with @samp{mips-linux-gnu} if you stick to the O32 ABI@. Being
binary-compatible means shared libraries should have the same SONAMEs,
and libraries should live in the same location. Having O32 libraries
in a sub-directory named say @file{o32} is not acceptable.
So we trick GCC into believing that O32 is the default ABI, except
that we override the default with some internal command-line
processing magic. Problem is, if we stopped at that, and you then
created a multilib-aware package that used the output of @command{gcc
-print-multi-lib} to decide which multilibs to build, and how, and
you'd find yourself in an awkward situation when you found out that
some of the options listed ended up mapping to the same multilib, and
none of your libraries was actually built for the multilib that
@option{-print-multi-lib} claims to be the default. So we added this
option that disables the default switcher, falling back to GCC's
original notion of the default library. Confused yet?
For short: don't ever use this option, unless you find it in the list
of additional options to be used when building for multilibs, in the
output of @option{gcc -print-multi-lib}.
@item -mmips-as
@opindex mmips-as
Generate code for the MIPS assembler, and invoke @file{mips-tfile} to

View File

@ -168,11 +168,12 @@ multilibs. Example nonsensical definition, where @code{-malt-abi},
A list of specs for the driver itself. It should be a suitable
initializer for an array of strings, with no surrounding braces.
The driver applies these specs to its own command line before choosing
the multilib directory or running any subcommands. It applies them in
the order given, so each spec can depend on the options added by
earlier ones. It is also possible to remove options using
@samp{%<@var{option}} in the usual way.
The driver applies these specs to its own command line between loading
default @file{specs} files (but not command-line specified ones) and
choosing the multilib directory or running any subcommands. It
applies them in the order given, so each spec can depend on the
options added by earlier ones. It is also possible to remove options
using @samp{%<@var{option}} in the usual way.
This macro can be useful when a port has several interdependent target
options. It provides a way of standardizing the command line so

View File

@ -6198,12 +6198,6 @@ main (argc, argv)
process_command (argc, argv);
/* Process DRIVER_SELF_SPECS, adding any new options to the end
of the command line. */
for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
do_self_spec (driver_self_specs[i]);
/* Initialize the vector of specs to just the default.
This means one element containing 0s, as a terminator. */
@ -6237,6 +6231,12 @@ main (argc, argv)
if (access (specs_file, R_OK) == 0)
read_specs (specs_file, TRUE);
/* Process DRIVER_SELF_SPECS, adding any new options to the end
of the command line. */
for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
do_self_spec (driver_self_specs[i]);
/* If not cross-compiling, look for executables in the standard
places. */
if (*cross_compile == '0')