X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ffunction.h;h=fcfa825e0a9b26bcc53fcbd0c8e6edafad7adea2;hb=fc8788d51783c21bb740f5a6dc13d5c5bd13bb9b;hp=de3a46acc52944a1d7a52a1c3370afd02c32a6d3;hpb=26dbec0a1e1fd4ef42b2e44d85551616db36d780;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/function.h b/gcc/function.h index de3a46acc52..fcfa825e0a9 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -24,7 +24,9 @@ along with GCC; see the file COPYING3. If not see #include "tree.h" #include "hashtab.h" -#include "varray.h" +#include "vecprim.h" +#include "tm.h" /* For CUMULATIVE_ARGS. */ +#include "hard-reg-set.h" /* Stack of pending (incomplete) sequences saved by `start_sequence'. Each element describes one pending sequence. @@ -64,6 +66,10 @@ struct GTY(()) emit_status { Reset to 1 for each function compiled. */ int x_cur_insn_uid; + /* INSN_UID for next debug insn emitted. Only used if + --param min-nondebug-insn-uid= is given with nonzero value. */ + int x_cur_debug_insn_uid; + /* Location the last line-number NOTE emitted. This is used to avoid generating duplicates. */ location_t x_last_location; @@ -82,7 +88,7 @@ struct GTY(()) emit_status { /* Indexed by pseudo register number, gives the rtx for that pseudo. - Allocated in parallel with regno_pointer_align. + Allocated in parallel with regno_pointer_align. FIXME: We could put it into emit_status struct, but gengtype is not able to deal with length attribute nested in top level structures. */ @@ -140,11 +146,6 @@ DEF_VEC_ALLOC_P(call_site_record, gc); /* RTL representation of exception handling. */ struct GTY(()) rtl_eh { - rtx filter; - rtx exc_ptr; - - int built_landing_pads; - rtx ehr_stackadj; rtx ehr_handler; rtx ehr_label; @@ -152,11 +153,9 @@ struct GTY(()) rtl_eh { rtx sjlj_fc; rtx sjlj_exit_after; - VEC(tree,gc) *ttype_data; - varray_type ehspec_data; - varray_type action_record_data; + VEC(uchar,gc) *action_record_data; - VEC(call_site_record,gc) *call_site_record; + VEC(call_site_record,gc) *call_site_record[2]; }; #define pending_stack_adjust (crtl->expr.x_pending_stack_adjust) @@ -179,17 +178,6 @@ typedef struct ipa_opt_pass_d *ipa_opt_pass; DEF_VEC_P(ipa_opt_pass); DEF_VEC_ALLOC_P(ipa_opt_pass,heap); -enum function_frequency { - /* This function most likely won't be executed at all. - (set only when profile feedback is available or via function attribute). */ - FUNCTION_FREQUENCY_UNLIKELY_EXECUTED, - /* The default value. */ - FUNCTION_FREQUENCY_NORMAL, - /* Optimize this function hard - (set only when profile feedback is available or via function attribute). */ - FUNCTION_FREQUENCY_HOT -}; - struct GTY(()) varasm_status { /* If we're using a per-function constant pool, this is it. */ struct rtx_constant_pool *pool; @@ -238,11 +226,17 @@ struct GTY(()) function_subsections { const char *cold_section_label; const char *hot_section_end_label; const char *cold_section_end_label; +}; - /* String to be used for name of cold text sections, via - targetm.asm_out.named_section. */ +/* Describe an empty area of space in the stack frame. These can be chained + into a list; this is used to keep track of space wasted for alignment + reasons. */ +struct GTY(()) frame_space +{ + struct frame_space *next; - const char *unlikely_text_section_name; + HOST_WIDE_INT start; + HOST_WIDE_INT length; }; /* Datastructures maintained for currently processed function in RTL form. */ @@ -292,6 +286,9 @@ struct GTY(()) rtl_data { Made for the sake of unshare_all_rtl. */ rtx x_stack_slot_list; + /* List of empty areas in the stack frame. */ + struct frame_space *frame_space_list; + /* Place after which to insert the tail_recursion_label if we need one. */ rtx x_stack_check_probe_note; @@ -338,7 +335,7 @@ struct GTY(()) rtl_data { /* The stack alignment estimated before reload, with consideration of following factors: 1. Alignment of local stack variables (max_used_stack_slot_alignment) - 2. Alignment requirement to call other functions + 2. Alignment requirement to call other functions (preferred_stack_boundary) 3. Alignment of non-local stack variables but might be spilled in local stack. */ @@ -364,7 +361,7 @@ struct GTY(()) rtl_data { /* Nonzero if function being compiled has nonlocal gotos to parent function. */ bool has_nonlocal_goto; - + /* Nonzero if function being compiled has an asm statement. */ bool has_asm_statement; @@ -436,6 +433,12 @@ struct GTY(()) rtl_data { TREE_NOTHROW (current_function_decl) it is set even for overwritable function where currently compiled version of it is nothrow. */ bool nothrow; + + /* Like regs_ever_live, but 1 if a reg is set or clobbered from an + asm. Unlike regs_ever_live, elements of this array corresponding + to eliminable regs (like the frame pointer) are set if an asm + sets them. */ + HARD_REG_SET asm_clobbers; }; #define return_label (crtl->x_return_label) @@ -460,6 +463,37 @@ extern GTY(()) struct rtl_data x_rtl; want to do differently. */ #define crtl (&x_rtl) +struct GTY(()) stack_usage +{ + /* # of bytes of static stack space allocated by the function. */ + HOST_WIDE_INT static_stack_size; + + /* # of bytes of dynamic stack space allocated by the function. This is + meaningful only if has_unbounded_dynamic_stack_size is zero. */ + HOST_WIDE_INT dynamic_stack_size; + + /* # of bytes of space pushed onto the stack after the prologue. If + !ACCUMULATE_OUTGOING_ARGS, it contains the outgoing arguments. */ + int pushed_stack_size; + + /* # of dynamic allocations in the function. */ + unsigned int dynamic_alloc_count : 31; + + /* Nonzero if the amount of stack space allocated dynamically cannot + be bounded at compile-time. */ + unsigned int has_unbounded_dynamic_stack_size : 1; +}; + +#define current_function_static_stack_size (cfun->su->static_stack_size) +#define current_function_dynamic_stack_size (cfun->su->dynamic_stack_size) +#define current_function_pushed_stack_size (cfun->su->pushed_stack_size) +#define current_function_dynamic_alloc_count (cfun->su->dynamic_alloc_count) +#define current_function_has_unbounded_dynamic_stack_size \ + (cfun->su->has_unbounded_dynamic_stack_size) +#define current_function_allocates_dynamic_stack_space \ + (current_function_dynamic_stack_size != 0 \ + || current_function_has_unbounded_dynamic_stack_size) + /* This structure can save all the important global and static variables describing the status of the current function. */ @@ -478,6 +512,9 @@ struct GTY(()) function { /* The loops in this function. */ struct loops *x_current_loops; + /* The stack usage of this function. */ + struct stack_usage *su; + /* Value histograms attached to particular statements. */ htab_t GTY((skip)) value_histograms; @@ -491,12 +528,12 @@ struct GTY(()) function { tree static_chain_decl; /* An expression that contains the non-local goto save area. The first - word is the saved frame pointer and the second is the saved stack + word is the saved frame pointer and the second is the saved stack pointer. */ tree nonlocal_goto_save_area; - /* List of function local variables, functions, types and constants. */ - tree local_decls; + /* Vector of function local variables, functions, types and constants. */ + VEC(tree,gc) *local_decls; /* For md files. */ @@ -524,10 +561,11 @@ struct GTY(()) function { /* Properties used by the pass manager. */ unsigned int curr_properties; unsigned int last_verified; - /* Interprocedural passes scheduled to have their transform functions - applied next time we execute local pass on them. We maintain it - per-function in order to allow IPA passes to introduce new functions. */ - VEC(ipa_opt_pass,heap) * GTY((skip)) ipa_transforms_to_apply; + + /* Non-null if the function does something that would prevent it from + being copied; this applies to both versioning and inlining. Set to + a string describing the reason for failure. */ + const char * GTY((skip)) cannot_be_copied_reason; /* Collected bit flags. */ @@ -540,11 +578,6 @@ struct GTY(()) function { function. */ unsigned int va_list_fpr_size : 8; - - /* How commonly executed the function is. Initialized during branch - probabilities pass. */ - ENUM_BITFIELD (function_frequency) function_frequency : 2; - /* Nonzero if function being compiled can call setjmp. */ unsigned int calls_setjmp : 1; @@ -556,6 +589,11 @@ struct GTY(()) function { from nested functions. */ unsigned int has_nonlocal_label : 1; + /* Nonzero if we've set cannot_be_copied_reason. I.e. if + (cannot_be_copied_set && !cannot_be_copied_reason), the function + can in fact be copied. */ + unsigned int cannot_be_copied_set : 1; + /* Nonzero if current function uses stdarg.h or equivalent. */ unsigned int stdarg : 1; @@ -571,6 +609,10 @@ struct GTY(()) function { unsigned int after_inlining : 1; unsigned int always_inline_functions_inlined : 1; + /* Nonzero if function being compiled can throw synchronous non-call + exceptions. */ + unsigned int can_throw_non_call_exceptions : 1; + /* Fields below this point are not set for abstract functions; see allocate_struct_function. */ @@ -596,6 +638,17 @@ struct GTY(()) function { unsigned int is_thunk : 1; }; +/* Add the decl D to the local_decls list of FUN. */ + +static inline void +add_local_decl (struct function *fun, tree d) +{ + VEC_safe_push (tree, gc, fun->local_decls, d); +} + +#define FOR_EACH_LOCAL_DECL(FUN, I, D) \ + FOR_EACH_VEC_ELT_REVERSE (tree, (FUN)->local_decls, I, D) + /* If va_list_[gf]pr_size is set to this, it means we don't know how many units need to be saved. */ #define VA_LIST_MAX_GPR_SIZE 255 @@ -615,6 +668,28 @@ extern int virtuals_instantiated; /* Nonzero if at least one trampoline has been created. */ extern int trampolines_created; +struct GTY(()) types_used_by_vars_entry { + tree type; + tree var_decl; +}; + +/* Hash table making the relationship between a global variable + and the types it references in its initializer. The key of the + entry is a referenced type, and the value is the DECL of the global + variable. types_use_by_vars_do_hash and types_used_by_vars_eq below are + the hash and equality functions to use for this hash table. */ +extern GTY((param_is (struct types_used_by_vars_entry))) htab_t + types_used_by_vars_hash; + +hashval_t types_used_by_vars_do_hash (const void*); +int types_used_by_vars_eq (const void *, const void *); +void types_used_by_var_decl_insert (tree type, tree var_decl); + +/* During parsing of a global variable, this vector contains the types + referenced by the global variable. */ +extern GTY(()) VEC(tree,gc) *types_used_by_cur_var_decl; + + /* cfun shouldn't be set directly; use one of these functions instead. */ extern void set_cfun (struct function *new_cfun); extern void push_cfun (struct function *new_cfun); @@ -679,4 +754,9 @@ extern bool reference_callee_copied (CUMULATIVE_ARGS *, enum machine_mode, extern void used_types_insert (tree); extern int get_next_funcdef_no (void); + +/* In predict.c */ +extern bool optimize_function_for_size_p (struct function *); +extern bool optimize_function_for_speed_p (struct function *); + #endif /* GCC_FUNCTION_H */