/* Structure for saving state for a nested function.
- Copyright (C) 1989, 92-97, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000 Free Software Foundation, Inc.
This file is part of GNU CC.
/* Line number and source file of the last line-number NOTE emitted.
This is used to avoid generating duplicates. */
int x_last_linenum;
- char *x_last_filename;
+ const char *x_last_filename;
/* A vector indexed by pseudo reg number. The allocated length
of this vector is regno_pointer_flag_length. Since this
/* Indexed by pseudo register number, if nonzero gives the known alignment
for that pseudo (if regno_pointer_flag is set).
Allocated in parallel with regno_pointer_flag. */
- char *regno_pointer_align;
+ unsigned char *regno_pointer_align;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_flag. */
NO_DEFER_POP and OK_DEFER_POP. */
int x_inhibit_defer_pop;
+ /* If PREFERRED_STACK_BOUNDARY and PUSH_ROUNDING are defined, the stack
+ boundary can be momentairly unaligned while pushing the arguments.
+ Record the delta since last aligned boundary here in order to get
+ stack alignment in the nested function calls working right. */
+ int x_stack_pointer_delta;
+
/* Nonzero means __builtin_saveregs has already been done in this function.
The value is the pseudoreg containing the value __builtin_saveregs
returned. */
#define apply_args_value (cfun->expr->x_apply_args_value)
#define forced_labels (cfun->expr->x_forced_labels)
#define pending_chain (cfun->expr->x_pending_chain)
+#define stack_pointer_delta (cfun->expr->x_stack_pointer_delta)
/* This structure can save all the important global and static variables
describing the status of the current function. */
/* Nonzero if this function is being processed in function-at-a-time
mode. In other words, if all tree structure for this function,
- including the BLOCK tree is created, before RTL generation
+ including the BLOCK tree, is created before RTL generation
commences. */
int x_whole_function_mode_p;
/* 1 + last pseudo register number possibly used for loading a copy
of a parameter of this function. */
- int x_max_parm_reg;
+ unsigned int x_max_parm_reg;
/* Vector indexed by REGNO, containing location on stack in which
to put the parm which is nominally in pseudo register REGNO,
struct machine_function *machine;
/* The largest alignment of slot allocated on the stack. */
int stack_alignment_needed;
+ /* Preferred alignment of the end of stack frame. */
+ int preferred_stack_boundary;
/* Language-specific code can use this to store whatever it likes. */
struct language_function *language;
/* Given a function decl for a containing function,
return the `struct function' for it. */
-struct function *find_function_data PROTO((tree));
+struct function *find_function_data PARAMS ((tree));
/* Pointer to chain of `struct function' for containing functions. */
extern struct function *outer_function_chain;
-/* Put all this function's BLOCK nodes into a vector and return it.
- Also store in each NOTE for the beginning or end of a block
- the index of that block in the vector. */
-extern void identify_blocks PROTO((tree, rtx));
+/* Set NOTE_BLOCK for each block note in the current function. */
+extern void identify_blocks PARAMS ((void));
+
+/* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
+ and create duplicate blocks. */
+extern void reorder_blocks PARAMS ((void));
+
+/* Set BLOCK_NUMBER for all the blocks in FN. */
+extern void number_blocks PARAMS ((tree));
/* Return size needed for stack frame based on slots so far allocated.
This size counts from zero. It is not rounded to STACK_BOUNDARY;
the caller may have to do that. */
-extern HOST_WIDE_INT get_frame_size PROTO((void));
+extern HOST_WIDE_INT get_frame_size PARAMS ((void));
/* Likewise, but for a different than the current function. */
-extern HOST_WIDE_INT get_func_frame_size PROTO((struct function *));
+extern HOST_WIDE_INT get_func_frame_size PARAMS ((struct function *));
/* These variables hold pointers to functions to
save and restore machine-specific data,
in push_function_context and pop_function_context. */
-extern void (*init_machine_status) PROTO((struct function *));
-extern void (*mark_machine_status) PROTO((struct function *));
-extern void (*save_machine_status) PROTO((struct function *));
-extern void (*restore_machine_status) PROTO((struct function *));
-extern void (*free_machine_status) PROTO((struct function *));
+extern void (*init_machine_status) PARAMS ((struct function *));
+extern void (*mark_machine_status) PARAMS ((struct function *));
+extern void (*save_machine_status) PARAMS ((struct function *));
+extern void (*restore_machine_status) PARAMS ((struct function *));
+extern void (*free_machine_status) PARAMS ((struct function *));
/* Likewise, but for language-specific data. */
-extern void (*init_lang_status) PROTO((struct function *));
-extern void (*mark_lang_status) PROTO((struct function *));
-extern void (*save_lang_status) PROTO((struct function *));
-extern void (*restore_lang_status) PROTO((struct function *));
-extern void (*free_lang_status) PROTO((struct function *));
+extern void (*init_lang_status) PARAMS ((struct function *));
+extern void (*mark_lang_status) PARAMS ((struct function *));
+extern void (*save_lang_status) PARAMS ((struct function *));
+extern void (*restore_lang_status) PARAMS ((struct function *));
+extern void (*free_lang_status) PARAMS ((struct function *));
/* Save and restore status information for a nested function. */
-extern void save_tree_status PROTO((struct function *));
-extern void restore_tree_status PROTO((struct function *));
-extern void restore_emit_status PROTO((struct function *));
-extern void free_after_parsing PROTO((struct function *));
-extern void free_after_compilation PROTO((struct function *));
+extern void save_tree_status PARAMS ((struct function *));
+extern void restore_tree_status PARAMS ((struct function *));
+extern void restore_emit_status PARAMS ((struct function *));
+extern void free_after_parsing PARAMS ((struct function *));
+extern void free_after_compilation PARAMS ((struct function *));
-extern void init_varasm_status PROTO((struct function *));
-extern void free_varasm_status PROTO((struct function *));
-extern void free_emit_status PROTO((struct function *));
-extern void free_stmt_status PROTO((struct function *));
-extern void free_eh_status PROTO((struct function *));
-extern void free_expr_status PROTO((struct function *));
+extern void init_varasm_status PARAMS ((struct function *));
+extern void free_varasm_status PARAMS ((struct function *));
+extern void free_emit_status PARAMS ((struct function *));
+extern void free_stmt_status PARAMS ((struct function *));
+extern void free_eh_status PARAMS ((struct function *));
+extern void free_expr_status PARAMS ((struct function *));
-extern rtx get_first_block_beg PROTO((void));
+extern rtx get_first_block_beg PARAMS ((void));
#ifdef RTX_CODE
-extern void diddle_return_value PROTO((enum rtx_code));
+extern void diddle_return_value PARAMS ((void (*)(rtx, void*), void*));
+extern void clobber_return_register PARAMS ((void));
+extern void use_return_register PARAMS ((void));
#endif
-extern void init_virtual_regs PROTO((struct emit_status *));
+extern void init_virtual_regs PARAMS ((struct emit_status *));
/* Called once, at initialization, to initialize function.c. */
-extern void init_function_once PROTO((void));
+extern void init_function_once PARAMS ((void));
#ifdef rtx
#undef rtx