-/* Datastructures maintained for currently processed function in RTL form. */
-struct GTY(()) rtl_data {
- struct expr_status expr;
- struct emit_status emit;
- struct varasm_status varasm;
- struct incoming_args args;
- struct function_subsections subsections;
- struct rtl_eh eh;
-
- /* For function.c */
-
- /* # of bytes of outgoing arguments. If ACCUMULATE_OUTGOING_ARGS is
- defined, the needed space is pushed by the prologue. */
- int outgoing_args_size;
-
- /* If nonzero, an RTL expression for the location at which the current
- function returns its result. If the current function returns its
- result in a register, current_function_return_rtx will always be
- the hard register containing the result. */
- rtx return_rtx;
-
- /* Vector of initial-value pairs. Each pair consists of a pseudo
- register of approprite mode that stores the initial value a hard
- register REGNO, and that hard register itself. */
- /* ??? This could be a VEC but there is currently no way to define an
- opaque VEC type. */
- struct initial_value_struct *hard_reg_initial_vals;
-
- /* A variable living at the top of the frame that holds a known value.
- Used for detecting stack clobbers. */
- tree stack_protect_guard;
-
- /* List (chain of EXPR_LIST) of labels heading the current handlers for
- nonlocal gotos. */
- rtx_expr_list *x_nonlocal_goto_handler_labels;
-
- /* Label that will go on function epilogue.
- Jumping to this label serves as a "return" instruction
- on machines which require execution of the epilogue on all returns. */
- rtx x_return_label;
-
- /* Label that will go on the end of function epilogue.
- Jumping to this label serves as a "naked return" instruction
- on machines which require execution of the epilogue on all returns. */
- rtx x_naked_return_label;
-
- /* List (chain of EXPR_LISTs) of all stack slots in this function.
- 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_note *x_stack_check_probe_note;
-
- /* Location at which to save the argument pointer if it will need to be
- referenced. There are two cases where this is done: if nonlocal gotos
- exist, or if vars stored at an offset from the argument pointer will be
- needed by inner routines. */
- rtx x_arg_pointer_save_area;
-
- /* Dynamic Realign Argument Pointer used for realigning stack. */
- rtx drap_reg;
-
- /* Offset to end of allocated area of stack frame.
- If stack grows down, this is the address of the last stack slot allocated.
- If stack grows up, this is the address for the next slot. */
- HOST_WIDE_INT x_frame_offset;
-
- /* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
- rtx_insn *x_parm_birth_insn;
-
- /* List of all used temporaries allocated, by level. */
- vec<temp_slot_p, va_gc> *x_used_temp_slots;
-
- /* List of available temp slots. */
- struct temp_slot *x_avail_temp_slots;
-
- /* Current nesting level for temporaries. */
- int x_temp_slot_level;
-
- /* The largest alignment needed on the stack, including requirement
- for outgoing stack alignment. */
- unsigned int stack_alignment_needed;
-
- /* Preferred alignment of the end of stack frame, which is preferred
- to call other functions. */
- unsigned int preferred_stack_boundary;
-
- /* The minimum alignment of parameter stack. */
- unsigned int parm_stack_boundary;
-
- /* The largest alignment of slot allocated on the stack. */
- unsigned int max_used_stack_slot_alignment;
-
- /* 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
- (preferred_stack_boundary)
- 3. Alignment of non-local stack variables but might be spilled in
- local stack. */
- unsigned int stack_alignment_estimated;
-
- /* For reorg. */
-
- /* Nonzero if function being compiled called builtin_return_addr or
- builtin_frame_address with nonzero count. */
- bool accesses_prior_frames;
-
- /* Nonzero if the function calls __builtin_eh_return. */
- bool calls_eh_return;
-
- /* Nonzero if function saves all registers, e.g. if it has a nonlocal
- label that can reach the exit block via non-exceptional paths. */
- bool saves_all_registers;
-
- /* 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;
-
- /* This bit is used by the exception handling logic. It is set if all
- calls (if any) are sibling calls. Such functions do not have to
- have EH tables generated, as they cannot throw. A call to such a
- function, however, should be treated as throwing if any of its callees
- can throw. */
- bool all_throwers_are_sibcalls;