Index: gcc/gcc/targhooks.c |
diff --git a/gcc/gcc/targhooks.c b/gcc/gcc/targhooks.c |
index 5b7b8751ba66300dc47d389b5d6366b68d86f466..d9a7a9dcc14341c70b680d18df5745da444721bf 100644 |
--- a/gcc/gcc/targhooks.c |
+++ b/gcc/gcc/targhooks.c |
@@ -1,5 +1,6 @@ |
/* Default target hook functions. |
- Copyright (C) 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. |
+ Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 |
+ Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -67,6 +68,22 @@ along with GCC; see the file COPYING3. If not see |
#include "recog.h" |
+bool |
+default_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, |
+ rtx addr ATTRIBUTE_UNUSED, |
+ bool strict ATTRIBUTE_UNUSED) |
+{ |
+#ifdef GO_IF_LEGITIMATE_ADDRESS |
+ /* Defer to the old implementation using a goto. */ |
+ if (strict) |
+ return strict_memory_address_p (mode, addr); |
+ else |
+ return memory_address_p (mode, addr); |
+#else |
+ gcc_unreachable (); |
+#endif |
+} |
+ |
void |
default_external_libcall (rtx fun ATTRIBUTE_UNUSED) |
{ |
@@ -96,6 +113,29 @@ default_unspec_may_trap_p (const_rtx x, unsigned flags) |
} |
enum machine_mode |
+default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, |
+ enum machine_mode mode, |
+ int *punsignedp ATTRIBUTE_UNUSED, |
+ const_tree funtype ATTRIBUTE_UNUSED, |
+ int for_return ATTRIBUTE_UNUSED) |
+{ |
+ if (for_return == 2) |
+ return promote_mode (type, mode, punsignedp); |
+ return mode; |
+} |
+ |
+enum machine_mode |
+default_promote_function_mode_always_promote (const_tree type, |
+ enum machine_mode mode, |
+ int *punsignedp, |
+ const_tree funtype ATTRIBUTE_UNUSED, |
+ int for_return ATTRIBUTE_UNUSED) |
+{ |
+ return promote_mode (type, mode, punsignedp); |
+} |
+ |
+ |
+enum machine_mode |
default_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2) |
{ |
if (m1 == m2) |
@@ -111,6 +151,13 @@ default_return_in_memory (const_tree type, |
} |
rtx |
+default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED, |
+ enum machine_mode mode ATTRIBUTE_UNUSED) |
+{ |
+ return x; |
+} |
+ |
+rtx |
default_expand_builtin_saveregs (void) |
{ |
error ("__builtin_saveregs not supported by this target"); |
@@ -349,7 +396,7 @@ default_fixed_point_supported_p (void) |
/* NULL if INSN insn is valid within a low-overhead loop, otherwise returns |
an error message. |
- |
+ |
This function checks whether a given INSN is valid within a low-overhead |
loop. If INSN is invalid it returns the reason for that, otherwise it |
returns NULL. A called function may clobber any special registers required |
@@ -362,19 +409,17 @@ default_invalid_within_doloop (const_rtx insn) |
{ |
if (CALL_P (insn)) |
return "Function call in loop."; |
- |
- if (JUMP_P (insn) |
- && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC |
- || GET_CODE (PATTERN (insn)) == ADDR_VEC)) |
+ |
+ if (JUMP_TABLE_DATA_P (insn)) |
return "Computed branch in the loop."; |
- |
+ |
return NULL; |
} |
/* Mapping of builtin functions to vectorized variants. */ |
tree |
-default_builtin_vectorized_function (enum built_in_function fn ATTRIBUTE_UNUSED, |
+default_builtin_vectorized_function (tree fndecl ATTRIBUTE_UNUSED, |
tree type_out ATTRIBUTE_UNUSED, |
tree type_in ATTRIBUTE_UNUSED) |
{ |
@@ -384,7 +429,7 @@ default_builtin_vectorized_function (enum built_in_function fn ATTRIBUTE_UNUSED, |
/* Vectorized conversion. */ |
tree |
-default_builtin_vectorized_conversion (enum tree_code code ATTRIBUTE_UNUSED, |
+default_builtin_vectorized_conversion (unsigned int code ATTRIBUTE_UNUSED, |
tree type ATTRIBUTE_UNUSED) |
{ |
return NULL_TREE; |
@@ -393,7 +438,7 @@ default_builtin_vectorized_conversion (enum tree_code code ATTRIBUTE_UNUSED, |
/* Reciprocal. */ |
tree |
-default_builtin_reciprocal (enum built_in_function fn ATTRIBUTE_UNUSED, |
+default_builtin_reciprocal (unsigned int fn ATTRIBUTE_UNUSED, |
bool md_fn ATTRIBUTE_UNUSED, |
bool sqrt ATTRIBUTE_UNUSED) |
{ |
@@ -427,7 +472,7 @@ hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 ( |
return 0; |
} |
-void |
+void |
hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED) |
{ |
} |
@@ -453,7 +498,8 @@ default_stack_protect_guard (void) |
if (t == NULL) |
{ |
- t = build_decl (VAR_DECL, get_identifier ("__stack_chk_guard"), |
+ t = build_decl (UNKNOWN_LOCATION, |
+ VAR_DECL, get_identifier ("__stack_chk_guard"), |
ptr_type_node); |
TREE_STATIC (t) = 1; |
TREE_PUBLIC (t) = 1; |
@@ -471,7 +517,7 @@ default_stack_protect_guard (void) |
static GTY(()) tree stack_chk_fail_decl; |
-tree |
+tree |
default_external_stack_protect_fail (void) |
{ |
tree t = stack_chk_fail_decl; |
@@ -479,7 +525,8 @@ default_external_stack_protect_fail (void) |
if (t == NULL_TREE) |
{ |
t = build_function_type_list (void_type_node, NULL_TREE); |
- t = build_decl (FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t); |
+ t = build_decl (UNKNOWN_LOCATION, |
+ FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t); |
TREE_STATIC (t) = 1; |
TREE_PUBLIC (t) = 1; |
DECL_EXTERNAL (t) = 1; |
@@ -511,7 +558,7 @@ default_hidden_stack_protect_fail (void) |
if (t == NULL_TREE) |
{ |
t = build_function_type_list (void_type_node, NULL_TREE); |
- t = build_decl (FUNCTION_DECL, |
+ t = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, |
get_identifier ("__stack_chk_fail_local"), t); |
TREE_STATIC (t) = 1; |
TREE_PUBLIC (t) = 1; |
@@ -556,7 +603,18 @@ default_function_value (const_tree ret_type ATTRIBUTE_UNUSED, |
#ifdef FUNCTION_VALUE |
return FUNCTION_VALUE (ret_type, fn_decl_or_type); |
#else |
- return NULL_RTX; |
+ gcc_unreachable (); |
+#endif |
+} |
+ |
+rtx |
+default_libcall_value (enum machine_mode mode ATTRIBUTE_UNUSED, |
+ const_rtx fun ATTRIBUTE_UNUSED) |
+{ |
+#ifdef LIBCALL_VALUE |
+ return LIBCALL_VALUE (mode); |
+#else |
+ gcc_unreachable (); |
#endif |
} |
@@ -575,6 +633,50 @@ default_internal_arg_pointer (void) |
return virtual_incoming_args_rtx; |
} |
+rtx |
+default_static_chain (const_tree fndecl, bool incoming_p) |
+{ |
+ if (!DECL_STATIC_CHAIN (fndecl)) |
+ return NULL; |
+ |
+ if (incoming_p) |
+ { |
+#ifdef STATIC_CHAIN_INCOMING_REGNUM |
+ return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM); |
+#endif |
+ } |
+ |
+#ifdef STATIC_CHAIN_REGNUM |
+ return gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM); |
+#endif |
+ |
+ { |
+ static bool issued_error; |
+ if (!issued_error) |
+ { |
+ issued_error = true; |
+ sorry ("nested functions not supported on this target"); |
+ } |
+ |
+ /* It really doesn't matter what we return here, so long at it |
+ doesn't cause the rest of the compiler to crash. */ |
+ return gen_rtx_MEM (Pmode, stack_pointer_rtx); |
+ } |
+} |
+ |
+void |
+default_trampoline_init (rtx ARG_UNUSED (m_tramp), tree ARG_UNUSED (t_func), |
+ rtx ARG_UNUSED (r_chain)) |
+{ |
+ sorry ("nested function trampolines not supported on this target"); |
+} |
+ |
+enum reg_class |
+default_branch_target_register_class (void) |
+{ |
+ return NO_REGS; |
+} |
+ |
#ifdef IRA_COVER_CLASSES |
const enum reg_class * |
default_ira_cover_classes (void) |
@@ -712,6 +814,124 @@ default_builtin_vector_alignment_reachable (const_tree type, bool is_packed) |
return true; |
} |
+/* By default, assume that a target supports any factor of misalignment |
+ memory access if it supports movmisalign patten. |
+ is_packed is true if the memory access is defined in a packed struct. */ |
+bool |
+default_builtin_support_vector_misalignment (enum machine_mode mode, |
+ const_tree type |
+ ATTRIBUTE_UNUSED, |
+ int misalignment |
+ ATTRIBUTE_UNUSED, |
+ bool is_packed |
+ ATTRIBUTE_UNUSED) |
+{ |
+ if (optab_handler (movmisalign_optab, mode)->insn_code != CODE_FOR_nothing) |
+ return true; |
+ return false; |
+} |
+ |
+/* Determine whether or not a pointer mode is valid. Assume defaults |
+ of ptr_mode or Pmode - can be overridden. */ |
+bool |
+default_valid_pointer_mode (enum machine_mode mode) |
+{ |
+ return (mode == ptr_mode || mode == Pmode); |
+} |
+ |
+/* Return the mode for a pointer to a given ADDRSPACE, defaulting to ptr_mode |
+ for the generic address space only. */ |
+ |
+enum machine_mode |
+default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) |
+{ |
+ gcc_assert (ADDR_SPACE_GENERIC_P (addrspace)); |
+ return ptr_mode; |
+} |
+ |
+/* Return the mode for an address in a given ADDRSPACE, defaulting to Pmode |
+ for the generic address space only. */ |
+ |
+enum machine_mode |
+default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) |
+{ |
+ gcc_assert (ADDR_SPACE_GENERIC_P (addrspace)); |
+ return Pmode; |
+} |
+ |
+/* Named address space version of valid_pointer_mode. */ |
+ |
+bool |
+default_addr_space_valid_pointer_mode (enum machine_mode mode, addr_space_t as) |
+{ |
+ if (!ADDR_SPACE_GENERIC_P (as)) |
+ return (mode == targetm.addr_space.pointer_mode (as) |
+ || mode == targetm.addr_space.address_mode (as)); |
+ |
+ return targetm.valid_pointer_mode (mode); |
+} |
+ |
+/* Some places still assume that all pointer or address modes are the |
+ standard Pmode and ptr_mode. These optimizations become invalid if |
+ the target actually supports multiple different modes. For now, |
+ we disable such optimizations on such targets, using this function. */ |
+ |
+bool |
+target_default_pointer_address_modes_p (void) |
+{ |
+ if (targetm.addr_space.address_mode != default_addr_space_address_mode) |
+ return false; |
+ if (targetm.addr_space.pointer_mode != default_addr_space_pointer_mode) |
+ return false; |
+ |
+ return true; |
+} |
+ |
+/* Named address space version of legitimate_address_p. */ |
+ |
+bool |
+default_addr_space_legitimate_address_p (enum machine_mode mode, rtx mem, |
+ bool strict, addr_space_t as) |
+{ |
+ if (!ADDR_SPACE_GENERIC_P (as)) |
+ gcc_unreachable (); |
+ |
+ return targetm.legitimate_address_p (mode, mem, strict); |
+} |
+ |
+/* Named address space version of LEGITIMIZE_ADDRESS. */ |
+ |
+rtx |
+default_addr_space_legitimize_address (rtx x, rtx oldx, |
+ enum machine_mode mode, addr_space_t as) |
+{ |
+ if (!ADDR_SPACE_GENERIC_P (as)) |
+ return x; |
+ |
+ return targetm.legitimize_address (x, oldx, mode); |
+} |
+ |
+/* The default hook for determining if one named address space is a subset of |
+ another and to return which address space to use as the common address |
+ space. */ |
+ |
+bool |
+default_addr_space_subset_p (addr_space_t subset, addr_space_t superset) |
+{ |
+ return (subset == superset); |
+} |
+ |
+/* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be |
+ called for targets with only a generic address space. */ |
+ |
+rtx |
+default_addr_space_convert (rtx op ATTRIBUTE_UNUSED, |
+ tree from_type ATTRIBUTE_UNUSED, |
+ tree to_type ATTRIBUTE_UNUSED) |
+{ |
+ gcc_unreachable (); |
+} |
+ |
bool |
default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED) |
{ |
@@ -741,7 +961,7 @@ default_target_option_pragma_parse (tree ARG_UNUSED (args), |
} |
bool |
-default_target_option_can_inline_p (tree caller, tree callee) |
+default_target_can_inline_p (tree caller, tree callee) |
{ |
bool ret = false; |
tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee); |
@@ -765,4 +985,27 @@ default_target_option_can_inline_p (tree caller, tree callee) |
return ret; |
} |
+#ifndef HAVE_casesi |
+# define HAVE_casesi 0 |
+#endif |
+ |
+/* If the machine does not have a case insn that compares the bounds, |
+ this means extra overhead for dispatch tables, which raises the |
+ threshold for using them. */ |
+ |
+unsigned int default_case_values_threshold (void) |
+{ |
+ return (HAVE_casesi ? 4 : 5); |
+} |
+ |
+bool |
+default_have_conditional_execution (void) |
+{ |
+#ifdef HAVE_conditional_execution |
+ return HAVE_conditional_execution; |
+#else |
+ return false; |
+#endif |
+} |
+ |
#include "gt-targhooks.h" |