GCC Middle and Back End API Reference
function.c File Reference

Data Structures

struct  temp_slot
struct  temp_slot_address_entry
struct  initial_value_pair
struct  initial_value_struct
struct  assign_parm_data_all
struct  assign_parm_data_one

Typedefs

typedef struct functionfunction_p
typedef struct initial_value_pair initial_value_pair
typedef struct initial_value_struct initial_value_struct

Functions

static struct temp_slotfind_temp_slot_from_address (rtx)
static void pad_to_arg_alignment (struct args_size *, int, struct args_size *)
static void pad_below (struct args_size *, enum machine_mode, tree)
static void reorder_blocks_1 (rtx, tree, vec< tree > *)
static int all_blocks (tree, tree *)
static treeget_block_vector (tree, int *)
tree debug_find_var_in_block_tree (tree, tree)
static void record_insns (rtx, rtx, htab_t *)
static bool contains (const_rtx, htab_t)
static void prepare_function_start (void)
static void do_clobber_return_reg (rtx, void *)
static void do_use_return_reg (rtx, void *)
static void set_insn_locations (rtx, int)
void push_function_context ()
void pop_function_context ()
void free_after_parsing ()
void free_after_compilation ()
HOST_WIDE_INT get_frame_size ()
bool frame_offset_overflow ()
static unsigned int get_stack_local_alignment ()
static bool try_fit_stack_local (HOST_WIDE_INT start, HOST_WIDE_INT length, HOST_WIDE_INT size, unsigned int alignment, HOST_WIDE_INT *poffset)
static void add_frame_space ()
rtx assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align, int kind)
rtx assign_stack_local ()
static void cut_slot_from_list ()
static void insert_slot_to_list ()
static struct temp_slot ** temp_slots_at_level ()
static int max_slot_level ()
static void move_slot_to_level ()
static void make_slot_available ()
static hashval_t temp_slot_address_compute_hash ()
static hashval_t temp_slot_address_hash ()
static int temp_slot_address_eq ()
static void insert_temp_slot_address ()
static int remove_unused_temp_slot_addresses_1 ()
static void remove_unused_temp_slot_addresses ()
static struct temp_slotfind_temp_slot_from_address ()
rtx assign_stack_temp_for_type (enum machine_mode mode, HOST_WIDE_INT size, tree type)
rtx assign_stack_temp ()
rtx assign_temp (tree type_or_decl, int memory_required, int dont_promote)
static void combine_temp_slots ()
void update_temp_slot_address ()
void preserve_temp_slots ()
void free_temp_slots ()
void push_temp_slots ()
void pop_temp_slots ()
void init_temp_slots ()
rtx get_hard_reg_initial_reg ()
rtx get_hard_reg_initial_val ()
rtx has_hard_reg_initial_val ()
unsigned int emit_initial_value_sets ()
bool initial_value_entry ()
static rtx instantiate_new_reg ()
static int instantiate_virtual_regs_in_rtx ()
static int safe_insn_predicate ()
static void instantiate_virtual_regs_in_insn ()
void instantiate_decl_rtl ()
static tree instantiate_expr ()
static void instantiate_decls_1 ()
static void instantiate_decls ()
static unsigned int instantiate_virtual_regs ()
rtl_opt_passmake_pass_instantiate_virtual_regs ()
int aggregate_value_p ()
bool use_register_for_decl ()
bool pass_by_reference (CUMULATIVE_ARGS *ca, enum machine_mode mode, tree type, bool named_arg)
bool reference_callee_copied (CUMULATIVE_ARGS *ca, enum machine_mode mode, tree type, bool named_arg)
static void assign_parms_initialize_all ()
static void split_complex_args ()
static vec< treeassign_parms_augmented_arg_list ()
static void assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm, struct assign_parm_data_one *data)
static void assign_parms_setup_varargs (struct assign_parm_data_all *all, struct assign_parm_data_one *data, bool no_rtl)
static void assign_parm_find_entry_rtl (struct assign_parm_data_all *all, struct assign_parm_data_one *data)
static bool assign_parm_is_stack_parm (struct assign_parm_data_all *all, struct assign_parm_data_one *data)
static void assign_parm_find_stack_rtl ()
static void assign_parm_adjust_entry_rtl ()
static void assign_parm_remove_parallels ()
static void assign_parm_adjust_stack_rtl ()
static bool assign_parm_setup_block_p ()
static void assign_parm_setup_block (struct assign_parm_data_all *all, tree parm, struct assign_parm_data_one *data)
static void assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, struct assign_parm_data_one *data)
static void assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm, struct assign_parm_data_one *data)
static void assign_parms_unsplit_complex (struct assign_parm_data_all *all, vec< tree > fnargs)
static void assign_parms ()
static tree gimplify_parm_type ()
gimple_seq gimplify_parameters ()
void locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs, int partial, tree fndecl, struct args_size *initial_offset_ptr, struct locate_and_pad_arg_data *locate)
static void pad_below ()
static bool regno_clobbered_at_setjmp ()
static void setjmp_vars_warning ()
static void setjmp_args_warning ()
void generate_setjmp_warnings ()
static tree block_fragments_nreverse ()
static tree blocks_nreverse_all ()
void reorder_blocks ()
void clear_block_marks ()
static void reorder_blocks_1 ()
tree blocks_nreverse ()
tree block_chainon ()
static int all_blocks ()
static treeget_block_vector ()
void number_blocks ()
DEBUG_FUNCTION tree debug_find_var_in_block_tree ()
static void invoke_set_current_function_hook ()
void set_cfun ()
void push_cfun ()
void pop_cfun ()
int get_next_funcdef_no ()
int get_last_funcdef_no ()
void allocate_struct_function ()
void push_struct_function ()
void init_dummy_function_start ()
void init_function_start ()
void expand_main_function ()
void stack_protect_prologue ()
void stack_protect_epilogue ()
void expand_function_start ()
void expand_dummy_function_end ()
void diddle_return_value (void(*doit)(rtx, void *), void *arg)
static void do_clobber_return_reg ()
void clobber_return_register ()
static void do_use_return_reg ()
static void use_return_register ()
void do_warn_unused_parameter ()
void expand_function_end ()
rtx get_arg_pointer_save_area ()
static void record_insns ()
void maybe_copy_prologue_epilogue_insn ()
static void set_insn_locations ()
static bool contains ()
int prologue_epilogue_contains ()
bool requires_stack_frame_p (rtx insn, HARD_REG_SET prologue_used, HARD_REG_SET set_up_by_prologue)
static basic_block next_block_for_reg ()
static bool move_insn_for_shrink_wrap (basic_block bb, rtx insn, const HARD_REG_SET uses, const HARD_REG_SET defs)
static void prepare_shrink_wrap ()
static void emit_use_return_register_into_block ()
static rtx gen_return_pattern ()
static void emit_return_into_block ()
void set_return_jump_label ()
static void dup_block_and_redirect (basic_block bb, basic_block copy_bb, rtx before, bitmap_head *need_prologue)
static bool active_insn_between ()
static vec< edgeconvert_jumps_to_returns (basic_block last_bb, bool simple_p, vec< edge > unconverted)
static basic_block emit_return_for_exit ()
static void thread_prologue_and_epilogue_insns ()
void reposition_prologue_and_epilogue_notes ()
const char * fndecl_name ()
const char * function_name ()
const char * current_function_name ()
static unsigned int rest_of_handle_check_leaf_regs ()
static void used_types_insert_helper ()
void used_types_insert ()
static hashval_t hash_types_used_by_vars_entry ()
hashval_t types_used_by_vars_do_hash ()
int types_used_by_vars_eq ()
void types_used_by_var_decl_insert ()
rtl_opt_passmake_pass_leaf_regs ()
static unsigned int rest_of_handle_thread_prologue_and_epilogue ()
rtl_opt_passmake_pass_thread_prologue_and_epilogue ()
static void match_asm_constraints_1 ()
static unsigned rest_of_match_asm_constraints ()
rtl_opt_passmake_pass_match_asm_constraints ()

Variables

int virtuals_instantiated
static int funcdef_no
struct machine_function *(* init_machine_status )(void)
struct functioncfun = 0
static htab_t prologue_insn_hash
static htab_t epilogue_insn_hash
htab_t types_used_by_vars_hash = NULL
vec< tree, va_gc > * types_used_by_cur_var_decl
static vec< function_pfunction_context_stack
static htab_t temp_slot_address_table
static size_t n_temp_slots_in_use
static int in_arg_offset
static int var_offset
static int dynamic_offset
static int out_arg_offset
static int cfa_offset
static int next_block_index = 2
static bool in_dummy_function
static vec< function_pcfun_stack

Typedef Documentation

typedef struct function* function_p
Stack of nested functions.   
Keep track of the cfun stack.   
Functions and data structures to keep track of the values hard regs
   had at the start of the function.   
Private type used by get_hard_reg_initial_reg, get_hard_reg_initial_val,
   and has_hard_reg_initial_val..   
???  This could be a VEC but there is currently no way to define an
   opaque VEC type.  This could be worked around by defining struct
   initial_value_pair in function.h.   

Function Documentation

static bool active_insn_between ( )
static
Return true if there are any active insns between HEAD and TAIL.   

References active_insn_p().

Referenced by thread_prologue_and_epilogue_insns().

static void add_frame_space ( )
static
Create a new frame_space structure describing free space in the stack
   frame beginning at START and ending at END, and chain it into the
   function's frame_space_list.   

References frame_space::length, frame_space::next, and frame_space::start.

Referenced by assign_stack_local_1().

int aggregate_value_p ( )
Return 1 if EXP is an aggregate type (or a value with aggregate type).
   This means a type for which function calls must pass an address to the
   function or get an address back from the function.
   EXP may be a type node or an expression (whose type is tested).   

References first_field(), get_callee_fndecl(), hard_function_value(), and targetm.

Referenced by allocate_struct_function(), assign_parms_augmented_arg_list(), emit_library_call_value_1(), execute_return_slot_opt(), expand_assignment(), expand_call(), expand_function_start(), gimple_regimplify_operands(), gimplify_modify_expr_rhs(), gimplify_return_expr(), needs_to_live_in_memory(), prepare_call_arguments(), split_function(), stack_result(), and tree_nrv().

static int all_blocks ( tree  ,
tree  
)
static
static int all_blocks ( )
static
Count the subblocks of the list starting with BLOCK.  If VECTOR is
   non-NULL, list them all into VECTOR, in a depth-first preorder
   traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
   blocks.   

References all_blocks.

void allocate_struct_function ( )
Allocate a function structure for FNDECL and set its contents
   to the defaults.  Set cfun to the newly-allocated object.
   Some of the helper functions invoked during initialization assume
   that cfun has already been set.  Therefore, assign the new object
   directly into cfun and invoke the back end hook explicitly at the
   very end, rather than initializing a temporary and calling set_cfun
   on it.

   ABSTRACT_P is true if this is a function that will never be seen by
   the middle-end.  Such functions are front-end concepts (like C++
   function templates) that do not correspond directly to functions
   placed in object files.   

References aggregate_value_p(), function::can_throw_non_call_exceptions, cfun, function::decl, get_next_funcdef_no(), init_eh_for_function(), init_machine_status, invoke_set_current_function_hook(), function::machine, function::returns_pcc_struct, function::returns_struct, function::stdarg, stdarg_p(), function::va_list_fpr_size, and function::va_list_gpr_size.

Referenced by cgraph_build_static_cdtor_1(), create_loop_fn(), finalize_size_functions(), init_function_start(), init_lowered_empty_function(), push_function_context(), and push_struct_function().

static void assign_parm_adjust_entry_rtl ( )
static
static void assign_parm_adjust_stack_rtl ( )
static
A subroutine of assign_parms.  Adjust DATA->STACK_RTL such that it's
   always valid and properly aligned.   

References assign_parm_data_one::entry_parm, assign_parm_data_one::nominal_mode, assign_parm_data_one::nominal_type, assign_parm_data_one::passed_mode, assign_parm_data_one::passed_pointer, and assign_parm_data_one::stack_parm.

Referenced by assign_parms().

static bool assign_parm_is_stack_parm ( struct assign_parm_data_all all,
struct assign_parm_data_one data 
)
static
A subroutine of assign_parms.  If there is actually space on the stack
   for this parm, count it in stack_args_size and return true.   

References args_size::constant, assign_parm_data_one::entry_parm, assign_parm_data_one::locate, assign_parm_data_one::partial, assign_parm_data_all::reg_parm_stack_space, locate_and_pad_arg_data::size, assign_parm_data_all::stack_args_size, and args_size::var.

Referenced by assign_parms().

static void assign_parm_remove_parallels ( )
static
A subroutine of assign_parms.  Reconstitute any values which were
   passed in multiple registers and would fit in a single register.   

References emit_group_store(), assign_parm_data_one::entry_parm, gen_reg_rtx(), and assign_parm_data_one::passed_type.

Referenced by assign_parm_setup_reg(), and assign_parm_setup_stack().

static bool assign_parm_setup_block_p ( )
static
A subroutine of assign_parms.  Return true if the current parameter
   should be stored as a BLKmode in the current frame.   

References downward, assign_parm_data_one::entry_parm, assign_parm_data_one::nominal_mode, assign_parm_data_one::passed_mode, assign_parm_data_one::passed_type, assign_parm_data_one::promoted_mode, and upward.

Referenced by assign_parms().

static vec<tree> assign_parms_augmented_arg_list ( )
static
A subroutine of assign_parms.  Adjust the parameter list to incorporate
   the hidden struct return argument, and (abi willing) complex args.
   Return the new parameter list.   

References aggregate_value_p(), build_pointer_type(), cfun, current_function_decl, assign_parm_data_all::function_result_decl, get_identifier(), assign_parm_data_all::orig_fnargs, function::returns_pcc_struct, split_complex_args(), targetm, type(), and vNULL.

Referenced by assign_parms(), and gimplify_parameters().

static void assign_parms_initialize_all ( )
static
static void assign_parms_setup_varargs ( struct assign_parm_data_all all,
struct assign_parm_data_one data,
bool  no_rtl 
)
static
static void assign_parms_unsplit_complex ( struct assign_parm_data_all all,
vec< tree fnargs 
)
static
rtx assign_stack_local_1 ( enum machine_mode  mode,
HOST_WIDE_INT  size,
int  align,
int  kind 
)
Allocate a stack slot of SIZE bytes and return a MEM rtx for it
   with machine mode MODE.

   ALIGN controls the amount of alignment for the address of the slot:
   0 means according to MODE,
   -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
   -2 means use BITS_PER_UNIT,
   positive specifies alignment boundary in bits.

   KIND has ASLK_REDUCE_ALIGN bit set if it is OK to reduce
   alignment and ASLK_RECORD_PAD bit set if we should remember
   extra space we allocated for alignment purposes.  When we are
   called from assign_stack_temp_for_type, it is not set so we don't
   track the same stack slot in two independent lists.

   We do not round to stack_boundary here.   

References add_frame_space(), current_function_decl, frame_offset_overflow(), gen_rtx_MEM(), get_stack_local_alignment(), HOST_WIDE_INT, frame_space::length, frame_space::next, plus_constant(), set_mem_align(), frame_space::start, trunc_int_for_mode(), try_fit_stack_local(), and virtuals_instantiated.

Referenced by assign_stack_local(), assign_stack_temp_for_type(), and setup_save_areas().

rtx assign_stack_temp ( )
Allocate a temporary stack slot and record it for possible later
   reuse.  First two arguments are same as in preceding function.   

References assign_stack_temp_for_type().

Referenced by emit_group_load_1(), emit_group_store(), emit_library_call_value_1(), expand_assignment(), expand_expr_real_1(), extract_bit_field_1(), and save_fixed_argument_area().

rtx assign_stack_temp_for_type ( enum machine_mode  mode,
HOST_WIDE_INT  size,
tree  type 
)
Allocate a temporary stack slot and record it for possible later
   reuse.

   MODE is the machine mode to be given to the returned rtx.

   SIZE is the size in units of the space required.  We do no rounding here
   since assign_stack_local will do any required rounding.

   TYPE is the type that will be used for the stack slot.   

References temp_slot::align, assign_stack_local_1(), temp_slot::base_offset, cut_slot_from_list(), temp_slot::full_size, gen_rtx_MEM(), get_alias_set(), get_stack_local_alignment(), HOST_WIDE_INT, temp_slot::in_use, insert_slot_to_list(), insert_temp_slot_address(), temp_slot::level, n_temp_slots_in_use, temp_slot::next, objects_must_conflict_p(), set_mem_alias_set(), set_mem_align(), temp_slot::size, temp_slot::slot, temp_slots_at_level(), type(), temp_slot::type, and virtuals_instantiated.

Referenced by assign_stack_temp(), assign_temp(), and expand_expr_real_1().

rtx assign_temp ( tree  type_or_decl,
int  memory_required,
int  dont_promote 
)
Assign a temporary.
   If TYPE_OR_DECL is a decl, then we are doing it on behalf of the decl
   and so that should be used in error messages.  In either case, we
   allocate of the given type.
   MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
   it is 0 if a register is OK.
   DONT_PROMOTE is 1 if we should not promote values in register
   to wider modes.   

References assign_stack_temp_for_type(), error(), gen_reg_rtx(), HOST_WIDE_INT, int_size_in_bytes(), max_int_size_in_bytes(), promote_mode(), temp_slot::size, and type().

Referenced by emit_library_call_value_1(), emit_push_insn(), expand_asm_operands(), expand_builtin_cexpi(), expand_call(), expand_cond_expr_using_cmove(), expand_constructor(), expand_expr_real_1(), expand_expr_real_2(), expand_return(), initialize_argument_information(), and store_one_arg().

tree block_chainon ( )
Concatenate two chains of blocks (chained through BLOCK_CHAIN)
   by modifying the last node in chain 1 to point to chain 2.   
static tree block_fragments_nreverse ( )
static
Reverse the order of elements in the fragment chain T of blocks,
   and return the new head of the chain (old last element).
   In addition to that clear BLOCK_SAME_RANGE flags when needed
   and adjust BLOCK_SUPERCONTEXT from the super fragment to
   its super fragment origin.   

Referenced by blocks_nreverse_all().

tree blocks_nreverse ( )
Reverse the order of elements in the chain T of blocks,
   and return the new head of the chain (old last element).   

Referenced by lower_function_body(), lower_gimple_bind(), and remap_blocks().

static tree blocks_nreverse_all ( )
static
Reverse the order of elements in the chain T of blocks,
   and return the new head of the chain (old last element).
   Also do the same on subblocks and reverse the order of elements
   in BLOCK_FRAGMENT_CHAIN as well.   

References block_fragments_nreverse().

Referenced by reorder_blocks().

void clear_block_marks ( )
Helper function for reorder_blocks.  Reset TREE_ASM_WRITTEN.   

Referenced by lower_function_body(), and reorder_blocks().

void clobber_return_register ( void  )
static void combine_temp_slots ( )
static
Combine temporary stack slots which are adjacent on the stack.

   This allows for better use of already allocated stack space.  This is only
   done for BLKmode slots because we can be sure that we won't have alignment
   problems in this case.   

References temp_slot::base_offset, cut_slot_from_list(), temp_slot::full_size, temp_slot::next, temp_slot::size, and temp_slot::slot.

Referenced by free_temp_slots().

static bool contains ( const_rtx  ,
htab_t   
)
static
static bool contains ( )
static
Determine if any INSNs in HASH are, or are part of, INSN.  Because
   we can be running after reorg, SEQUENCE rtl is possible.   
static vec<edge> convert_jumps_to_returns ( basic_block  last_bb,
bool  simple_p,
vec< edge unconverted 
)
static
LAST_BB is a block that exits, and empty of active instructions.
   Examine its predecessors for jumps that can be converted to
   (conditional) returns.   

References condjump_p(), delete_insn(), dump_file, emit_return_into_block(), emit_use_return_register_into_block(), find_edge(), edge_def::flags, basic_block_def::index, basic_block_def::preds, redirect_edge_succ(), redirect_jump(), ret_rtx, simple_return_rtx, simplejump_p(), single_succ_p(), and edge_def::src.

Referenced by thread_prologue_and_epilogue_insns().

static void cut_slot_from_list ( )
static
Removes temporary slot TEMP from LIST.   

References temp_slot::next, and temp_slot::prev.

Referenced by assign_stack_temp_for_type(), combine_temp_slots(), make_slot_available(), and move_slot_to_level().

tree debug_find_var_in_block_tree ( tree  ,
tree   
)
DEBUG_FUNCTION tree debug_find_var_in_block_tree ( )
If VAR is present in a subblock of BLOCK, return the subblock.   

References debug_find_var_in_block_tree().

void diddle_return_value ( void(*)(rtx, void *)  doit,
void *  arg 
)
Call DOIT for each hard register used as a return value from
   the current function.   

Referenced by clobber_return_register(), df_get_exit_block_use_set(), and use_return_register().

static void do_clobber_return_reg ( rtx  ,
void *   
)
static

Referenced by clobber_return_register().

static void do_clobber_return_reg ( )
static

References emit_clobber().

static void do_use_return_reg ( rtx  ,
void *   
)
static

Referenced by use_return_register().

static void do_use_return_reg ( )
static

References emit_use().

void do_warn_unused_parameter ( )
Possibly warn about unused parameters.   

References function::decl, and warning().

Referenced by cgraph_finalize_function().

static void dup_block_and_redirect ( basic_block  bb,
basic_block  copy_bb,
rtx  before,
bitmap_head need_prologue 
)
static
static basic_block emit_return_for_exit ( )
static
static void emit_return_into_block ( )
static
Insert an appropriate return pattern at the end of block BB.  This
   also means updating block_for_insn appropriately.  SIMPLE_P is
   the same as in gen_return_pattern and passed to it.   

References emit_jump_insn_after(), and gen_return_pattern().

Referenced by convert_jumps_to_returns(), emit_return_for_exit(), and thread_prologue_and_epilogue_insns().

static void emit_use_return_register_into_block ( )
static
Insert use of return register before the end of BB.   

References cc0_rtx, emit_insn_before(), end_sequence(), get_insns(), prev_cc0_setter(), reg_mentioned_p(), start_sequence(), and use_return_register().

Referenced by convert_jumps_to_returns().

void expand_dummy_function_end ( void  )
void expand_function_start ( )
void expand_main_function ( void  )
In function.c  

References emit_library_call(), init_one_libfunc(), and LCT_NORMAL.

Referenced by gimple_expand_cfg().

static struct temp_slot* find_temp_slot_from_address ( rtx  )
staticread
const char* fndecl_name ( )
Returns the name of function declared by FNDECL.   

References lang_hooks::decl_printable_name.

Referenced by function_name(), get_static_name(), and ipa_reference_read_optimization_summary().

bool frame_offset_overflow ( )
Issue an error message and return TRUE if frame OFFSET overflows in
   the signed target pointer arithmetics for function FUNC.  Otherwise
   return FALSE.   

References error_at(), HOST_WIDE_INT, and offset.

Referenced by alloc_stack_frame_space(), and assign_stack_local_1().

void free_after_compilation ( )
Clear out all parts of the state in F that can safely be discarded
   after the function has been compiled, to let garbage collection
   reclaim the memory.   

References epilogue_insn_hash, free(), memset(), prologue_insn_hash, and regno_reg_rtx.

Referenced by expand_dummy_function_end(), expand_thunk(), and rest_of_clean_state().

void free_after_parsing ( )
Clear out all parts of the state in F that can safely be discarded
   after the function has been parsed, but not compiled, to let
   garbage collection reclaim the memory.   

Referenced by expand_dummy_function_end(), and rest_of_clean_state().

void free_temp_slots ( void  )
const char* function_name ( )
static rtx gen_return_pattern ( )
static
Create a return pattern, either simple_return or return, depending on
   simple_p.   

Referenced by emit_return_into_block().

void generate_setjmp_warnings ( void  )
Generate warning messages for variables live across setjmp.   

References bitmap_empty_p(), current_function_decl, regstat_get_setjmp_crosses(), setjmp_args_warning(), setjmp_crosses, and setjmp_vars_warning().

Referenced by ira().

static tree* get_block_vector ( tree  ,
int *   
)
static

Referenced by number_blocks().

static tree* get_block_vector ( )
static
Return a vector containing all the blocks rooted at BLOCK.  The
   number of elements in the vector is stored in N_BLOCKS_P.  The
   vector is dynamically allocated; it is the caller's responsibility
   to call `free' on the pointer returned.   

References all_blocks.

HOST_WIDE_INT get_frame_size ( void  )
Return size needed for stack frame based on slots so far allocated.
   This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
   the caller may have to do that.   

Referenced by final_end_function(), final_start_function(), lra(), and reload().

rtx get_hard_reg_initial_reg ( )
If a pseudo represents an initial hard reg (or expression), return
   it, else return NULL_RTX.   

References initial_value_struct::entries, initial_value_pair::hard_reg, initial_value_struct::num_entries, initial_value_pair::pseudo, and rtx_equal_p().

rtx get_hard_reg_initial_val ( )
Make sure that there's a pseudo register of mode MODE that stores the
   initial value of hard register REGNO.  Return an rtx for such a pseudo.   

References initial_value_struct::entries, gen_reg_rtx(), gen_rtx_REG(), initial_value_pair::hard_reg, has_hard_reg_initial_val(), initial_value_struct::max_entries, initial_value_struct::num_entries, and initial_value_pair::pseudo.

int get_last_funcdef_no ( void  )
Return value of funcdef.   

References funcdef_no.

int get_next_funcdef_no ( void  )
Return value of funcdef and increase it.   

References funcdef_no.

Referenced by allocate_struct_function().

static unsigned int get_stack_local_alignment ( )
static
Return stack slot alignment in bits for TYPE and MODE.   

References lang_hooks_for_types::type_for_mode, and lang_hooks::types.

Referenced by assign_stack_local_1(), and assign_stack_temp_for_type().

static tree gimplify_parm_type ( )
static
A subroutine of gimplify_parameters, invoked via walk_tree.
   For all seen types, gimplify their sizes.   

References gimplify_type_sizes().

Referenced by gimplify_parameters().

rtx has_hard_reg_initial_val ( )
See if get_hard_reg_initial_val has been used to create a pseudo
   for the initial value of hard register REGNO in mode MODE.  Return
   the associated pseudo if so, otherwise return NULL.   

References initial_value_struct::entries, initial_value_pair::hard_reg, initial_value_struct::num_entries, and initial_value_pair::pseudo.

Referenced by get_hard_reg_initial_val().

static hashval_t hash_types_used_by_vars_entry ( )
static
Helper to Hash a struct types_used_by_vars_entry.   

References types_used_by_vars_entry::type, and types_used_by_vars_entry::var_decl.

Referenced by types_used_by_var_decl_insert(), and types_used_by_vars_do_hash().

void init_dummy_function_start ( void  )
Initialize the rtl expansion mechanism so that we can do simple things
   like generate sequences.  This is used to provide a context during global
   initialization of some passes.  You must call expand_dummy_function_end
   to exit this context.   

References in_dummy_function, prepare_function_start(), and push_struct_function().

Referenced by backend_init_target(), and lang_dependent_init_target().

void init_function_start ( )
Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
   and initialize static variables for generating RTL for the statements
   of the function.   

References allocate_struct_function(), decide_function_section(), prepare_function_start(), set_cfun(), and warning().

Referenced by expand_function(), and expand_thunk().

void init_temp_slots ( void  )
bool initial_value_entry ( )
Return the hardreg-pseudoreg initial values pair entry I and
   TRUE if I is a valid entry, or FALSE if I is not a valid entry.   

References initial_value_struct::entries, initial_value_pair::hard_reg, initial_value_struct::num_entries, and initial_value_pair::pseudo.

Referenced by allocate_initial_values().

static void insert_slot_to_list ( )
static
Inserts temporary slot TEMP to LIST.   

References temp_slot::next, and temp_slot::prev.

Referenced by assign_stack_temp_for_type(), make_slot_available(), and move_slot_to_level().

static void insert_temp_slot_address ( )
static
void instantiate_decl_rtl ( )
Subroutine of instantiate_decls.  Given RTL representing a decl,
   do any instantiation required.   

References for_each_rtx(), and instantiate_virtual_regs_in_rtx().

Referenced by instantiate_decls(), instantiate_decls_1(), and instantiate_expr().

static void instantiate_decls ( )
static
Scan all decls in FNDECL (both variables and parameters) and instantiate
   all virtual registers in their DECL_RTL's.   

References cfun, instantiate_decl_rtl(), instantiate_decls_1(), instantiate_expr(), function::local_decls, and vec_free().

Referenced by instantiate_virtual_regs().

static void instantiate_decls_1 ( )
static
Subroutine of instantiate_decls: Process all decls in the given
   BLOCK node and all its subblocks.   

References instantiate_decl_rtl(), and instantiate_expr().

Referenced by instantiate_decls().

static tree instantiate_expr ( )
static
Helper for instantiate_decls called via walk_tree: Process all decls
   in the given DECL_VALUE_EXPR.   

References instantiate_decl_rtl().

Referenced by instantiate_decls(), and instantiate_decls_1().

static rtx instantiate_new_reg ( )
static
Given a piece of RTX and a pointer to a HOST_WIDE_INT, if the RTX
   is a virtual register, return the equivalent hard register and set the
   offset indirectly through the pointer.  Otherwise, return 0.   

References cfa_offset, dynamic_offset, HOST_WIDE_INT, in_arg_offset, offset, out_arg_offset, and var_offset.

Referenced by instantiate_virtual_regs_in_insn(), and instantiate_virtual_regs_in_rtx().

static unsigned int instantiate_virtual_regs ( )
static
static int instantiate_virtual_regs_in_rtx ( )
static
A subroutine of instantiate_virtual_regs, called via for_each_rtx.
   Instantiate any virtual registers present inside of *LOC.  The expression
   is simplified, as much as possible, but is not to be considered "valid"
   in any sense implied by the target.  If any change is made, set CHANGED
   to true.   

References changed, HOST_WIDE_INT, instantiate_new_reg(), offset, plus_constant(), and simplify_gen_binary().

Referenced by instantiate_decl_rtl(), instantiate_virtual_regs(), and instantiate_virtual_regs_in_insn().

static void invoke_set_current_function_hook ( )
static
Invoke the target hook when setting cfun.  Update the optimization options
   if the function uses different options than the default.   

References in_dummy_function, init_tree_optimization_optabs(), targetm, this_fn_optabs, and this_target_optabs.

Referenced by allocate_struct_function(), and set_cfun().

void locate_and_pad_parm ( enum machine_mode  passed_mode,
tree  type,
int  in_regs,
int  partial,
tree  fndecl,
struct args_size initial_offset_ptr,
struct locate_and_pad_arg_data locate 
)
Compute the size and offset from the start of the stacked arguments for a
   parm passed in mode PASSED_MODE and with type TYPE.

   INITIAL_OFFSET_PTR points to the current offset into the stacked
   arguments.

   The starting offset and size for this parm are returned in
   LOCATE->OFFSET and LOCATE->SIZE, respectively.  When IN_REGS is
   nonzero, the offset is that of stack slot, which is returned in
   LOCATE->SLOT_OFFSET.  LOCATE->ALIGNMENT_PAD is the amount of
   padding required from the initial offset ptr to the stack slot.

   IN_REGS is nonzero if the argument will be passed in registers.  It will
   never be set if REG_PARM_STACK_SPACE is not defined.

   FNDECL is the function in which the argument was defined.

   There are two types of rounding that are done.  The first, controlled by
   TARGET_FUNCTION_ARG_BOUNDARY, forces the offset from the start of the
   argument list to be aligned to the specific boundary (in bits).  This
   rounding affects the initial and starting offsets, but not the argument
   size.

   The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
   optionally rounds the size of the parm to PARM_BOUNDARY.  The
   initial offset is not affected by this rounding, while the size always
   is and the starting offset may be.   
LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
    INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
    callers pass in the total size of args so far as
    INITIAL_OFFSET_PTR.  LOCATE->SIZE is always positive.   

References locate_and_pad_arg_data::alignment_pad, locate_and_pad_arg_data::boundary, args_size::constant, downward, host_integerp(), none, locate_and_pad_arg_data::offset, pad_below(), pad_to_arg_alignment(), locate_and_pad_arg_data::size, size_in_bytes(), locate_and_pad_arg_data::slot_offset, targetm, tree_low_cst(), args_size::var, and locate_and_pad_arg_data::where_pad.

Referenced by assign_parm_find_entry_rtl(), emit_library_call_value_1(), and initialize_argument_information().

rtl_opt_pass* make_pass_instantiate_virtual_regs ( )
rtl_opt_pass* make_pass_leaf_regs ( )
rtl_opt_pass* make_pass_match_asm_constraints ( )
rtl_opt_pass* make_pass_thread_prologue_and_epilogue ( )
static void make_slot_available ( )
static
static void match_asm_constraints_1 ( )
static
This mini-pass fixes fall-out from SSA in asm statements that have
   in-out constraints.  Say you start with

     orig = inout;
     asm ("": "+mr" (inout));
     use (orig);

   which is transformed very early to use explicit output and match operands:

     orig = inout;
     asm ("": "=mr" (inout) : "0" (inout));
     use (orig);

   Or, after SSA and copyprop,

     asm ("": "=mr" (inout_2) : "0" (inout_1));
     use (inout_1);

   Clearly inout_2 and inout_1 can't be coalesced easily anymore, as
   they represent two separate values, so they will get different pseudo
   registers during expansion.  Then, since the two operands need to match
   per the constraints, but use different pseudo registers, reload can
   only register a reload for these operands.  But reloads can only be
   satisfied by hardregs, not by memory, so we need a register for this
   reload, just because we are presented with non-matching operands.
   So, even though we allow memory for this operand, no memory can be
   used for it, just because the two operands don't match.  This can
   cause reload failures on register-starved targets.

   So it's a symptom of reload not being able to use memory for reloads
   or, alternatively it's also a symptom of both operands not coming into
   reload as matching (in which case the pseudo could go to memory just
   fine, as the alternative allows it, and no reload would be necessary).
   We fix the latter problem here, by transforming

     asm ("": "=mr" (inout_2) : "0" (inout_1));

   back to

     inout_2 = inout_1;
     asm ("": "=mr" (inout_2) : "0" (inout_2));   

References changed, df_insn_rescan(), emit_insn_before(), emit_move_insn(), end_sequence(), get_insns(), memset(), reg_overlap_mentioned_p(), replace_rtx(), rtx_equal_p(), and start_sequence().

Referenced by rest_of_match_asm_constraints().

static int max_slot_level ( )
static
Returns the maximal temporary slot level.   

Referenced by find_temp_slot_from_address().

void maybe_copy_prologue_epilogue_insn ( )
INSN has been duplicated or replaced by as COPY, perhaps by duplicating a
   basic block, splitting or peepholes.  If INSN is a prologue or epilogue
   insn, then record COPY as well.   

References copy(), epilogue_insn_hash, and prologue_insn_hash.

Referenced by duplicate_insn_chain(), and peep2_attempt().

static bool move_insn_for_shrink_wrap ( basic_block  bb,
rtx  insn,
const HARD_REG_SET  uses,
const HARD_REG_SET  defs 
)
static
Try to move INSN from BB to a successor.  Return true on success.
   USES and DEFS are the set of registers that are used and defined
   after INSN in BB.   

References bb_note(), delete_insn(), df_get_live_in(), df_get_live_out(), emit_insn_after(), next_block_for_reg(), and overlaps_hard_reg_set_p().

Referenced by prepare_shrink_wrap().

static void move_slot_to_level ( )
static
Moves temporary slot TEMP to LEVEL.   

References cut_slot_from_list(), insert_slot_to_list(), temp_slot::level, and temp_slots_at_level().

Referenced by preserve_temp_slots().

static basic_block next_block_for_reg ( )
static
See whether BB has a single successor that uses [REGNO, END_REGNO),
   and if BB is its only predecessor.  Return that block if so,
   otherwise return null.   

References edge_def::dest, df_get_live_in(), edge_def::flags, live, basic_block_def::preds, and basic_block_def::succs.

Referenced by move_insn_for_shrink_wrap().

void number_blocks ( )
Set BLOCK_NUMBER for all the blocks in FN.   

References free(), get_block_vector(), SDB_DEBUG, and XCOFF_DEBUG.

Referenced by final_start_function(), optimize_inline_calls(), and tree_function_versioning().

static void pad_below ( struct args_size ,
enum  machine_mode,
tree   
)
static

Referenced by locate_and_pad_parm().

static void pad_below ( )
static

References args_size::constant.

static void pad_to_arg_alignment ( struct args_size offset_ptr,
int  boundary,
struct args_size alignment_pad 
)
static
Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
   BOUNDARY is measured in bits, but must be a multiple of a storage unit.   

References args_size::constant, HOST_WIDE_INT, offset, and args_size::var.

Referenced by locate_and_pad_parm().

bool pass_by_reference ( CUMULATIVE_ARGS *  ca,
enum machine_mode  mode,
tree  type,
bool  named_arg 
)
void pop_function_context ( void  )
Restore the last saved context, at the end of a nested function.
   This function is called from language-specific code.   

References current_function_decl, function::decl, function_context_stack, generating_concat_p, set_cfun(), and virtuals_instantiated.

void pop_temp_slots ( void  )
Pop a temporary nesting level.  All slots in use in the current level
   are freed.   

References free_temp_slots().

Referenced by emit_library_call_value_1(), expand_assignment(), precompute_register_parameters(), rtx_for_function_call(), and store_one_arg().

static void prepare_function_start ( )
static
Reset crtl and other non-struct-function variables to defaults as
   appropriate for emitting rtl at the start of a function.   

References caller_save_needed, cfun, cse_not_expected, default_rtl_profile(), generating_concat_p, init_emit(), init_expr(), init_temp_slots(), init_varasm_status(), reg_renumber, stack_usage::static_stack_size, function::su, and virtuals_instantiated.

Referenced by init_dummy_function_start(), and init_function_start().

static void prepare_shrink_wrap ( )
static
Look for register copies in the first block of the function, and move
   them down into successor blocks if the register is used only on one
   path.  This exposes more opportunities for shrink-wrapping.  These
   kinds of sets often occur when incoming argument registers are moved
   to call-saved registers because their values are live across one or
   more calls during the function.   

References defs, and move_insn_for_shrink_wrap().

Referenced by thread_prologue_and_epilogue_insns().

void preserve_temp_slots ( )
If X could be a reference to a temporary slot, mark that slot as
   belonging to the to one level higher than the current level.  If X
   matched one of our slots, just mark that one.  Otherwise, we can't
   easily predict which it is, so upgrade all of them.

   This is called when an ({...}) construct occurs and a statement
   returns a value in memory.   

References find_temp_slot_from_address(), temp_slot::level, move_slot_to_level(), temp_slot::next, and temp_slots_at_level().

Referenced by expand_assignment(), precompute_register_parameters(), and store_one_arg().

int prologue_epilogue_contains ( )
void push_function_context ( void  )
Save the current context for compilation of a nested function.
   This is called from language-specific code.   

References allocate_struct_function(), and set_cfun().

void push_struct_function ( )
This is like allocate_struct_function, but pushes a new cfun for FNDECL
   instead of just setting it.   

References allocate_struct_function(), cfun, cfun_stack, current_function_decl, function::decl, and in_dummy_function.

Referenced by create_omp_child_function(), gimplify_function_tree(), init_dummy_function_start(), initialize_cfun(), and input_function().

void push_temp_slots ( void  )
Push deeper into the nesting level for stack temporaries.   

Referenced by emit_library_call_value_1(), expand_assignment(), precompute_register_parameters(), rtx_for_function_call(), and store_one_arg().

static void record_insns ( rtx  ,
rtx  ,
htab_t *   
)
static
We always define `record_insns' even if it's not used so that we
   can always export `prologue_epilogue_contains'.   

Referenced by thread_prologue_and_epilogue_insns().

static void record_insns ( )
static
Add a list of INSNS to the hash HASHP, possibly allocating HASHP
   for the first time.   
bool reference_callee_copied ( CUMULATIVE_ARGS *  ca,
enum machine_mode  mode,
tree  type,
bool  named_arg 
)
Return true if TYPE, which is passed by reference, should be callee
   copied instead of caller copied.   

References pack_cumulative_args(), and targetm.

Referenced by emit_library_call_value_1(), gimplify_parameters(), and initialize_argument_information().

static bool regno_clobbered_at_setjmp ( )
static
True if register REGNO was alive at a place where `setjmp' was
   called and was set more than once or is an argument.  Such regs may
   be clobbered by `longjmp'.   

References df_get_live_out(), max_reg_num(), and REG_N_SETS().

Referenced by setjmp_args_warning(), and setjmp_vars_warning().

static void remove_unused_temp_slot_addresses ( )
static
Remove all mappings of addresses to unused temp slots.   

References n_temp_slots_in_use, remove_unused_temp_slot_addresses_1(), and temp_slot_address_table.

Referenced by free_temp_slots().

static int remove_unused_temp_slot_addresses_1 ( )
static
Remove an address -> temp slot mapping entry if the temp slot is
   not in use anymore.  Callback for remove_unused_temp_slot_addresses.   

References temp_slot::in_use, temp_slot_address_entry::temp_slot, and temp_slot_address_table.

Referenced by remove_unused_temp_slot_addresses().

void reorder_blocks ( void  )
Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
   and create duplicate blocks.   
??? Need an option to either create block fragments or to create
   abstract origin duplicates of a source block.  It really depends
   on what optimization has been performed.   

References blocks_nreverse_all(), clear_block_marks(), current_function_decl, get_insns(), and reorder_blocks_1().

Referenced by reemit_insn_block_notes().

static void reorder_blocks_1 ( rtx  ,
tree  ,
vec< tree > *   
)
static

Referenced by reorder_blocks().

static void reorder_blocks_1 ( )
static

References copy_node().

void reposition_prologue_and_epilogue_notes ( void  )
Reposition the prologue-end and epilogue-begin notes after
   instruction scheduling.   

References contains(), epilogue_insn_hash, first, get_insns(), last, len, prologue_insn_hash, reorder_insns(), and edge_def::src.

Referenced by sched_rgn_finish(), and schedule_ebbs_finish().

bool requires_stack_frame_p ( rtx  insn,
HARD_REG_SET  prologue_used,
HARD_REG_SET  set_up_by_prologue 
)
Return true if INSN requires the stack frame to be set up.
   PROLOGUE_USED contains the hard registers used in the function
   prologue.  SET_UP_BY_PROLOGUE is the set of registers we expect the
   prologue to set up for the function.   

References add_to_hard_reg_set(), can_throw_internal(), function::can_throw_non_call_exceptions, cfun, df_regs_ever_live_p(), and hard_reg_set_intersect_p().

Referenced by thread_prologue_and_epilogue_insns().

static unsigned int rest_of_handle_check_leaf_regs ( )
static
static unsigned int rest_of_handle_thread_prologue_and_epilogue ( )
static
static unsigned rest_of_match_asm_constraints ( )
static
static int safe_insn_predicate ( )
static
A subroutine of instantiate_virtual_regs_in_insn.  Return true if X
   matches the predicate for insn CODE operand OPERAND.   

References insn_operand_matches().

Referenced by instantiate_virtual_regs_in_insn().

static void set_insn_locations ( rtx  ,
int   
)
static
static void set_insn_locations ( )
static
Set the location of the insn chain starting at INSN to LOC.   
void set_return_jump_label ( )
Set JUMP_LABEL for a return insn.   

References ret_rtx.

Referenced by find_end_label(), force_nonfallthru_and_redirect(), and thread_prologue_and_epilogue_insns().

static void setjmp_args_warning ( )
static
Do the appropriate part of setjmp_vars_warning
   but for arguments instead of local variables.   

References current_function_decl, regno_clobbered_at_setjmp(), and warning().

Referenced by generate_setjmp_warnings().

static void setjmp_vars_warning ( )
static
Walk the tree of blocks describing the binding levels within a
   function and warn about variables the might be killed by setjmp or
   vfork.  This is done after calling flow_analysis before register
   allocation since that will clobber the pseudo-regs to hard
   regs.   

References regno_clobbered_at_setjmp(), and warning().

Referenced by generate_setjmp_warnings().

static void split_complex_args ( )
static
If ARGS contains entries with complex types, split the entry into two
   entries of the component type.  Return a new list of substitutions are
   needed, else the old list.   

References copy_node(), layout_decl(), and targetm.

Referenced by assign_parms_augmented_arg_list().

void stack_protect_prologue ( void  )
static hashval_t temp_slot_address_compute_hash ( )
static
Compute the hash value for an address -> temp slot mapping.
   The value is cached on the mapping entry.   

References temp_slot_address_entry::address, do_not_record, and hash_rtx().

Referenced by find_temp_slot_from_address(), and insert_temp_slot_address().

static int temp_slot_address_eq ( )
static
Compare two address -> temp slot mapping entries.   

References temp_slot_address_entry::address, and exp_equiv_p().

Referenced by init_temp_slots().

static hashval_t temp_slot_address_hash ( )
static
Return the hash value for an address -> temp slot mapping.   

References temp_slot_address_entry::hash.

Referenced by init_temp_slots().

static struct temp_slot** temp_slots_at_level ( )
staticread
static void thread_prologue_and_epilogue_insns ( )
static
Generate the prologue and epilogue RTL if the machine supports it.  Thread
   this into place with notes indicating where the prologue ends and where
   the epilogue begins.  Update the basic block information when possible.

   Notes on epilogue placement:
   There are several kinds of edges to the exit block:
   * a single fallthru edge from LAST_BB
   * possibly, edges from blocks containing sibcalls
   * possibly, fake edges from infinite loops

   The epilogue is always emitted on the fallthru edge from the last basic
   block in the function, LAST_BB, into the exit block.

   If LAST_BB is empty except for a label, it is the target of every
   other basic block in the function that ends in a return.  If a
   target has a return or simple_return pattern (possibly with
   conditional variants), these basic blocks can be changed so that a
   return insn is emitted into them, and their target is adjusted to
   the real exit block.

   Notes on shrink wrapping: We implement a fairly conservative
   version of shrink-wrapping rather than the textbook one.  We only
   generate a single prologue and a single epilogue.  This is
   sufficient to catch a number of interesting cases involving early
   exits.

   First, we identify the blocks that require the prologue to occur before
   them.  These are the ones that modify a call-saved register, or reference
   any of the stack or frame pointer registers.  To simplify things, we then
   mark everything reachable from these blocks as also requiring a prologue.
   This takes care of loops automatically, and avoids the need to examine
   whether MEMs reference the frame, since it is sufficient to check for
   occurrences of the stack or frame pointer.

   We then compute the set of blocks for which the need for a prologue
   is anticipatable (borrowing terminology from the shrink-wrapping
   description in Muchnick's book).  These are the blocks which either
   require a prologue themselves, or those that have only successors
   where the prologue is anticipatable.  The prologue needs to be
   inserted on all edges from BB1->BB2 where BB2 is in ANTIC and BB1
   is not.  For the moment, we ensure that only one such edge exists.

   The epilogue is placed as described above, but we make a
   distinction between inserting return and simple_return patterns
   when modifying other blocks that end in a return.  Blocks that end
   in a sibcall omit the sibcall_epilogue if the block is not in
   ANTIC.   

References active_insn_between(), add_to_hard_reg_set(), basic_block_def::aux, bitmap_and_compl(), bitmap_bit_p(), bitmap_clear(), bitmap_clear_bit(), bitmap_default_obstack, bitmap_empty_p(), bitmap_ior_into(), bitmap_set_bit(), can_duplicate_block_p(), cfg_layout_finalize(), cfg_layout_initialize(), cfun, commit_edge_insertions(), convert_jumps_to_returns(), copy_bb(), create_basic_block(), function::decl, default_rtl_profile(), delete_insn(), edge_def::dest, df_analyze(), df_get_live_in(), df_update_entry_exit_and_calls(), dump_file, dup_block_and_redirect(), eh_returnjump_p(), ei_next(), ei_safe_edge(), emit_barrier_after(), emit_insn(), emit_insn_before(), emit_jump_insn(), emit_jump_insn_after(), emit_note(), emit_note_after(), emit_return_for_exit(), emit_return_into_block(), emit_use(), end_sequence(), epilogue_completed, epilogue_insn_hash, epilogue_location, find_fallthru_edge(), find_many_sub_basic_blocks(), edge_def::flags, gen_blockage(), get_attr_min_length(), get_insns(), get_last_bb_insn(), get_last_insn(), get_uncond_jump_length(), hard_reg_set_intersect_p(), HAVE_epilogue, HAVE_prologue, basic_block_def::index, insert_insn_on_edge(), inserted, last, last_bb, live_on_edge(), lookup_attribute(), make_edge(), make_single_succ_edge(), next_active_insn(), basic_block_def::next_bb, note_stores(), note_uses(), basic_block_def::preds, prepare_shrink_wrap(), basic_block_def::prev_bb, prologue_insn_hash, prologue_location, record_hard_reg_sets(), record_hard_reg_uses(), record_insns(), redirect_edge_and_branch_force(), reorder_insns(), requires_stack_frame_p(), returnjump_p(), rtl_profile_for_bb(), sbitmap_alloc(), sbitmap_free(), hard_reg_set_container::set, set_insn_locations(), set_return_jump_label(), simple_return_rtx, single_succ(), single_succ_edge(), single_succ_p(), split_block(), edge_def::src, start_sequence(), basic_block_def::succs, targetm, try_split(), and vNULL.

Referenced by rest_of_handle_thread_prologue_and_epilogue().

static bool try_fit_stack_local ( HOST_WIDE_INT  start,
HOST_WIDE_INT  length,
HOST_WIDE_INT  size,
unsigned int  alignment,
HOST_WIDE_INT poffset 
)
static
Determine whether it is possible to fit a stack slot of size SIZE and
   alignment ALIGNMENT into an area in the stack frame that starts at
   frame offset START and has a length of LENGTH.  If so, store the frame
   offset to be used for the stack slot in *POFFSET and return true;
   return false otherwise.  This function will extend the frame size when
   given a start/length pair that lies at the end of the frame.   

References frame_phase, and HOST_WIDE_INT.

Referenced by assign_stack_local_1().

void types_used_by_var_decl_insert ( )
hashval_t types_used_by_vars_do_hash ( )
Hash function of the types_used_by_vars_entry hash table.   

References hash_types_used_by_vars_entry().

Referenced by types_used_by_var_decl_insert().

int types_used_by_vars_eq ( )
void update_temp_slot_address ( )
Indicate that NEW_RTX is an alternate way of referring to the temp
   slot that previously was known by OLD_RTX.   

References find_temp_slot_from_address(), insert_temp_slot_address(), and rtx_equal_p().

Referenced by memory_address_addr_space(), offset_address(), and replace_equiv_address().

bool use_register_for_decl ( )
Return true if we should assign DECL a pseudo register; false if it
   should live on the local stack.   

References targetm.

Referenced by assign_parm_setup_reg(), assign_parms(), and expand_one_var().

static void use_return_register ( )
static
void used_types_insert ( )
Given a type, insert it into the used hash table in cfun.   

References cfun, DINFO_LEVEL_NONE, types_used_by_cur_var_decl, used_types_insert_helper(), and vec_safe_push().

static void used_types_insert_helper ( )
static
Insert a TYPE into the used types hash table of CFUN.   

References type().

Referenced by used_types_insert().


Variable Documentation

int cfa_offset
static
struct function* cfun = 0
The currently compiled function.   

Referenced by account_profile_record(), add_cfis_to_fde(), add_ehspec_entry(), add_loop(), add_stmt_operand(), add_stmt_to_eh_lp(), add_to_evolution_1(), add_ttypes_entry(), add_virtual_operand(), alloc_stack_frame_space(), alloc_use(), allocate_dynamic_stack_space(), allocate_struct_function(), analyze_all_variable_accesses(), analyze_memory_references(), ao_ref_from_mem(), apply_args_size(), arg_needs_copy_p(), assemble_start_function(), assign_filter_values(), assign_parm_find_data_types(), assign_parms(), assign_parms_augmented_arg_list(), avoid_folding_inline_builtin(), based_loc_descr(), bb_has_well_behaved_predecessors(), bb_to_key(), better_edge_p(), build_cgraph_edges(), build_duplicate_type(), build_scop_iteration_domain(), build_scop_scattering(), call_can_make_abnormal_goto(), canonicalize_induction_variables(), cgraph_build_static_cdtor_1(), cgraph_debug_gimple_stmt(), cgraph_mark_address_taken_node(), cgraph_rebuild_references(), cgraph_update_edges_for_call_stmt(), cheap_bb_rtx_cost_p(), check_all_va_list_escapes(), check_call(), check_data_deps(), check_stmt(), chrec_component_in_loop_num(), chrec_contains_symbols_defined_in_loop(), chrec_evaluate(), cleanup_all_empty_eh(), cleanup_dead_labels_eh(), clear_last_verified(), clear_pending_stack_adjust(), clear_special_calls(), compute_alignments(), compute_antic(), compute_cases_per_edge(), compute_defs_uses_and_gen(), compute_function_frequency(), compute_may_aliases(), compute_points_to_sets(), compute_uninit_opnds_pos(), compute_value_histograms(), connect_better_edge_p(), connect_traces(), consider_split(), construct_exit_block(), control_flow_insn_p(), convert_cfa_to_fb_loc_list(), copy_bb(), copy_cfg_body(), copy_edges_for_bb(), copy_loop_headers(), copy_loops(), copy_rename_partition_coalesce(), copy_ssa_name(), count_reg_usage(), create_loop_fn(), create_loop_tree_nodes(), create_new_def_for(), create_omp_child_function(), create_trace_edges(), cse_extended_basic_block(), cse_find_path(), current_function_has_exception_handlers(), current_function_name(), debug_loop_num(), decide_copy_try_finally(), decide_one_param_reduction(), declare_inline_vars(), decompose_multiword_subregs(), deletable_insn_p(), delete_tree_ssa(), delink_stmt_imm_use(), distribute_notes(), do_pre(), do_tablejump(), do_warn_aggressive_loop_optimizations(), dse_step0(), dump_alias_info(), dump_function_to_file(), dump_update_ssa(), dump_variable(), duplicate_eh_regions(), duplicate_loop(), duplicate_ssa_name(), dw2_build_landing_pads(), dw_loc_list(), dwarf2out_alloc_current_fde(), dwarf2out_begin_prologue(), dwarf2out_end_epilogue(), dwarf2out_frame_debug(), dwarf2out_frame_debug_expr(), dwarf2out_switch_text_section(), dwarf2out_vms_begin_epilogue(), dwarf2out_vms_end_prologue(), early_inliner(), eliminate_partially_redundant_loads(), emit_call_1(), emit_input_reload_insns(), emit_libcall_block_1(), emit_output_reload_insns(), estimate_function_body_sizes(), estimate_loops(), estimate_reg_pressure_cost(), evolution_function_is_invariant_rec_p(), execute_all_ipa_transforms(), execute_cleanup_eh(), execute_cleanup_eh_1(), execute_cse_reciprocals(), execute_cse_sincos(), execute_fixup_cfg(), execute_fold_all_builtins(), execute_fre(), execute_function_dump(), execute_function_todo(), execute_init_datastructures(), execute_ipa_pass_list(), execute_one_ipa_transform_pass(), execute_one_pass(), execute_optimize_bswap(), execute_optimize_stdarg(), execute_optimize_widening_mul(), execute_sink_code(), execute_todo(), execute_update_addresses_taken(), execute_warn_function_return(), expand_assignment(), expand_block_edges(), expand_builtin_apply(), expand_builtin_apply_args_1(), expand_builtin_eh_common(), expand_builtin_setjmp_setup(), expand_builtin_va_copy(), expand_call(), expand_call_inline(), expand_case(), expand_complex_div_wide(), expand_complex_libcall(), expand_complex_operations_1(), expand_dummy_function_end(), expand_function_end(), expand_function_start(), expand_gimple_stmt(), expand_omp_atomic_fetch_op(), expand_omp_atomic_load(), expand_omp_atomic_mutex(), expand_omp_atomic_pipeline(), expand_omp_atomic_store(), expand_omp_for(), expand_omp_for_init_counts(), expand_omp_for_static_chunk(), expand_omp_for_static_nochunk(), expand_omp_simd(), expand_omp_taskreg(), expand_parallel_call(), expand_stack_alignment(), expand_thunk(), expand_used_vars(), extract_range_from_binary_expr_1(), final(), finalize_ssa_defs(), finalize_ssa_uses(), finalize_task_copyfn(), find_decls_types_in_node(), find_func_aliases(), find_func_aliases_for_builtin_call(), find_func_clobbers(), find_moveable_store(), find_rarely_executed_basic_blocks_and_crossing_edges(), find_tail_calls(), find_traces_1_round(), find_var_candidates(), fini_reassoc(), fini_ssa_operands(), fini_ssa_renamer(), fini_ssanames(), fix_loop_structure(), flow_loops_dump(), flow_loops_find(), fold_builtin_alloca_with_align(), fold_builtin_cabs(), fold_builtin_constant_p(), fold_builtin_fputs(), fold_builtin_stpcpy(), fold_builtin_strcpy(), fold_truth_andor_1(), for_each_eh_label(), force_gimple_operand_1(), forward_propagate_into(), free_histograms(), free_stmt_operands(), gate_call_cdce(), gate_cleanup_eh(), gate_convert_to_eh_region_ranges(), gate_duplicate_computed_gotos(), gate_expand_vector_operations_ssa(), gate_handle_gcse2(), gate_handle_loop2(), gate_handle_partition_blocks(), gate_lower_eh_dispatch(), gate_no_optimization(), gate_optimize_stdarg(), gate_rtl_cprop(), gate_rtl_hoist(), gate_rtl_pre(), gate_rtl_store_motion(), gate_tree_if_conversion(), gate_tree_vectorize(), gcse_after_reload_main(), gen_eh_landing_pad(), gen_eh_region(), gen_rtx_REG(), gen_tmp_stack_mem(), get_chrec_loop(), get_component_ssa_name(), get_eh_landing_pad_from_number(), get_eh_region_and_lp_from_rtx(), get_eh_region_from_lp_number(), get_eh_region_from_number(), get_loop_copy(), get_reaching_def(), get_repl_default_def_ssa_name(), gimple_add_tmp_var(), gimple_divmod_fixed_value_transform(), gimple_divmod_values_to_profile(), gimple_duplicate_bb(), gimple_duplicate_loop_to_header_edge(), gimple_duplicate_sese_tail(), gimple_expand_builtin_pow(), gimple_expand_builtin_powi(), gimple_expand_cfg(), gimple_ic_transform(), gimple_indirect_call_to_profile(), gimple_mod_pow2_value_transform(), gimple_mod_subtract_transform(), gimple_purge_dead_abnormal_call_edges(), gimple_regimplify_operands(), gimple_set_bb(), gimple_stringops_transform(), gimple_stringops_values_to_profile(), gimple_value_profile_transformations(), gimplify_and_update_call_from_tree(), gimplify_bind_expr(), gimplify_function_tree(), gimplify_init_constructor(), graphite_copy_stmts_from_block(), graphite_initialize(), graphite_transform_loops(), gsi_remove(), gsi_replace(), hide_evolution_in_other_loops_than_loop(), indirect_refs_may_alias_p(), init_eh_for_function(), init_empty_tree_cfg(), init_lowered_empty_function(), init_parameter_lattice_values(), init_ssa_renamer(), initialize_cfun(), initialize_inlined_parameters(), inline_transform(), input_bb(), input_cfg(), input_function(), input_ssa_names(), insert(), insn_could_throw_p(), insn_live_p(), instantiate_decls(), instrument_func_entry(), intra_create_variable_infos(), ipa_early_sra(), ipa_read_optimization_summaries_1(), ipa_read_summaries_1(), ipa_sra_preliminary_function_checks(), ipa_write_optimization_summaries_1(), ipa_write_summaries_2(), ipcp_transform_function(), ira(), ira_build(), ira_setup_eliminable_regset(), is_unused_scalar_param(), local_pure_const(), local_variable_can_escape(), lookup_stmt_eh_lp(), loop_optimizer_finalize(), loop_optimizer_init(), lower_eh_constructs(), lower_function_body(), lower_gimple_return(), lra(), lto_input_tree_1(), main_tree_if_conversion(), make_edges(), make_ssa_name(), make_temp_ssa_name(), mark_addressable(), mark_all_loops_for_removal(), mark_irreducible_loops(), mark_loop_exit_edges(), mark_loops_for_removal(), mark_reachable_handlers(), mark_stmt_if_obviously_necessary(), mark_threaded_blocks(), mark_transaction_restart_calls(), mark_virtual_operand_for_renaming(), maybe_clean_eh_stmt(), maybe_hot_edge_p(), maybe_output_constant_def_contents(), maybe_remove_unreachable_handlers(), more_one_region_p(), move_block_to_fn(), move_computations(), move_sese_region_to_fn(), move_ssa_defining_stmt_for_defs(), name_registered_for_update_p(), new_label_mapper(), new_omp_context(), nonnull_arg_p(), notice_special_calls(), notice_stack_pointer_modification(), optimize_bb_for_size_p(), optimize_edge_for_size_p(), optimize_inline_calls(), optimize_insn_for_size_p(), output_cfg(), output_function(), output_gimple_stmt(), output_one_function_exception_table(), output_used_types(), parallelize_loops(), parse_ssa_operands(), partition_hot_cold_basic_blocks(), pass_init_dump_file(), perform_intra_sra(), perform_tree_ssa_dce(), pop_cfun(), prepare_block_for_update(), prepare_cmp_insn(), prepare_function_start(), print_rtl_with_bb(), process_assert_insertions(), process_bb_lives(), process_bb_node_lives(), process_scc(), profile_function(), propagate_dereference_distances(), pt_solution_empty_p(), pt_solution_includes_1(), pt_solution_includes_global(), pt_solutions_intersect_1(), ptr_parm_has_direct_uses(), push_cfun(), push_struct_function(), push_to_next_round_p(), rdg_flag_loop_exits(), rebuild_cgraph_edges(), rebuild_regno_allocno_maps(), record_loop_exits(), record_stmt_eh_region(), record_vars_into(), reemit_insn_block_notes(), reg_save(), relax_delay_slots(), release_dead_ssa_names(), release_defs(), release_function_body(), release_ssa_name(), release_ssa_name_after_update_ssa(), reload(), reload_as_needed(), remap_decls(), remap_ssa_name(), remove_bb(), remove_eh_handler(), remove_eh_handler_splicer(), remove_eh_landing_pad(), remove_stmt_from_eh_lp(), remove_unnecessary_regions(), remove_unreachable_eh_regions(), remove_unreachable_handlers(), remove_unreachable_handlers_no_lp(), remove_unused_locals(), rename_ssa_copies(), renumber_gimple_stmt_uids(), renumber_gimple_stmt_uids_in_blocks(), replace_ref_with(), requires_stack_frame_p(), reset_evolution_in_loop(), rest_of_clean_state(), rest_of_handle_postreload(), rewrite_into_loop_closed_ssa(), rewrite_into_ssa(), rewrite_stmt(), rtl_doloop(), rtl_loop_done(), rtl_move_loop_invariants(), rtl_profile_for_bb(), rtl_unroll_and_peel_loops(), rtl_unswitch(), run_scc_vn(), scan_insn(), scev_const_prop(), secname_for_decl(), set_cfun(), setup_entered_from_non_parent_p(), setup_incoming_promotions(), setup_one_parameter(), simple_mem(), simplify_binary_operation_1(), sink_clobbers(), sjlj_assign_call_site_values(), sjlj_build_landing_pads(), sjlj_emit_dispatch_table(), sms_schedule(), split_bb_make_tm_edge(), split_bbs_on_noreturn_calls(), split_function(), sra_initialize(), sra_ipa_reset_debug_stmts(), ssa_operand_alloc(), stabilize_va_list_loc(), statement_sink_location(), stmt_could_throw_p(), stream_in_histogram_value(), stringop_block_profile(), substitute_and_fold(), suitable_for_tail_call_opt_p(), suitable_for_tail_opt_p(), swap_tree_operands(), tail_merge_optimize(), thread_prologue_and_epilogue_insns(), thread_through_all_blocks(), translate_clast_user(), tree_call_cdce(), tree_complete_unroll(), tree_complete_unroll_inner(), tree_could_throw_p(), tree_estimate_probability(), tree_estimate_probability_driver(), tree_function_versioning(), tree_if_conversion(), tree_loop_distribution(), tree_optimize_tail_calls_1(), tree_parallelize_loops(), tree_ssa_dominator_optimize(), tree_ssa_lim_initialize(), tree_ssa_loop_bounds(), tree_ssa_loop_im(), tree_ssa_loop_init(), tree_ssa_loop_ivcanon(), tree_ssa_loop_ivopts(), tree_ssa_loop_prefetch(), tree_ssa_loop_unswitch(), tree_swap_operands_p(), tree_vectorize(), unshare_all_rtl_again(), unsplit_all_eh(), update_alias_info_with_stack_vars(), update_call_from_tree(), update_complex_assignment(), update_modified_stmt(), update_modified_stmts(), update_nonlocal_goto_save_area(), update_parameter_components(), update_properties_after_pass(), update_ssa(), update_stmt_operands(), used_types_insert(), va_list_counter_bump(), va_list_counter_op(), va_list_ptr_write(), vect_is_simple_iv_evolution(), vectorize_loops(), verify_curr_properties(), verify_gimple_in_cfg(), verify_gimple_label(), verify_gimple_phi(), verify_gimple_return(), verify_histograms(), verify_live_on_entry(), verify_loop_closed_ssa(), verify_loop_structure(), verify_ssa(), verify_ssa_name(), vt_find_locations(), walk_to_nondebug_insn(), want_to_gcse_p(), and warn_uninit().

vec<function_p> cfun_stack
static
Initialized with NOGC, making this poisonous to the garbage collector.   

Referenced by pop_cfun(), push_cfun(), and push_struct_function().

int dynamic_offset
static
int funcdef_no
static
Assign unique numbers to labels generated for profiling, debugging, etc.   

Referenced by get_last_funcdef_no(), and get_next_funcdef_no().

vec<function_p> function_context_stack
static

Referenced by pop_function_context().

int in_arg_offset
static
These routines are responsible for converting virtual register references
   to the actual hard register references once RTL generation is complete.

   The following four variables are used for communication between the
   routines.  They contain the offsets of the virtual registers from their
   respective hard registers.   

Referenced by instantiate_new_reg(), and instantiate_virtual_regs().

bool in_dummy_function
static
Keep track of whether we're in a dummy function context.  If we are,
   we don't want to invoke the set_current_function hook, because we'll
   get into trouble if the hook calls target_reinit () recursively or
   when the initial initialization is not yet complete.   

Referenced by expand_dummy_function_end(), init_dummy_function_start(), invoke_set_current_function_hook(), pop_cfun(), and push_struct_function().

struct machine_function*(* init_machine_status)(void)
These variables hold pointers to functions to create and destroy
   target specific, per-function data structures.   

Referenced by allocate_struct_function().

int next_block_index = 2
static
int out_arg_offset
static
htab_t prologue_insn_hash
static
htab_t temp_slot_address_table
static
A table of addresses that represent a stack slot.  The table is a mapping
   from address RTXen to a temp slot.   

Referenced by find_temp_slot_from_address(), init_temp_slots(), insert_temp_slot_address(), remove_unused_temp_slot_addresses(), and remove_unused_temp_slot_addresses_1().

vec<tree, va_gc>* types_used_by_cur_var_decl
During parsing of a global variable, this vector contains the types
   referenced by the global variable.   

Referenced by used_types_insert().

htab_t types_used_by_vars_hash = NULL
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.   

Referenced by premark_types_used_by_global_vars(), and types_used_by_var_decl_insert().

int var_offset
static
int virtuals_instantiated
Nonzero once virtual register instantiation has been done.
   assign_stack_local uses frame_pointer_rtx when this is nonzero.
   calls.c:emit_library_call_value_1 uses it to set up
   post-instantiation libcalls.   

Referenced by assign_stack_local_1(), assign_stack_temp_for_type(), emit_library_call_value_1(), instantiate_virtual_regs(), pop_function_context(), and prepare_function_start().