X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ftarghooks.c;h=0eee5288b6c6d29cdb56d16ee94c653834765259;hp=9271db829bf1160faf4914822a25c4d198cb0ad4;hb=a7446c4eed4f9d388f1d2dfd7feef0490330e195;hpb=964229b79f27a511c58e7907288a2dbc7c5afef3 diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 9271db829bf..0eee5288b6c 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -56,16 +56,19 @@ along with GCC; see the file COPYING3. If not see #include "tree.h" #include "expr.h" #include "output.h" -#include "toplev.h" +#include "diagnostic-core.h" #include "function.h" #include "target.h" #include "tm_p.h" #include "target-def.h" #include "ggc.h" #include "hard-reg-set.h" +#include "regs.h" #include "reload.h" #include "optabs.h" #include "recog.h" +#include "intl.h" +#include "opts.h" bool @@ -315,16 +318,6 @@ hook_callee_copies_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, return named; } -/* Emit any directives required to unwind this instruction. */ - -void -default_unwind_emit (FILE * stream ATTRIBUTE_UNUSED, - rtx insn ATTRIBUTE_UNUSED) -{ - /* Should never happen. */ - gcc_unreachable (); -} - /* Emit to STREAM the assembler syntax for insn operand X. */ void @@ -365,6 +358,21 @@ default_print_operand_punct_valid_p (unsigned char code ATTRIBUTE_UNUSED) #endif } +/* The default implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA. */ + +bool +default_asm_output_addr_const_extra (FILE *file ATTRIBUTE_UNUSED, + rtx x ATTRIBUTE_UNUSED) +{ +#ifdef OUTPUT_ADDR_CONST_EXTRA + OUTPUT_ADDR_CONST_EXTRA (file, x, fail); + return true; + +fail: +#endif + return false; +} + /* True if MODE is valid for the target. By "valid", we mean able to be manipulated in non-trivial ways. In particular, this means all the arithmetic is supported. @@ -418,6 +426,19 @@ default_scalar_mode_supported_p (enum machine_mode mode) } } +/* Make some target macros useable by target-independent code. */ +bool +targhook_words_big_endian (void) +{ + return !!WORDS_BIG_ENDIAN; +} + +bool +targhook_float_words_big_endian (void) +{ + return !!FLOAT_WORDS_BIG_ENDIAN; +} + /* True if the target supports decimal floating point. */ bool @@ -479,7 +500,9 @@ default_builtin_vectorized_conversion (unsigned int code ATTRIBUTE_UNUSED, /* Default vectorizer cost model values. */ int -default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost) +default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, + tree vectype ATTRIBUTE_UNUSED, + int misalign ATTRIBUTE_UNUSED) { switch (type_of_cost) { @@ -496,6 +519,7 @@ default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost) return 1; case unaligned_load: + case unaligned_store: return 2; case cond_branch_taken: @@ -559,33 +583,38 @@ default_function_arg_advance (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, } rtx -default_function_arg (const CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, +default_function_arg (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) { #ifdef FUNCTION_ARG - return FUNCTION_ARG (*(CONST_CAST (CUMULATIVE_ARGS *, ca)), mode, - CONST_CAST_TREE (type), named); + return FUNCTION_ARG (*ca, mode, CONST_CAST_TREE (type), named); #else gcc_unreachable (); #endif } rtx -default_function_incoming_arg (const CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, +default_function_incoming_arg (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) { #ifdef FUNCTION_INCOMING_ARG - return FUNCTION_INCOMING_ARG (*(CONST_CAST (CUMULATIVE_ARGS *, ca)), mode, - CONST_CAST_TREE (type), named); + return FUNCTION_INCOMING_ARG (*ca, mode, CONST_CAST_TREE (type), named); #else gcc_unreachable (); #endif } +unsigned int +default_function_arg_boundary (enum machine_mode mode ATTRIBUTE_UNUSED, + const_tree type ATTRIBUTE_UNUSED) +{ + return PARM_BOUNDARY; +} + void hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED) { @@ -846,8 +875,9 @@ default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED, #endif if (rclass != NO_REGS) { - enum insn_code icode = (in_p ? reload_in_optab[(int) reload_mode] - : reload_out_optab[(int) reload_mode]); + enum insn_code icode + = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab, + reload_mode); if (icode != CODE_FOR_nothing && insn_data[(int) icode].operand[in_p].predicate @@ -911,14 +941,6 @@ default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED, return rclass; } -void -default_target_option_override (void) -{ -#ifdef OVERRIDE_OPTIONS - OVERRIDE_OPTIONS; -#endif -} - bool default_handle_c_option (size_t code ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED, @@ -971,11 +993,29 @@ default_builtin_support_vector_misalignment (enum machine_mode mode, bool is_packed ATTRIBUTE_UNUSED) { - if (optab_handler (movmisalign_optab, mode)->insn_code != CODE_FOR_nothing) + if (optab_handler (movmisalign_optab, mode) != CODE_FOR_nothing) return true; return false; } +/* By default, only attempt to parallelize bitwise operations, and + possibly adds/subtracts using bit-twiddling. */ + +enum machine_mode +default_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED) +{ + return word_mode; +} + +/* By default only the size derived from the preferred vector mode + is tried. */ + +unsigned int +default_autovectorize_vector_sizes (void) +{ + return 0; +} + /* Determine whether or not a pointer mode is valid. Assume defaults of ptr_mode or Pmode - can be overridden. */ bool @@ -1202,4 +1242,241 @@ default_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, #endif } +bool +default_profile_before_prologue (void) +{ +#ifdef PROFILE_BEFORE_PROLOGUE + return true; +#else + return false; +#endif +} + +/* The default implementation of TARGET_PREFERRED_RELOAD_CLASS. */ + +reg_class_t +default_preferred_reload_class (rtx x ATTRIBUTE_UNUSED, + reg_class_t rclass) +{ +#ifdef PREFERRED_RELOAD_CLASS + return (reg_class_t) PREFERRED_RELOAD_CLASS (x, (enum reg_class) rclass); +#else + return rclass; +#endif +} + +/* The default implementation of TARGET_OUTPUT_PREFERRED_RELOAD_CLASS. */ + +reg_class_t +default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED, + reg_class_t rclass) +{ +#ifdef PREFERRED_OUTPUT_RELOAD_CLASS + return PREFERRED_OUTPUT_RELOAD_CLASS (x, (enum reg_class) rclass); +#else + return rclass; +#endif +} + +/* The default implementation of TARGET_PREFERRED_RENAME_CLASS. */ +reg_class_t +default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED) +{ + return NO_REGS; +} + +/* The default implementation of TARGET_CLASS_LIKELY_SPILLED_P. */ + +bool +default_class_likely_spilled_p (reg_class_t rclass) +{ + return (reg_class_size[(int) rclass] == 1); +} + +/* Determine the debugging unwind mechanism for the target. */ + +enum unwind_info_type +default_debug_unwind_info (void) +{ + /* If the target wants to force the use of dwarf2 unwind info, let it. */ + /* ??? Change all users to the hook, then poison this. */ +#ifdef DWARF2_FRAME_INFO + if (DWARF2_FRAME_INFO) + return UI_DWARF2; +#endif + + /* Otherwise, only turn it on if dwarf2 debugging is enabled. */ +#ifdef DWARF2_DEBUGGING_INFO + if (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) + return UI_DWARF2; +#endif + + return UI_NONE; +} + +/* Determine the exception handling mechanism for the target. */ + +enum unwind_info_type +default_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) +{ + /* Obey the configure switch to turn on sjlj exceptions. */ +#ifdef CONFIG_SJLJ_EXCEPTIONS + if (CONFIG_SJLJ_EXCEPTIONS) + return UI_SJLJ; +#endif + + /* ??? Change all users to the hook, then poison this. */ +#ifdef DWARF2_UNWIND_INFO + if (DWARF2_UNWIND_INFO) + return UI_DWARF2; +#endif + + return UI_SJLJ; +} + +/* To be used by targets that force dwarf2 unwind enabled. */ + +enum unwind_info_type +dwarf2_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) +{ + /* Obey the configure switch to turn on sjlj exceptions. */ +#ifdef CONFIG_SJLJ_EXCEPTIONS + if (CONFIG_SJLJ_EXCEPTIONS) + return UI_SJLJ; +#endif + + return UI_DWARF2; +} + +/* To be used by targets that force sjlj unwind enabled. */ + +enum unwind_info_type +sjlj_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) +{ + return UI_SJLJ; +} + +/* To be used by targets where reg_raw_mode doesn't return the right + mode for registers used in apply_builtin_return and apply_builtin_arg. */ + +enum machine_mode +default_get_reg_raw_mode(int regno) +{ + return reg_raw_mode[regno]; +} + +/* Return true if the state of option OPTION should be stored in PCH files + and checked by default_pch_valid_p. Store the option's current state + in STATE if so. */ + +static inline bool +option_affects_pch_p (int option, struct cl_option_state *state) +{ + if ((cl_options[option].flags & CL_TARGET) == 0) + return false; + if (option_flag_var (option, &global_options) == &target_flags) + if (targetm.check_pch_target_flags) + return false; + return get_option_state (&global_options, option, state); +} + +/* Default version of get_pch_validity. + By default, every flag difference is fatal; that will be mostly right for + most targets, but completely right for very few. */ + +void * +default_get_pch_validity (size_t *sz) +{ + struct cl_option_state state; + size_t i; + char *result, *r; + + *sz = 2; + if (targetm.check_pch_target_flags) + *sz += sizeof (target_flags); + for (i = 0; i < cl_options_count; i++) + if (option_affects_pch_p (i, &state)) + *sz += state.size; + + result = r = XNEWVEC (char, *sz); + r[0] = flag_pic; + r[1] = flag_pie; + r += 2; + if (targetm.check_pch_target_flags) + { + memcpy (r, &target_flags, sizeof (target_flags)); + r += sizeof (target_flags); + } + + for (i = 0; i < cl_options_count; i++) + if (option_affects_pch_p (i, &state)) + { + memcpy (r, state.data, state.size); + r += state.size; + } + + return result; +} + +/* Return a message which says that a PCH file was created with a different + setting of OPTION. */ + +static const char * +pch_option_mismatch (const char *option) +{ + char *r; + + asprintf (&r, _("created and used with differing settings of '%s'"), option); + if (r == NULL) + return _("out of memory"); + return r; +} + +/* Default version of pch_valid_p. */ + +const char * +default_pch_valid_p (const void *data_p, size_t len) +{ + struct cl_option_state state; + const char *data = (const char *)data_p; + size_t i; + + /* -fpic and -fpie also usually make a PCH invalid. */ + if (data[0] != flag_pic) + return _("created and used with different settings of -fpic"); + if (data[1] != flag_pie) + return _("created and used with different settings of -fpie"); + data += 2; + + /* Check target_flags. */ + if (targetm.check_pch_target_flags) + { + int tf; + const char *r; + + memcpy (&tf, data, sizeof (target_flags)); + data += sizeof (target_flags); + len -= sizeof (target_flags); + r = targetm.check_pch_target_flags (tf); + if (r != NULL) + return r; + } + + for (i = 0; i < cl_options_count; i++) + if (option_affects_pch_p (i, &state)) + { + if (memcmp (data, state.data, state.size) != 0) + return pch_option_mismatch (cl_options[i].opt_text); + data += state.size; + len -= state.size; + } + + return NULL; +} + +const struct default_options empty_optimization_table[] = + { + { OPT_LEVELS_NONE, 0, NULL, 0 } + }; + #include "gt-targhooks.h"