diff options
Diffstat (limited to 'gcc/config')
35 files changed, 420 insertions, 611 deletions
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 21db01c8ec5..5426a6414ec 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -96,12 +96,6 @@ along with GCC; see the file COPYING3. If not see while (0) #endif -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - -#define WORD_SWITCH_TAKES_ARG(STR) \ - (!strcmp (STR, "rpath") || DEFAULT_WORD_SWITCH_TAKES_ARG(STR)) - /* Print subsidiary information on the compiler version in use. */ #define TARGET_VERSION diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index 776c44e2c81..a7b7e4d1e62 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -96,14 +96,6 @@ extern int cris_cpu_version; /* Node: Driver */ -/* When using make with defaults.mak for Sun this will handily remove - any "-target sun*" switches. */ -/* We need to override any previous definitions (linux.h) */ -#undef WORD_SWITCH_TAKES_ARG -#define WORD_SWITCH_TAKES_ARG(STR) \ - (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ - || !strcmp (STR, "target")) - /* Also provide canonical vN definitions when user specifies an alias. Note that -melf overrides -maout. */ @@ -168,12 +160,10 @@ extern int cris_cpu_version; " -D__CRIS_arch_tune=" CRIS_DEFAULT_TUNE "}}}}}"\ CRIS_ARCH_CPP_DEFAULT -/* Remove those Sun-make "target" switches. */ /* Override previous definitions (linux.h). */ #undef CC1_SPEC #define CC1_SPEC \ - "%{target*:}\ - %{metrax4:-march=v3}\ + "%{metrax4:-march=v3}\ %{metrax100:-march=v8}\ %(cc1_subtarget)" diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index f6b88f97c98..c488db22103 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -198,45 +198,13 @@ extern GTY(()) int darwin_ms_struct; #undef WORD_SWITCH_TAKES_ARG #define WORD_SWITCH_TAKES_ARG(STR) \ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \ - !strcmp (STR, "Zallowable_client") ? 1 : \ - !strcmp (STR, "arch") ? 1 : \ - !strcmp (STR, "arch_only") ? 1 : \ - !strcmp (STR, "Zbundle_loader") ? 1 : \ - !strcmp (STR, "client_name") ? 1 : \ - !strcmp (STR, "compatibility_version") ? 1 : \ - !strcmp (STR, "current_version") ? 1 : \ - !strcmp (STR, "Zdylib_file") ? 1 : \ - !strcmp (STR, "Zexported_symbols_list") ? 1 : \ - !strcmp (STR, "Zimage_base") ? 1 : \ - !strcmp (STR, "Zinit") ? 1 : \ - !strcmp (STR, "Zinstall_name") ? 1 : \ - !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \ - !strcmp (STR, "Zmultiply_defined") ? 1 : \ - !strcmp (STR, "precomp-trustfile") ? 1 : \ - !strcmp (STR, "read_only_relocs") ? 1 : \ !strcmp (STR, "sectcreate") ? 3 : \ !strcmp (STR, "sectorder") ? 3 : \ !strcmp (STR, "Zsegaddr") ? 2 : \ - !strcmp (STR, "Zsegs_read_only_addr") ? 1 : \ - !strcmp (STR, "Zsegs_read_write_addr") ? 1 : \ - !strcmp (STR, "Zseg_addr_table") ? 1 : \ - !strcmp (STR, "Zfn_seg_addr_table_filename") ? 1 :\ - !strcmp (STR, "seg1addr") ? 1 : \ !strcmp (STR, "segprot") ? 3 : \ - !strcmp (STR, "sub_library") ? 1 : \ - !strcmp (STR, "sub_umbrella") ? 1 : \ - !strcmp (STR, "Zumbrella") ? 1 : \ - !strcmp (STR, "undefined") ? 1 : \ - !strcmp (STR, "Zunexported_symbols_list") ? 1 : \ - !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \ - !strcmp (STR, "pagezero_size") ? 1 : \ - !strcmp (STR, "segs_read_only_addr") ? 1 : \ - !strcmp (STR, "segs_read_write_addr") ? 1 : \ !strcmp (STR, "sectalign") ? 3 : \ !strcmp (STR, "sectobjectsymbols") ? 2 : \ !strcmp (STR, "segcreate") ? 3 : \ - !strcmp (STR, "dylinker_install_name") ? 1 : \ - !strcmp (STR, "iframework") ? 1 : \ 0) #define SUBTARGET_C_COMMON_OVERRIDE_OPTIONS do { \ @@ -271,7 +239,7 @@ extern GTY(()) int darwin_ms_struct; #define LINK_COMMAND_SPEC_A \ "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker) %l %X %{d} %{s} %{t} %{Z} %{u*} \ - %{A} %{e*} %{m} %{r} %{x} \ + %{A} %{e*} %{m} %{r} \ %{o*}%{!o:-o a.out} \ %{!A:%{!nostdlib:%{!nostartfiles:%S}}} \ %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \ diff --git a/gcc/config/darwin.opt b/gcc/config/darwin.opt index afb122849f4..4435fea0987 100644 --- a/gcc/config/darwin.opt +++ b/gcc/config/darwin.opt @@ -1,6 +1,6 @@ ; Processor-independent options for Darwin. -; Copyright (C) 2005, 2007 Free Software Foundation, Inc. +; Copyright (C) 2005, 2007, 2010 Free Software Foundation, Inc. ; ; This file is part of GCC. ; @@ -54,5 +54,86 @@ iframework Target RejectNegative C ObjC C++ ObjC++ Joined Separate -iframework <dir> Add <dir> to the end of the system framework include path +Zallowable_client +Driver Separate + +Zbundle_loader +Driver Separate + +Zdylib_file +Driver Separate + +Zexported_symbols_list +Driver Separate + +Zfn_seg_addr_table_filename +Driver Separate + +Zimage_base +Driver Separate + +Zinit +Driver Separate + +Zinstall_name +Driver Separate + +Zmultiply_defined +Driver Separate + +Zmultiplydefinedunused +Driver Separate + +Zseg_addr_table +Driver Separate + +Zsegs_read_only_addr +Driver Separate + +Zsegs_read_write_addr +Driver Separate + +Zumbrella +Driver Separate + +Zunexported_symbols_list +Driver Separate + +Zweak_reference_mismatches +Driver Separate + +client_name +Driver Separate + +compatibility_version +Driver Separate + +current_version +Driver Separate + +dylinker_install_name +Driver Separate + +pagezero_size +Driver Separate + +read_only_relocs +Driver Separate + +seg1addr +Driver Separate + +segs_read_only_addr +Driver Separate + +segs_read_write_addr +Driver Separate + +sub_library +Driver Separate + +sub_umbrella +Driver Separate + undefined Driver Separate diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h index 0ea72fd8c7c..ac42145f314 100644 --- a/gcc/config/fr30/fr30.h +++ b/gcc/config/fr30/fr30.h @@ -22,15 +22,6 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ /*}}}*/ -/*{{{ Driver configuration. */ - -/* Defined in svr4.h. */ -#undef SWITCH_TAKES_ARG - -/* Defined in svr4.h. */ -#undef WORD_SWITCH_TAKES_ARG - -/*}}}*/ /*{{{ Run-time target specifications. */ #undef ASM_SPEC diff --git a/gcc/config/freebsd-spec.h b/gcc/config/freebsd-spec.h index 84d81278af8..00b7407b1f4 100644 --- a/gcc/config/freebsd-spec.h +++ b/gcc/config/freebsd-spec.h @@ -1,5 +1,6 @@ /* Base configuration file for all FreeBSD targets. - Copyright (C) 1999, 2000, 2001, 2004, 2005, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2004, 2005, 2007, 2009, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -33,25 +34,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* In case we need to know. */ #define USING_CONFIG_FREEBSD_SPEC 1 -/* This defines which switch letters take arguments. On FreeBSD, most of - the normal cases (defined in gcc.c) apply, and we also have -h* and - -z* options (for the linker) (coming from SVR4). - We also have -R (alias --rpath), no -z, --soname (-h), --assert etc. */ - -#define FBSD_SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'h' \ - || (CHAR) == 'z' /* ignored by ld */ \ - || (CHAR) == 'R') - -/* This defines which multi-letter switches take arguments. */ - -#define FBSD_WORD_SWITCH_TAKES_ARG(STR) \ - (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ - || !strcmp ((STR), "rpath") || !strcmp ((STR), "rpath-link") \ - || !strcmp ((STR), "soname") || !strcmp ((STR), "defsym") \ - || !strcmp ((STR), "assert") || !strcmp ((STR), "dynamic-linker")) - #define FBSD_TARGET_OS_CPP_BUILTINS() \ do \ { \ diff --git a/gcc/config/freebsd.h b/gcc/config/freebsd.h index 591ce1a6667..1a7dac9630d 100644 --- a/gcc/config/freebsd.h +++ b/gcc/config/freebsd.h @@ -30,17 +30,6 @@ along with GCC; see the file COPYING3. If not see /* In case we need to know. */ #define USING_CONFIG_FREEBSD 1 -/* This defines which switch letters take arguments. On FreeBSD, most of - the normal cases (defined in gcc.c) apply, and we also have -h* and - -z* options (for the linker) (coming from SVR4). - We also have -R (alias --rpath), no -z, --soname (-h), --assert etc. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) (FBSD_SWITCH_TAKES_ARG(CHAR)) - -#undef WORD_SWITCH_TAKES_ARG -#define WORD_SWITCH_TAKES_ARG(STR) (FBSD_WORD_SWITCH_TAKES_ARG(STR)) - #undef TARGET_OS_CPP_BUILTINS #define TARGET_OS_CPP_BUILTINS() FBSD_TARGET_OS_CPP_BUILTINS() diff --git a/gcc/config/freebsd.opt b/gcc/config/freebsd.opt new file mode 100644 index 00000000000..26dc9dfdaa5 --- /dev/null +++ b/gcc/config/freebsd.opt @@ -0,0 +1,38 @@ +; FreeBSD options. + +; Copyright (C) 2010 +; 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 3, or (at your option) any later +; version. +; +; GCC is distributed in the hope that it will be useful, but WITHOUT ANY +; WARRANTY; without even the implied warranty of MERCHANTABILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +; for more details. +; +; You should have received a copy of the GNU General Public License +; along with GCC; see the file COPYING3. If not see +; <http://www.gnu.org/licenses/>. + +; See the GCC internals manual (options.texi) for a description of this file's format. + +; Please try to keep this file in ASCII collating order. + +assert +Driver Separate + +defsym +Driver Separate + +rpath-link +Driver Separate + +soname +Driver Separate + +; This comment is to ensure we retain the blank line above. diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h index fc0f2930dc3..8a2907d682c 100644 --- a/gcc/config/frv/frv.h +++ b/gcc/config/frv/frv.h @@ -35,33 +35,6 @@ /* Driver configuration. */ -/* A C expression which determines whether the option `-CHAR' takes arguments. - The value should be the number of arguments that option takes-zero, for many - options. - - By default, this macro is defined to handle the standard options properly. - You need not define it unless you wish to add additional options which take - arguments. - - Defined in svr4.h. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - -/* A C expression which determines whether the option `-NAME' takes arguments. - The value should be the number of arguments that option takes-zero, for many - options. This macro rather than `SWITCH_TAKES_ARG' is used for - multi-character option names. - - By default, this macro is defined as `DEFAULT_WORD_SWITCH_TAKES_ARG', which - handles the standard options properly. You need not define - `WORD_SWITCH_TAKES_ARG' unless you wish to add additional options which take - arguments. Any redefinition should call `DEFAULT_WORD_SWITCH_TAKES_ARG' and - then check for additional options. - - Defined in svr4.h. */ -#undef WORD_SWITCH_TAKES_ARG - /* -fpic and -fPIC used to imply the -mlibrary-pic multilib, but with FDPIC which multilib to use depends on whether FDPIC is in use or not. The trick we use is to introduce -multilib-library-pic as a diff --git a/gcc/config/i386/djgpp.h b/gcc/config/i386/djgpp.h index e95ee49365b..2a8cef6842b 100644 --- a/gcc/config/i386/djgpp.h +++ b/gcc/config/i386/djgpp.h @@ -102,7 +102,7 @@ along with GCC; see the file COPYING3. If not see #define LINK_COMMAND_SPEC \ "%{!fsyntax-only: \ %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \ -\t%{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\ +\t%{r} %{s} %{t} %{u*} %{z} %{Z}\ \t%{!A:%{!nostdlib:%{!nostartfiles:%S}}}\ \t%{static:} %{L*} %D %o\ \t%{!nostdlib:%{!nodefaultlibs:%G %L %G}}\ diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index fbee1e719b6..fdac455c6df 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -53,9 +53,6 @@ do { \ #define ASM_EXTRA_SPEC "" -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - /* Variables which are this size or smaller are put in the sdata/sbss sections. */ extern unsigned int ia64_section_threshold; diff --git a/gcc/config/interix.h b/gcc/config/interix.h index b94f35726de..658c534277a 100644 --- a/gcc/config/interix.h +++ b/gcc/config/interix.h @@ -1,6 +1,6 @@ /* Operating system specific defines to be used when targeting GCC for Interix - Copyright (C) 1994, 1995, 1999, 2002, 2004, 2007 + Copyright (C) 1994, 1995, 1999, 2002, 2004, 2007, 2010 Free Software Foundation, Inc. Donn Terry, Softway Systems, Inc. (donn@softway.com) Modified from code @@ -58,13 +58,6 @@ for windows/multi thread */ #define STARTFILE_SPEC \ "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}} %{shared:crti%O%s}" -#undef WORD_SWITCH_TAKES_ARG -#define WORD_SWITCH_TAKES_ARG(STR) \ - ((DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ - || !strcmp(STR, "rpath")) \ - && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \ - && strcmp (STR, "Tbss")) - #define STDC_0_IN_SYSTEM_HEADERS 1 diff --git a/gcc/config/lm32/lm32.h b/gcc/config/lm32/lm32.h index bcea41aa3a1..c87c3bb705a 100644 --- a/gcc/config/lm32/lm32.h +++ b/gcc/config/lm32/lm32.h @@ -68,12 +68,6 @@ #undef LIB_SPEC #define LIB_SPEC "%{!T*:-T sim.ld}" -/* Add -G xx support. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ -(DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - #undef CC1_SPEC #define CC1_SPEC "%{G*}" diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index a645518cbc1..785d85b5ea5 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -22,8 +22,6 @@ - longlong.h? */ -#undef SWITCH_TAKES_ARG -#undef WORD_SWITCH_TAKES_ARG #undef HANDLE_SYSV_PRAGMA #undef SIZE_TYPE #undef PTRDIFF_TYPE @@ -94,12 +92,6 @@ #define TARGET_VERSION fprintf (stderr, " (m32r)") #endif -/* Switch Recognition by gcc.c. Add -G xx support. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ -(DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - /* Names to predefine in the preprocessor for this target machine. */ /* __M32R__ is defined by the existing compiler so we use that. */ #define TARGET_CPU_CPP_BUILTINS() \ diff --git a/gcc/config/microblaze/microblaze.h b/gcc/config/microblaze/microblaze.h index 0145cb35952..2ce22f1e030 100644 --- a/gcc/config/microblaze/microblaze.h +++ b/gcc/config/microblaze/microblaze.h @@ -57,10 +57,6 @@ extern enum pipeline_type microblaze_pipe; /* Macros to decide whether certain features are available or not, depending on the instruction set architecture level. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - #define DRIVER_SELF_SPECS \ "%{mxl-soft-mul:%<mno-xl-soft-mul}", \ "%{mno-xl-barrel-shift:%<mxl-barrel-shift}", \ diff --git a/gcc/config/mips/iris6.h b/gcc/config/mips/iris6.h index 6fa8ffc0616..dd8eb1158af 100644 --- a/gcc/config/mips/iris6.h +++ b/gcc/config/mips/iris6.h @@ -146,10 +146,6 @@ along with GCC; see the file COPYING3. If not see #undef DEFAULT_SIGNED_CHAR #define DEFAULT_SIGNED_CHAR 0 -#define WORD_SWITCH_TAKES_ARG(STR) \ - (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ - || strcmp (STR, "rpath") == 0) - #define TARGET_OS_CPP_BUILTINS() \ do \ { \ diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index d6d909b7756..a3675039462 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -1075,12 +1075,6 @@ enum mips_code_readable_setting { /* The CACHE instruction is available. */ #define ISA_HAS_CACHE (TARGET_CACHE_BUILTIN && !TARGET_MIPS16) -/* Add -G xx support. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - #define CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage () /* Tell collect what flags to pass to nm. */ diff --git a/gcc/config/mips/netbsd.h b/gcc/config/mips/netbsd.h index 636e3ade6cc..ff328580181 100644 --- a/gcc/config/mips/netbsd.h +++ b/gcc/config/mips/netbsd.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for MIPS NetBSD systems. Copyright (C) 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, - 2007 Free Software Foundation, Inc. + 2007, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -170,16 +170,6 @@ along with GCC; see the file COPYING3. If not see #define MIPS_DEFAULT_GVALUE 0 -/* This defines which switch letters take arguments. -G is a MIPS - special. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'R' \ - || (CHAR) == 'G') - - #undef ASM_FINAL_SPEC #undef SET_ASM_OP diff --git a/gcc/config/mips/vxworks.h b/gcc/config/mips/vxworks.h index f77d62b2be5..3c2d94fe104 100644 --- a/gcc/config/mips/vxworks.h +++ b/gcc/config/mips/vxworks.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1999, 2003, 2004, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2003, 2004, 2007, 2008, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -19,15 +20,6 @@ along with GCC; see the file COPYING3. If not see #undef TARGET_VERSION #define TARGET_VERSION fprintf (stderr, " (MIPS, VxWorks syntax)"); -/* Combination of mips.h and svr4.h. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'G' \ - || (CHAR) == 'h' \ - || (CHAR) == 'x' \ - || (CHAR) == 'z') - #undef ASM_SPEC #define ASM_SPEC "\ %{!G:-G 0} %{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} \ diff --git a/gcc/config/netbsd-aout.h b/gcc/config/netbsd-aout.h index 914212b877f..bf2bb9e5ddb 100644 --- a/gcc/config/netbsd-aout.h +++ b/gcc/config/netbsd-aout.h @@ -1,5 +1,5 @@ /* Common configuration file for NetBSD a.out targets. - Copyright (C) 2002, 2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2007, 2010 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. This file is part of GCC. @@ -26,13 +26,6 @@ along with GCC; see the file COPYING3. If not see } \ while (0) -/* This defines which switch letters take arguments. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG(CHAR) \ - || (CHAR) == 'R') - /* Provide an ASM_SPEC appropriate for NetBSD. Currently we only deal with the options for generating PIC code. */ diff --git a/gcc/config/netbsd-elf.h b/gcc/config/netbsd-elf.h index 37f504b8435..f98cbe87bc9 100644 --- a/gcc/config/netbsd-elf.h +++ b/gcc/config/netbsd-elf.h @@ -1,5 +1,5 @@ /* Common configuration file for NetBSD ELF targets. - Copyright (C) 2002, 2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2007, 2010 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. This file is part of GCC. @@ -26,18 +26,6 @@ along with GCC; see the file COPYING3. If not see } \ while (0) -/* This defines which switch letters take arguments. On NetBSD, most - of the normal cases (defined by gcc.c) apply, and we also have -h* - and -z* options (for the linker) (coming from SVR4). */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'h' \ - || (CHAR) == 'z' \ - || (CHAR) == 'R') - - /* Provide a STARTFILE_SPEC appropriate for NetBSD ELF. Here we provide support for the special GCC option -static. On ELF targets, we also add the crtbegin.o file, which provides part diff --git a/gcc/config/openbsd.h b/gcc/config/openbsd.h index 30e1c252c5a..d15dff15f98 100644 --- a/gcc/config/openbsd.h +++ b/gcc/config/openbsd.h @@ -1,5 +1,6 @@ /* Base configuration file for all OpenBSD targets. - Copyright (C) 1999, 2000, 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2004, 2005, 2007, 2009, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -118,13 +119,6 @@ while (0) #ifndef OBSD_HAS_CORRECT_SPECS -#ifndef OBSD_NO_DYNAMIC_LIBRARIES -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'R') -#endif - #undef CPP_SPEC #define CPP_SPEC OBSD_CPP_SPEC diff --git a/gcc/config/pdp11/pdp11.c b/gcc/config/pdp11/pdp11.c index 946d7ed973b..5b5ebebe0e5 100644 --- a/gcc/config/pdp11/pdp11.c +++ b/gcc/config/pdp11/pdp11.c @@ -1816,14 +1816,12 @@ output_addr_const_pdp11 (FILE *file, rtx x) static bool pdp11_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED) { - /* Should probably return DImode and DFmode in memory, lest - we fill up all regs! - - have to, else we crash - exception: maybe return result in - ac0 if DFmode and FPU present - compatibility problem with - libraries for non-floating point.... */ + /* Integers 32 bits and under, and scalar floats (if FPU), are returned + in registers. The rest go into memory. */ return (TYPE_MODE (type) == DImode - || (FLOAT_MODE_P (TYPE_MODE (type)) && ! TARGET_AC0)); + || (FLOAT_MODE_P (TYPE_MODE (type)) && ! TARGET_AC0) + || TREE_CODE (type) == VECTOR_TYPE + || COMPLEX_MODE_P (TYPE_MODE (type))); } /* Worker function for TARGET_FUNCTION_VALUE. diff --git a/gcc/config/pdp11/pdp11.md b/gcc/config/pdp11/pdp11.md index 2f73390a501..27893a6a8f2 100644 --- a/gcc/config/pdp11/pdp11.md +++ b/gcc/config/pdp11/pdp11.md @@ -122,35 +122,20 @@ }" [(set_attr "length" "4,4,6,6,12")]) -(define_insn "*cmphi" +(define_insn "*cmp<mode>" [(set (cc0) - (compare (match_operand:HI 0 "general_operand" "rR,rR,rR,Q,Qi,Qi") - (match_operand:HI 1 "general_operand" "N,rR,Qi,N,rR,Qi")))] + (compare (match_operand:PDPint 0 "general_operand" "rR,rR,rR,Q,Qi,Qi") + (match_operand:PDPint 1 "general_operand" "N,rR,Qi,N,rR,Qi")))] "" "@ - tst %0 - cmp %0,%1 - cmp %0,%1 - tst %0 - cmp %0,%1 - cmp %0,%1" + tst<PDPint:isfx> %0 + cmp<PDPint:isfx> %0,%1 + cmp<PDPint:isfx> %0,%1 + tst<PDPint:isfx> %0 + cmp<PDPint:isfx> %0,%1 + cmp<PDPint:isfx> %0,%1" [(set_attr "length" "2,2,4,4,4,6")]) -(define_insn "*cmpqi" - [(set (cc0) - (compare (match_operand:QI 0 "general_operand" "rR,rR,rR,Q,Qi,Qi") - (match_operand:QI 1 "general_operand" "N,rR,Qi,N,rR,Qi")))] - "" - "@ - tstb %0 - cmpb %0,%1 - cmpb %0,%1 - tstb %0 - cmpb %0,%1 - cmpb %0,%1" - [(set_attr "length" "2,2,4,4,4,6")]) - - ;; sob instruction - we need an assembler which can make this instruction ;; valid under _all_ circumstances! @@ -211,22 +196,10 @@ "TARGET_FPU" "") -(define_expand "cbranchhi4" - [(set (cc0) - (compare (match_operand:HI 1 "general_operand") - (match_operand:HI 2 "general_operand"))) - (set (pc) - (if_then_else (match_operator 0 "ordered_comparison_operator" - [(cc0) (const_int 0)]) - (label_ref (match_operand 3 "" "")) - (pc)))] - "" - "") - -(define_expand "cbranchqi4" +(define_expand "cbranch<mode>4" [(set (cc0) - (compare (match_operand:QI 1 "general_operand") - (match_operand:QI 2 "general_operand"))) + (compare (match_operand:PDPint 1 "general_operand") + (match_operand:PDPint 2 "general_operand"))) (set (pc) (if_then_else (match_operator 0 "ordered_comparison_operator" [(cc0) (const_int 0)]) @@ -298,29 +271,16 @@ ;; we could split it up and make several sub-cases... [(set_attr "length" "4,6,8,16,16")]) -(define_insn "movhi" - [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (match_operand:HI 1 "general_operand" "rRN,Qi,rRN,Qi"))] - "" - "* -{ - if (operands[1] == const0_rtx) - return \"clr %0\"; - - return \"mov %1, %0\"; -}" - [(set_attr "length" "2,4,4,6")]) - -(define_insn "movqi" - [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (match_operand:QI 1 "general_operand" "rRN,Qi,rRN,Qi"))] +(define_insn "mov<mode>" + [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q") + (match_operand:PDPint 1 "general_operand" "rRN,Qi,rRN,Qi"))] "" "* { if (operands[1] == const0_rtx) - return \"clrb %0\"; + return \"clr<PDPint:isfx> %0\"; - return \"movb %1, %0\"; + return \"mov<PDPint:isfx> %1, %0\"; }" [(set_attr "length" "2,4,4,6")]) @@ -718,25 +678,6 @@ }" [(set_attr "length" "2,4,4,6")]) -(define_insn "addqi3" - [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (plus:QI (match_operand:QI 1 "general_operand" "%0,0,0,0") - (match_operand:QI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))] - "" - "* -{ - if (GET_CODE (operands[2]) == CONST_INT) - { - if (INTVAL(operands[2]) == 1) - return \"incb %0\"; - else if (INTVAL(operands[2]) == -1) - return \"decb %0\"; - } - - return \"add %2, %0\"; -}" - [(set_attr "length" "2,4,4,6")]) - ;;- subtract instructions ;; we don't have to care for constant second @@ -798,19 +739,6 @@ }" [(set_attr "length" "2,4,4,6")]) -(define_insn "subqi3" - [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (minus:QI (match_operand:QI 1 "general_operand" "0,0,0,0") - (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))] - "" - "* -{ - gcc_assert (GET_CODE (operands[2]) != CONST_INT); - - return \"sub %2, %0\"; -}" - [(set_attr "length" "2,4,4,6")]) - ;;;;- and instructions ;; Bit-and on the pdp (like on the VAX) is done with a clear-bits insn. @@ -850,95 +778,15 @@ [(set_attr "length" "2,4,4,6")]) ;;- Bit set (inclusive or) instructions -(define_insn "iorsi3" - [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,o,o,r,r,r,o,o,o") - (ior:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0") - (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K")))] - "" - "* -{ /* Here we trust that operands don't overlap - - or is lateoperands the low word?? - looks like it! */ - - rtx lateoperands[3]; - - lateoperands[0] = operands[0]; - - if (REG_P (operands[0])) - operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1); - else - operands[0] = adjust_address (operands[0], HImode, 2); - - if (! CONSTANT_P(operands[2])) - { - lateoperands[2] = operands[2]; - - if (REG_P (operands[2])) - operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1); - else - operands[2] = adjust_address (operands[2], HImode, 2); - - output_asm_insn (\"bis %2, %0\", operands); - output_asm_insn (\"bis %2, %0\", lateoperands); - return \"\"; - } - - lateoperands[2] = GEN_INT ((INTVAL (operands[2]) >> 16) & 0xffff); - operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff); - - /* these have different lengths, so we should have - different constraints! */ - if (INTVAL(operands[2])) - output_asm_insn (\"bis %2, %0\", operands); - - if (INTVAL(lateoperands[2])) - output_asm_insn (\"bis %2, %0\", lateoperands); - - return \"\"; -}" - [(set_attr "length" "4,8,8,12,4,4,8,6,6,12")]) - -(define_insn "iorhi3" - [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (ior:HI (match_operand:HI 1 "general_operand" "%0,0,0,0") - (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi")))] +(define_insn "ior<mode>3" + [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q") + (ior:PDPint (match_operand:PDPint 1 "general_operand" "%0,0,0,0") + (match_operand:PDPint 2 "general_operand" "rR,Qi,rR,Qi")))] "" - "bis %2, %0" + "bis<PDPint:isfx> %2, %0" [(set_attr "length" "2,4,4,6")]) -(define_insn "iorqi3" - [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,rR,Q,Q") - (ior:QI (match_operand:QI 1 "general_operand" "%0,0,0,0") - (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))] - "" - "bisb %2, %0") - ;;- xor instructions -(define_insn "xorsi3" - [(set (match_operand:SI 0 "register_operand" "=r") - (xor:SI (match_operand:SI 1 "register_operand" "%0") - (match_operand:SI 2 "register_operand" "r")))] - "TARGET_40_PLUS" - "* -{ /* Here we trust that operands don't overlap */ - - rtx lateoperands[3]; - - lateoperands[0] = operands[0]; - operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1); - - if (REG_P(operands[2])) - { - lateoperands[2] = operands[2]; - operands[2] = gen_rtx_REG (HImode, REGNO (operands[2]) + 1); - - output_asm_insn (\"xor %2, %0\", operands); - output_asm_insn (\"xor %2, %0\", lateoperands); - } - return \"\"; -}" - [(set_attr "length" "4")]) - (define_insn "xorhi3" [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q") (xor:HI (match_operand:HI 1 "general_operand" "%0,0") @@ -949,20 +797,11 @@ ;;- one complement instructions -(define_insn "one_cmplhi2" - [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q") - (not:HI (match_operand:HI 1 "general_operand" "0,0")))] - "" - "com %0" - [(set_attr "length" "2,4")]) - -(define_insn "one_cmplqi2" - [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,rR") - (not:QI (match_operand:QI 1 "general_operand" "0,g")))] +(define_insn "one_cmpl<mode>2" + [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Q") + (not:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))] "" - "@ - comb %0 - movb %1, %0\; comb %0" + "com<PDPint:isfx> %0" [(set_attr "length" "2,4")]) ;;- arithmetic shift instructions diff --git a/gcc/config/rpath.opt b/gcc/config/rpath.opt new file mode 100644 index 00000000000..c76e2fc598c --- /dev/null +++ b/gcc/config/rpath.opt @@ -0,0 +1,29 @@ +; -rpath option to the driver. + +; Copyright (C) 2010 +; 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 3, or (at your option) any later +; version. +; +; GCC is distributed in the hope that it will be useful, but WITHOUT ANY +; WARRANTY; without even the implied warranty of MERCHANTABILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +; for more details. +; +; You should have received a copy of the GNU General Public License +; along with GCC; see the file COPYING3. If not see +; <http://www.gnu.org/licenses/>. + +; See the GCC internals manual (options.texi) for a description of this file's format. + +; Please try to keep this file in ASCII collating order. + +rpath +Driver Separate + +; This comment is to ensure we retain the blank line above. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f265dce42fe..6f7636bb298 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -73,6 +73,7 @@ /* Structure used to define the rs6000 stack */ typedef struct rs6000_stack { + int reload_completed; /* stack info won't change from here on */ int first_gp_reg_save; /* first callee saved GP register used */ int first_fp_reg_save; /* first callee saved FP register used */ int first_altivec_reg_save; /* first callee saved AltiVec register used */ @@ -109,6 +110,7 @@ typedef struct rs6000_stack { int spe_padding_size; HOST_WIDE_INT total_size; /* total bytes allocated for stack */ int spe_64bit_regs_used; + int savres_strategy; } rs6000_stack_t; /* A C structure for machine-specific, per-function data. @@ -994,7 +996,6 @@ static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int, static bool rs6000_reg_live_or_pic_offset_p (int); static tree rs6000_builtin_vectorized_libmass (tree, tree, tree); static tree rs6000_builtin_vectorized_function (tree, tree, tree); -static int rs6000_savres_strategy (rs6000_stack_t *, bool, int, int); static void rs6000_restore_saved_cr (rtx, int); static bool rs6000_output_addr_const_extra (FILE *, rtx); static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT); @@ -15161,6 +15162,8 @@ rs6000_got_register (rtx value ATTRIBUTE_UNUSED) return pic_offset_table_rtx; } +static rs6000_stack_t stack_info; + /* Function to init struct machine_function. This will be called, via a pointer variable, from push_function_context. */ @@ -15168,6 +15171,7 @@ rs6000_got_register (rtx value ATTRIBUTE_UNUSED) static struct machine_function * rs6000_init_machine_status (void) { + stack_info.reload_completed = 0; return ggc_alloc_cleared_machine_function (); } @@ -18050,6 +18054,107 @@ is_altivec_return_reg (rtx reg, void *xyes) } +/* Determine the strategy for savings/restoring registers. */ + +enum { + SAVRES_MULTIPLE = 0x1, + SAVE_INLINE_FPRS = 0x2, + SAVE_INLINE_GPRS = 0x4, + REST_INLINE_FPRS = 0x8, + REST_INLINE_GPRS = 0x10, + SAVE_NOINLINE_GPRS_SAVES_LR = 0x20, + SAVE_NOINLINE_FPRS_SAVES_LR = 0x40, + REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80 +}; + +static int +rs6000_savres_strategy (rs6000_stack_t *info, + bool using_static_chain_p) +{ + int strategy = 0; + + if (TARGET_MULTIPLE + && !TARGET_POWERPC64 + && !(TARGET_SPE_ABI && info->spe_64bit_regs_used) + && info->first_gp_reg_save < 31 + && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)) + strategy |= SAVRES_MULTIPLE; + + if (crtl->calls_eh_return + || cfun->machine->ra_need_lr + || info->total_size > 32767) + strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS + | SAVE_INLINE_GPRS | REST_INLINE_GPRS); + + if (info->first_fp_reg_save == 64 + || FP_SAVE_INLINE (info->first_fp_reg_save) + /* The out-of-line FP routines use double-precision stores; + we can't use those routines if we don't have such stores. */ + || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT) + || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false)) + strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS; + + if (info->first_gp_reg_save == 32 + || GP_SAVE_INLINE (info->first_gp_reg_save) + || !((strategy & SAVRES_MULTIPLE) + || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))) + strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS; + + /* Don't bother to try to save things out-of-line if r11 is occupied + by the static chain. It would require too much fiddling and the + static chain is rarely used anyway. */ + if (using_static_chain_p) + strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS; + + /* If we are going to use store multiple, then don't even bother + with the out-of-line routines, since the store-multiple + instruction will always be smaller. */ + if ((strategy & SAVRES_MULTIPLE)) + strategy |= SAVE_INLINE_GPRS; + + /* The situation is more complicated with load multiple. We'd + prefer to use the out-of-line routines for restores, since the + "exit" out-of-line routines can handle the restore of LR and the + frame teardown. However if doesn't make sense to use the + out-of-line routine if that is the only reason we'd need to save + LR, and we can't use the "exit" out-of-line gpr restore if we + have saved some fprs; In those cases it is advantageous to use + load multiple when available. */ + if ((strategy & SAVRES_MULTIPLE) + && (!info->lr_save_p + || info->first_fp_reg_save != 64)) + strategy |= REST_INLINE_GPRS; + + /* We can only use load multiple or the out-of-line routines to + restore if we've used store multiple or out-of-line routines + in the prologue, i.e. if we've saved all the registers from + first_gp_reg_save. Otherwise, we risk loading garbage. */ + if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS) + strategy |= REST_INLINE_GPRS; + + /* Saving CR interferes with the exit routines used on the SPE, so + just punt here. */ + if (TARGET_SPE_ABI + && info->spe_64bit_regs_used + && info->cr_save_p) + strategy |= REST_INLINE_GPRS; + +#ifdef POWERPC_LINUX + if (TARGET_64BIT) + { + if (!(strategy & SAVE_INLINE_FPRS)) + strategy |= SAVE_NOINLINE_FPRS_SAVES_LR; + else if (!(strategy & SAVE_INLINE_GPRS) + && info->first_fp_reg_save == 64) + strategy |= SAVE_NOINLINE_GPRS_SAVES_LR; + } +#else + if (TARGET_AIX && !(strategy & REST_INLINE_FPRS)) + strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR; +#endif + return strategy; +} + /* Calculate the stack information for the current function. This is complicated by having two separate calling sequences, the AIX calling sequence and the V.4 calling sequence. @@ -18150,15 +18255,26 @@ is_altivec_return_reg (rtx reg, void *xyes) static rs6000_stack_t * rs6000_stack_info (void) { - static rs6000_stack_t info; - rs6000_stack_t *info_ptr = &info; +#ifdef ENABLE_CHECKING + static rs6000_stack_t info_save; +#endif + rs6000_stack_t *info_ptr = &stack_info; int reg_size = TARGET_32BIT ? 4 : 8; int ehrd_size; int save_align; int first_gp; HOST_WIDE_INT non_fixed_size; + bool using_static_chain_p; + +#ifdef ENABLE_CHECKING + memcpy (&info_save, &stack_info, sizeof stack_info); +#else + if (reload_completed && info_ptr->reload_completed) + return info_ptr; +#endif - memset (&info, 0, sizeof (info)); + memset (&stack_info, 0, sizeof (stack_info)); + info_ptr->reload_completed = reload_completed; if (TARGET_SPE) { @@ -18215,23 +18331,6 @@ rs6000_stack_info (void) info_ptr->calls_p = (! current_function_is_leaf || cfun->machine->ra_needs_full_frame); - /* Determine if we need to save the link register. */ - if ((DEFAULT_ABI == ABI_AIX - && crtl->profile - && !TARGET_PROFILE_KERNEL) -#ifdef TARGET_RELOCATABLE - || (TARGET_RELOCATABLE && (get_pool_size () != 0)) -#endif - || (info_ptr->first_fp_reg_save != 64 - && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save)) - || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca) - || info_ptr->calls_p - || rs6000_ra_ever_killed ()) - { - info_ptr->lr_save_p = 1; - df_set_regs_ever_live (LR_REGNO, true); - } - /* Determine if we need to save the condition code registers. */ if (df_regs_ever_live_p (CR2_REGNO) || df_regs_ever_live_p (CR3_REGNO) @@ -18400,6 +18499,33 @@ rs6000_stack_info (void) info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT); + /* Determine if we need to save the link register. */ + if (info_ptr->calls_p + || (DEFAULT_ABI == ABI_AIX + && crtl->profile + && !TARGET_PROFILE_KERNEL) + || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca) +#ifdef TARGET_RELOCATABLE + || (TARGET_RELOCATABLE && (get_pool_size () != 0)) +#endif + || rs6000_ra_ever_killed ()) + info_ptr->lr_save_p = 1; + + using_static_chain_p = (cfun->static_chain_decl != NULL_TREE + && df_regs_ever_live_p (STATIC_CHAIN_REGNUM) + && call_used_regs[STATIC_CHAIN_REGNUM]); + info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr, + using_static_chain_p); + + if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS) + || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS) + || !(info_ptr->savres_strategy & REST_INLINE_GPRS) + || !(info_ptr->savres_strategy & REST_INLINE_FPRS)) + info_ptr->lr_save_p = 1; + + if (info_ptr->lr_save_p) + df_set_regs_ever_live (LR_REGNO, true); + /* Determine if we need to allocate any stack frame: For AIX we need to push the stack if a frame pointer is needed @@ -18451,6 +18577,10 @@ rs6000_stack_info (void) if (! info_ptr->cr_save_p) info_ptr->cr_save_offset = 0; +#ifdef ENABLE_CHECKING + gcc_assert (!(reload_completed && info_save.reload_completed) + || memcmp (&info_save, &stack_info, sizeof stack_info) == 0); +#endif return info_ptr; } @@ -19714,106 +19844,6 @@ rs6000_reg_live_or_pic_offset_p (int reg) || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))); } -enum { - SAVRES_MULTIPLE = 0x1, - SAVRES_INLINE_FPRS = 0x2, - SAVRES_INLINE_GPRS = 0x4, - SAVRES_NOINLINE_GPRS_SAVES_LR = 0x8, - SAVRES_NOINLINE_FPRS_SAVES_LR = 0x10, - SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x20 -}; - -/* Determine the strategy for savings/restoring registers. */ - -static int -rs6000_savres_strategy (rs6000_stack_t *info, bool savep, - int using_static_chain_p, int sibcall) -{ - bool using_multiple_p; - bool common; - bool savres_fprs_inline; - bool savres_gprs_inline; - bool noclobber_global_gprs - = no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true); - int strategy; - - using_multiple_p = (TARGET_MULTIPLE && ! TARGET_POWERPC64 - && (!TARGET_SPE_ABI - || info->spe_64bit_regs_used == 0) - && info->first_gp_reg_save < 31 - && noclobber_global_gprs); - /* Don't bother to try to save things out-of-line if r11 is occupied - by the static chain. It would require too much fiddling and the - static chain is rarely used anyway. */ - common = (using_static_chain_p - || sibcall - || crtl->calls_eh_return - || !info->lr_save_p - || cfun->machine->ra_need_lr - || info->total_size > 32767); - savres_fprs_inline = (common - || info->first_fp_reg_save == 64 - || !no_global_regs_above (info->first_fp_reg_save, - /*gpr=*/false) - /* The out-of-line FP routines use - double-precision stores; we can't use those - routines if we don't have such stores. */ - || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT) - || FP_SAVE_INLINE (info->first_fp_reg_save)); - savres_gprs_inline = (common - /* Saving CR interferes with the exit routines - used on the SPE, so just punt here. */ - || (!savep - && TARGET_SPE_ABI - && info->spe_64bit_regs_used != 0 - && info->cr_save_p != 0) - || info->first_gp_reg_save == 32 - || !noclobber_global_gprs - || GP_SAVE_INLINE (info->first_gp_reg_save)); - - if (savep) - /* If we are going to use store multiple, then don't even bother - with the out-of-line routines, since the store-multiple instruction - will always be smaller. */ - savres_gprs_inline = savres_gprs_inline || using_multiple_p; - else - { - /* The situation is more complicated with load multiple. We'd - prefer to use the out-of-line routines for restores, since the - "exit" out-of-line routines can handle the restore of LR and - the frame teardown. But we can only use the out-of-line - routines if we know that we've used store multiple or - out-of-line routines in the prologue, i.e. if we've saved all - the registers from first_gp_reg_save. Otherwise, we risk - loading garbage from the stack. Furthermore, we can only use - the "exit" out-of-line gpr restore if we haven't saved any - fprs. */ - bool saved_all = !savres_gprs_inline || using_multiple_p; - - if (saved_all && info->first_fp_reg_save != 64) - /* We can't use the exit routine; use load multiple if it's - available. */ - savres_gprs_inline = savres_gprs_inline || using_multiple_p; - } - - strategy = (using_multiple_p - | (savres_fprs_inline << 1) - | (savres_gprs_inline << 2)); -#ifdef POWERPC_LINUX - if (TARGET_64BIT) - { - if (!savres_fprs_inline) - strategy |= SAVRES_NOINLINE_FPRS_SAVES_LR; - else if (!savres_gprs_inline && info->first_fp_reg_save == 64) - strategy |= SAVRES_NOINLINE_GPRS_SAVES_LR; - } -#else - if (TARGET_AIX && !savres_fprs_inline) - strategy |= SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR; -#endif - return strategy; -} - /* Emit function prologue as insns. */ void @@ -19862,12 +19892,10 @@ rs6000_emit_prologue (void) reg_size = 8; } - strategy = rs6000_savres_strategy (info, /*savep=*/true, - /*static_chain_p=*/using_static_chain_p, - /*sibcall=*/0); + strategy = info->savres_strategy; using_store_multiple = strategy & SAVRES_MULTIPLE; - saving_FPRs_inline = strategy & SAVRES_INLINE_FPRS; - saving_GPRs_inline = strategy & SAVRES_INLINE_GPRS; + saving_FPRs_inline = strategy & SAVE_INLINE_FPRS; + saving_GPRs_inline = strategy & SAVE_INLINE_GPRS; /* For V.4, update stack before we do any saving and set back pointer. */ if (! WORLD_SAVE_P (info) @@ -20037,8 +20065,8 @@ rs6000_emit_prologue (void) gen_rtx_REG (Pmode, LR_REGNO)); RTX_FRAME_RELATED_P (insn) = 1; - if (!(strategy & (SAVRES_NOINLINE_GPRS_SAVES_LR - | SAVRES_NOINLINE_FPRS_SAVES_LR))) + if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR + | SAVE_NOINLINE_FPRS_SAVES_LR))) { addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (info->lr_save_offset + sp_offset)); @@ -20098,7 +20126,7 @@ rs6000_emit_prologue (void) DFmode, /*savep=*/true, /*gpr=*/false, /*lr=*/(strategy - & SAVRES_NOINLINE_FPRS_SAVES_LR) + & SAVE_NOINLINE_FPRS_SAVES_LR) != 0); insn = emit_insn (par); rs6000_frame_related (insn, frame_ptr_rtx, info->total_size, @@ -20225,7 +20253,7 @@ rs6000_emit_prologue (void) reg_mode, /*savep=*/true, /*gpr=*/true, /*lr=*/(strategy - & SAVRES_NOINLINE_GPRS_SAVES_LR) + & SAVE_NOINLINE_GPRS_SAVES_LR) != 0); insn = emit_insn (par); rs6000_frame_related (insn, frame_ptr_rtx, info->total_size, @@ -20533,19 +20561,23 @@ rs6000_output_function_prologue (FILE *file, /* Write .extern for any function we will call to save and restore fp values. */ - if (info->first_fp_reg_save < 64 - && !FP_SAVE_INLINE (info->first_fp_reg_save)) + if (info->first_fp_reg_save < 64) { char *name; int regno = info->first_fp_reg_save - 32; - name = rs6000_savres_routine_name (info, regno, /*savep=*/true, - /*gpr=*/false, /*lr=*/false); - fprintf (file, "\t.extern %s\n", name); - - name = rs6000_savres_routine_name (info, regno, /*savep=*/false, - /*gpr=*/false, /*lr=*/true); - fprintf (file, "\t.extern %s\n", name); + if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0) + { + name = rs6000_savres_routine_name (info, regno, /*savep=*/true, + /*gpr=*/false, /*lr=*/false); + fprintf (file, "\t.extern %s\n", name); + } + if ((info->savres_strategy & REST_INLINE_FPRS) == 0) + { + name = rs6000_savres_routine_name (info, regno, /*savep=*/false, + /*gpr=*/false, /*lr=*/true); + fprintf (file, "\t.extern %s\n", name); + } } /* Write .extern for AIX common mode routines, if needed. */ @@ -20691,11 +20723,10 @@ rs6000_emit_epilogue (int sibcall) reg_size = 8; } - strategy = rs6000_savres_strategy (info, /*savep=*/false, - /*static_chain_p=*/0, sibcall); + strategy = info->savres_strategy; using_load_multiple = strategy & SAVRES_MULTIPLE; - restoring_FPRs_inline = strategy & SAVRES_INLINE_FPRS; - restoring_GPRs_inline = strategy & SAVRES_INLINE_GPRS; + restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS); + restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS); using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 || rs6000_cpu == PROCESSOR_PPC750 @@ -20713,7 +20744,7 @@ rs6000_emit_epilogue (int sibcall) && !frame_pointer_needed)); restore_lr = (info->lr_save_p && (restoring_FPRs_inline - || (strategy & SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR)) + || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR)) && (restoring_GPRs_inline || info->first_fp_reg_save < 64)); @@ -21352,7 +21383,7 @@ rs6000_emit_epilogue (int sibcall) if (!sibcall) { rtvec p; - bool lr = (strategy & SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0; + bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0; if (! restoring_FPRs_inline) p = rtvec_alloc (4 + 64 - info->first_fp_reg_save); else diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 6d88e324e88..04cc70e3adf 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -502,13 +502,6 @@ do { \ reg_names[1]); \ } while (0) -/* Switch Recognition by gcc.c. Add -G xx support. */ - -/* Override svr4.h definition. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - extern int fixuplabelno; /* Handle constructors specially for -mrelocatable. */ diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index f320beb260a..5f89ebec21c 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -25,7 +25,10 @@ builtin_define ("__RX__"); \ builtin_assert ("cpu=RX"); \ if (rx_cpu_type == RX610) \ - builtin_assert ("machine=RX610"); \ + { \ + builtin_define ("__RX610__"); \ + builtin_assert ("machine=RX610"); \ + } \ else \ builtin_assert ("machine=RX600"); \ \ diff --git a/gcc/config/score/score.h b/gcc/config/score/score.h index 49887040014..1309a40e023 100644 --- a/gcc/config/score/score.h +++ b/gcc/config/score/score.h @@ -20,11 +20,6 @@ #include "score-conv.h" -/* Controlling the Compilation Driver. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') - #undef CPP_SPEC #define CPP_SPEC "%{mscore3:-D__score3__} %{G*}" diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 54e7be84947..a1eec59153e 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -255,6 +255,7 @@ static int sh_pr_n_sets (void); static rtx sh_allocate_initial_value (rtx); static bool sh_legitimate_address_p (enum machine_mode, rtx, bool); static rtx sh_legitimize_address (rtx, rtx, enum machine_mode); +static rtx sh_delegitimize_address (rtx); static int shmedia_target_regs_stack_space (HARD_REG_SET *); static int shmedia_reserve_space_for_target_registers_p (int, HARD_REG_SET *); static int shmedia_target_regs_stack_adjust (HARD_REG_SET *); @@ -459,6 +460,9 @@ static const struct default_options sh_option_optimization_table[] = #undef TARGET_SCHED_INIT #define TARGET_SCHED_INIT sh_md_init +#undef TARGET_DELEGITIMIZE_ADDRESS +#define TARGET_DELEGITIMIZE_ADDRESS sh_delegitimize_address + #undef TARGET_LEGITIMIZE_ADDRESS #define TARGET_LEGITIMIZE_ADDRESS sh_legitimize_address @@ -9873,6 +9877,45 @@ sh_legitimize_reload_address (rtx *p, enum machine_mode mode, int opnum, return true; } +/* In the name of slightly smaller debug output, and to cater to + general assembler lossage, recognize various UNSPEC sequences + and turn them back into a direct symbol reference. */ + +static rtx +sh_delegitimize_address (rtx orig_x) +{ + rtx x, y; + + orig_x = delegitimize_mem_from_attrs (orig_x); + + x = orig_x; + if (MEM_P (x)) + x = XEXP (x, 0); + if (GET_CODE (x) == CONST) + { + y = XEXP (x, 0); + if (GET_CODE (y) == UNSPEC) + { + if (XINT (y, 1) == UNSPEC_GOT + || XINT (y, 1) == UNSPEC_GOTOFF) + return XVECEXP (y, 0, 0); + else if (TARGET_SHMEDIA + && (XINT (y, 1) == UNSPEC_EXTRACT_S16 + || XINT (y, 1) == UNSPEC_EXTRACT_U16)) + { + rtx offset = XVECEXP (y, 0, 1); + + x = gen_rtx_PLUS (Pmode, XVECEXP (y, 0, 0), offset); + if (MEM_P (orig_x)) + x = replace_equiv_address_nv (orig_x, x); + return x; + } + } + } + + return orig_x; +} + /* Mark the use of a constant in the literal table. If the constant has multiple labels, make it unique. */ static rtx diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h index 805b32fe89c..72efdbd339e 100644 --- a/gcc/config/sol2.h +++ b/gcc/config/sol2.h @@ -192,15 +192,6 @@ along with GCC; see the file COPYING3. If not see #undef SUPPORTS_INIT_PRIORITY #define SUPPORTS_INIT_PRIORITY 0 -/* This defines which switch letters take arguments. - It is as in svr4.h but with -R added. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG(CHAR) \ - || (CHAR) == 'R' \ - || (CHAR) == 'h' \ - || (CHAR) == 'z') - #define STDC_0_IN_SYSTEM_HEADERS 1 /* diff --git a/gcc/config/sparc/sp-elf.h b/gcc/config/sparc/sp-elf.h index 3c50f712c42..8f0e892971a 100644 --- a/gcc/config/sparc/sp-elf.h +++ b/gcc/config/sparc/sp-elf.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GCC, for SPARC running in an embedded environment using the ELF file format. - Copyright (C) 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2005, 2007, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -45,15 +45,6 @@ along with GCC; see the file COPYING3. If not see /* Don't set the target flags, this is done by the linker script */ #undef LIB_SPEC #define LIB_SPEC "" - -/* This defines which switch letters take arguments. - It is as in svr4.h but with -R added. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG(CHAR) \ - || (CHAR) == 'R' \ - || (CHAR) == 'h' \ - || (CHAR) == 'z') #undef LOCAL_LABEL_PREFIX #define LOCAL_LABEL_PREFIX "." diff --git a/gcc/config/sparc/sp64-elf.h b/gcc/config/sparc/sp64-elf.h index a6ae0271e42..e1820e07641 100644 --- a/gcc/config/sparc/sp64-elf.h +++ b/gcc/config/sparc/sp64-elf.h @@ -1,5 +1,5 @@ /* Definitions of target machine for GCC, for SPARC64, ELF. - Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2004, 2005, 2007 + Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2004, 2005, 2007, 2010 Free Software Foundation, Inc. Contributed by Doug Evans, dje@cygnus.com. @@ -71,15 +71,6 @@ crtbegin.o%s \ /* Use the default (for now). */ #undef LIB_SPEC -/* This defines which switch letters take arguments. - It is as in svr4.h but with -R added. */ -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG(CHAR) \ - || (CHAR) == 'R' \ - || (CHAR) == 'h' \ - || (CHAR) == 'z') - #undef BYTES_BIG_ENDIAN #define BYTES_BIG_ENDIAN (! TARGET_LITTLE_ENDIAN) diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 3df147218a1..b7f0bd36226 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -450,7 +450,7 @@ extern enum cmodel sparc_cmodel; /* Special flags to the Sun-4 assembler when using pipe for input. */ #define ASM_SPEC "\ -%{R} %{!pg:%{!p:%{fpic|fPIC|fpie|fPIE:-k}}} %{keep-local-as-symbols:-L} \ +%{!pg:%{!p:%{fpic|fPIC|fpie|fPIE:-k}}} %{keep-local-as-symbols:-L} \ %(asm_cpu) %(asm_relax)" #define AS_NEEDS_DASH_FOR_PIPED_INPUT diff --git a/gcc/config/svr4.h b/gcc/config/svr4.h index 1a481301f18..f45706b4f76 100644 --- a/gcc/config/svr4.h +++ b/gcc/config/svr4.h @@ -1,7 +1,7 @@ /* Operating system specific defines to be used when targeting GCC for some generic System V Release 4 system. Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2007, 2008, 2009 Free Software Foundation, Inc. + 2000, 2001, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Ron Guilmette (rfg@monkeys.com). This file is part of GCC. @@ -41,26 +41,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Cpp, assembler, linker, library, and startfile spec's. */ -/* This defines which switch letters take arguments. On svr4, most of - the normal cases (defined in gcc.c) apply, and we also have -h* and - -z* options (for the linker). Note however that there is no such - thing as a -T option for svr4. */ - -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) \ - (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ - || (CHAR) == 'h' \ - || (CHAR) == 'x' \ - || (CHAR) == 'z') - -/* This defines which multi-letter switches take arguments. On svr4, - there are no such switches except those implemented by GCC itself. */ - -#define WORD_SWITCH_TAKES_ARG(STR) \ - (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ - && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \ - && strcmp (STR, "Tbss")) - /* Provide an ASM_SPEC appropriate for svr4. If we're not using GAS, we try to support as many of the specialized svr4 assembler options as seems reasonable, |