X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftarget.h;h=7729525512df890dc428ea56e1bef650a5423f68;hb=dc8948dbb1c662516d86df1a9575194358c1890f;hp=5b296d5df310eda2cd0ec4d3f19426a1a6ed49eb;hpb=bd1a81f7e1665d2e33cc824dd05dd7988da9f1a8;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/target.h b/gcc/target.h index 5b296d5df31..7729525512d 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -1,5 +1,5 @@ /* Data structure definitions for a generic GCC target. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it @@ -68,6 +68,12 @@ typedef int (* print_switch_fn_type) (print_switch_type, const char *); /* An example implementation for ELF targets. Defined in varasm.c */ extern int elf_record_gcc_switches (print_switch_type type, const char *); +/* 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. */ +extern bool target_default_pointer_address_modes_p (void); + struct stdarg_info; struct spec_info_def; @@ -91,6 +97,9 @@ struct _dep; /* This is defined in ddg.h . */ struct ddg; +/* This is defined in cfgloop.h . */ +struct loop; + /* Assembler instructions for creating various kinds of integer object. */ struct asm_int_op @@ -229,6 +238,10 @@ struct gcc_target translation unit. */ void (*file_end) (void); + /* Output any boilerplace text needed at the end of a + translation unit before debug and unwind info is emitted. */ + void (*code_end) (void); + /* Output an assembler pseudo-op to declare a library function name external. */ void (*external_libcall) (rtx); @@ -461,14 +474,14 @@ struct gcc_target /* Returns a code for builtin that realizes vectorized version of function, or NULL_TREE if not available. */ - tree (* builtin_vectorized_function) (unsigned, tree, tree); + tree (* builtin_vectorized_function) (tree, tree, tree); - /* Returns a code for builtin that realizes vectorized version of - conversion, or NULL_TREE if not available. */ - tree (* builtin_conversion) (unsigned, tree); + /* Returns a function declaration for a builtin that realizes the + vector conversion, or NULL_TREE if not available. */ + tree (* builtin_conversion) (unsigned, tree, tree); /* Target builtin that implements vector widening multiplication. - builtin_mul_widen_eve computes the element-by-element products + builtin_mul_widen_eve computes the element-by-element products for the even elements, and builtin_mul_widen_odd computes the element-by-element products for the odd elements. */ tree (* builtin_mul_widen_even) (tree); @@ -484,16 +497,25 @@ struct gcc_target /* Target builtin that implements vector permute. */ tree (* builtin_vec_perm) (tree, tree*); + + /* Return true if a vector created for builtin_vec_perm is valid. */ + bool (* builtin_vec_perm_ok) (tree, tree); + /* Return true if the target supports misaligned store/load of a specific factor denoted in the third parameter. The last parameter is true if the access is defined in a packed struct. */ - bool (* builtin_support_vector_misalignment) (enum machine_mode, + bool (* builtin_support_vector_misalignment) (enum machine_mode, const_tree, int, bool); } vectorize; /* The initial value of target_flags. */ int default_target_flags; + /* Allow target specific overriding of option settings after options have + been changed by an attribute or pragma or when it is reset at the + end of the code affected by an attribute or pragma. */ + void (* override_options_after_change) (void); + /* Handle target switch CODE (an OPT_* value). ARG is the argument passed to the switch; it is NULL if no argument was. VALUE is the value of ARG if CODE specifies a UInteger option, otherwise it is @@ -615,6 +637,12 @@ struct gcc_target already been generated. */ bool (* branch_target_register_callee_saved) (bool after_pe_gen); + /* Return true if the target supports conditional execution. */ + bool (* have_conditional_execution) (void); + + /* Return a new value for loop unroll size. */ + unsigned (* loop_unroll_adjust) (unsigned nunroll, struct loop *loop); + /* True if the constant X cannot be placed in the constant pool. */ bool (* cannot_force_const_mem) (rtx); @@ -696,6 +724,16 @@ struct gcc_target /* Support for named address spaces. */ struct addr_space { + /* MODE to use for a pointer into another address space. */ + enum machine_mode (* pointer_mode) (addr_space_t); + + /* MODE to use for an address in another address space. */ + enum machine_mode (* address_mode) (addr_space_t); + + /* True if MODE is valid for a pointer in __attribute__((mode("MODE"))) + in another address space. */ + bool (* valid_pointer_mode) (enum machine_mode, addr_space_t); + /* True if an address is a valid memory address to a given named address space for a given mode. */ bool (* legitimate_address_p) (enum machine_mode, rtx, bool, addr_space_t); @@ -949,7 +987,7 @@ struct gcc_target then it should be for the callee; otherwise for the caller. */ rtx (*static_chain) (const_tree fndecl, bool incoming_p); - /* Fill in the trampoline at MEM with a call to FNDECL and a + /* Fill in the trampoline at MEM with a call to FNDECL and a static chain value of CHAIN. */ void (*trampoline_init) (rtx mem, tree fndecl, rtx chain); @@ -993,7 +1031,7 @@ struct gcc_target /* Return the class for a secondary reload, and fill in extra information. */ enum reg_class (*secondary_reload) (bool, rtx, enum reg_class, enum machine_mode, - struct secondary_reload_info *); + secondary_reload_info *); /* This target hook allows the backend to perform additional processing while initializing for variable expansion. */ @@ -1011,7 +1049,7 @@ struct gcc_target /* Return the smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches. */ unsigned int (* case_values_threshold) (void); - + /* Retutn true if a function must have and use a frame pointer. */ bool (* frame_pointer_required) (void); @@ -1091,7 +1129,7 @@ struct gcc_target /* Prefixes for proxy variable and template. */ const char *var_prefix; const char *tmpl_prefix; - + /* Function to generate field definitions of the proxy variable. */ tree (*var_fields) (tree, tree *); @@ -1104,7 +1142,7 @@ struct gcc_target /* Whether we can emit debug information for TLS vars. */ bool debug_form_tls_address; - } emutls; + } emutls; struct target_option_hooks { /* Function to validate the attribute((option(...))) strings or NULL. If @@ -1136,8 +1174,8 @@ struct gcc_target /* For targets that need to mark extra registers as live on entry to the function, they should define this target hook and set their - bits in the bitmap passed in. */ - void (*live_on_entry) (bitmap); + bits in the bitmap passed in. */ + void (*live_on_entry) (bitmap); /* True if unwinding tables should be generated by default. */ bool unwind_tables_default;