diff options
Diffstat (limited to 'contrib/gcc/targhooks.c')
-rw-r--r-- | contrib/gcc/targhooks.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/contrib/gcc/targhooks.c b/contrib/gcc/targhooks.c new file mode 100644 index 0000000..308ada6 --- /dev/null +++ b/contrib/gcc/targhooks.c @@ -0,0 +1,213 @@ +/* Default target hook functions. + Copyright (C) 2003, 2004 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. */ + +/* The migration of target macros to target hooks works as follows: + + 1. Create a target hook that uses the existing target macros to + implement the same functionality. + + 2. Convert all the MI files to use the hook instead of the macro. + + 3. Repeat for a majority of the remaining target macros. This will + take some time. + + 4. Tell target maintainers to start migrating. + + 5. Eventually convert the backends to override the hook instead of + defining the macros. This will take some time too. + + 6. TBD when, poison the macros. Unmigrated targets will break at + this point. + + Note that we expect steps 1-3 to be done by the people that + understand what the MI does with each macro, and step 5 to be done + by the target maintainers for their respective targets. + + Note that steps 1 and 2 don't have to be done together, but no + target can override the new hook until step 2 is complete for it. + + Once the macros are poisoned, we will revert to the old migration + rules - migrate the macro, callers, and targets all at once. This + comment can thus be removed at that point. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "machmode.h" +#include "rtl.h" +#include "tree.h" +#include "expr.h" +#include "output.h" +#include "toplev.h" +#include "function.h" +#include "target.h" +#include "tm_p.h" +#include "target-def.h" + +void +default_external_libcall (rtx fun ATTRIBUTE_UNUSED) +{ +#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL + ASM_OUTPUT_EXTERNAL_LIBCALL(asm_out_file, fun); +#endif +} + +enum machine_mode +default_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2) +{ + if (m1 == m2) + return m1; + return VOIDmode; +} + +bool +default_promote_function_args (tree fntype ATTRIBUTE_UNUSED) +{ +#ifdef PROMOTE_FUNCTION_ARGS + return true; +#else + return false; +#endif +} + +bool +default_promote_function_return (tree fntype ATTRIBUTE_UNUSED) +{ +#ifdef PROMOTE_FUNCTION_RETURN + return true; +#else + return false; +#endif +} + +bool +default_promote_prototypes (tree fntype ATTRIBUTE_UNUSED) +{ + if (PROMOTE_PROTOTYPES) + return true; + else + return false; +} + +rtx +default_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED, int incoming) +{ + rtx rv = 0; + if (incoming) + { +#ifdef STRUCT_VALUE_INCOMING + rv = STRUCT_VALUE_INCOMING; +#else +#ifdef STRUCT_VALUE + rv = STRUCT_VALUE; +#else +#ifndef STRUCT_VALUE_REGNUM + abort(); +#else + rv = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM); +#endif +#endif +#endif + } + else + { +#ifdef STRUCT_VALUE + rv = STRUCT_VALUE; +#else +#ifndef STRUCT_VALUE_REGNUM + abort(); +#else + rv = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM); +#endif +#endif + } + return rv; +} + +bool +default_return_in_memory (tree type, + tree fntype ATTRIBUTE_UNUSED) +{ +#ifndef RETURN_IN_MEMORY + return (TYPE_MODE (type) == BLKmode); +#else + return RETURN_IN_MEMORY (type); +#endif +} + +rtx +default_expand_builtin_saveregs (void) +{ +#ifdef EXPAND_BUILTIN_SAVEREGS + return EXPAND_BUILTIN_SAVEREGS (); +#else + error ("__builtin_saveregs not supported by this target"); + return const0_rtx; +#endif +} + +void +default_setup_incoming_varargs (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, + enum machine_mode mode ATTRIBUTE_UNUSED, + tree type ATTRIBUTE_UNUSED, + int *pretend_arg_size ATTRIBUTE_UNUSED, + int second_time ATTRIBUTE_UNUSED) +{ +#ifdef SETUP_INCOMING_VARARGS + SETUP_INCOMING_VARARGS ((*ca), mode, type, (*pretend_arg_size), second_time); +#endif +} + +bool +default_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED) +{ +#ifdef STRICT_ARGUMENT_NAMING + return STRICT_ARGUMENT_NAMING; +#else + return 0; +#endif +} + +bool +default_pretend_outgoing_varargs_named(CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED) +{ +#ifdef SETUP_INCOMING_VARARGS + return 1; +#else + return (targetm.calls.setup_incoming_varargs != default_setup_incoming_varargs); +#endif +} + +/* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true. */ + +bool +hook_bool_CUMULATIVE_ARGS_true (CUMULATIVE_ARGS * a ATTRIBUTE_UNUSED) +{ + return true; +} + +/* Generic hook that takes a machine mode and returns true. */ + +bool +hook_bool_machine_mode_true (enum machine_mode a ATTRIBUTE_UNUSED) +{ + return true; +} |