Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
#if !defined(NULL_TREE) && !defined(tree)
int x_last_linenum;
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
- vector is needed during the expansion phase when the total
- number of registers in the function is not yet known,
- it is copied and made bigger when necessary. */
- char *regno_pointer_flag;
- int regno_pointer_flag_length;
+ /* The length of the regno_pointer_align and x_regno_reg_rtx vectors.
+ Since these vectors are needed during the expansion phase when
+ the total number of registers in the function is not yet known,
+ the vectors are copied and made bigger when necessary. */
+ int regno_pointer_align_length;
/* 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. */
+ for that pseudo (if REG_POINTER is set in x_regno_reg_rtx).
+ Allocated in parallel with x_regno_reg_rtx. */
unsigned char *regno_pointer_align;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
- Allocated in parallel with regno_pointer_flag. */
+ Allocated in parallel with regno_pointer_align. */
rtx *x_regno_reg_rtx;
};
#define seq_stack (cfun->emit->sequence_stack)
#define REGNO_POINTER_ALIGN(REGNO) (cfun->emit->regno_pointer_align[REGNO])
-#define REGNO_POINTER_FLAG(REGNO) (cfun->emit->regno_pointer_flag[REGNO])
struct expr_status
{
/* Name of this function. */
const char *name;
+
/* Points to the FUNCTION_DECL of this function. */
tree decl;
May affect compilation of return insn or of function epilogue. */
int pops_args;
- /* Nonzero if function being compiled needs to be given an address
- where the value should be stored. */
- int returns_struct;
-
- /* Nonzero if function being compiled needs to
- return the address of where it has put a structure value. */
- int returns_pcc_struct;
-
- /* Nonzero if the current function returns a pointer type. */
- int returns_pointer;
-
- /* Nonzero if function being compiled needs to be passed a static chain. */
- int needs_context;
-
- /* Nonzero if function being compiled can call setjmp. */
- int calls_setjmp;
-
- /* Nonzero if function being compiled can call longjmp. */
- int calls_longjmp;
-
- /* Nonzero if function being compiled can call alloca,
- either as a subroutine or builtin. */
- int calls_alloca;
-
- /* Nonzero if function being compiled receives nonlocal gotos
- from nested functions. */
-
- int has_nonlocal_label;
-
- /* Nonzero if function being compiled has nonlocal gotos to parent
- function. */
- int has_nonlocal_goto;
-
- /* Nonzero if function being compiled contains nested functions. */
- int contains_functions;
-
- /* Nonzero if the function being compiled issues a computed jump. */
- int has_computed_jump;
-
- /* Nonzero if the current function is a thunk (a lightweight function that
- just adjusts one of its arguments and forwards to another function), so
- we should try to cut corners where we can. */
- int is_thunk;
-
/* If function's args have a fixed size, this is that size, in bytes.
Otherwise, it is -1.
May affect compilation of return insn or of function epilogue. */
anonymous arg can be found, if there is one. */
rtx arg_offset_rtx;
- /* Nonzero if current function uses varargs.h or equivalent.
- Zero for functions that use stdarg.h. */
- int varargs;
-
- /* Nonzero if current function uses stdarg.h or equivalent.
- Zero for functions that use varargs.h. */
- int stdarg;
-
/* Quantities of various kinds of registers
used for the current function's args. */
CUMULATIVE_ARGS args_info;
inline. */
const char *cannot_inline;
- /* Nonzero if instrumentation calls for function entry and exit should be
- generated. */
- int instrument_entry_exit;
-
- /* Nonzero if memory access checking be enabled in the current function. */
- int check_memory_usage;
-
- /* Nonzero if stack limit checking should be enabled in the current
- function. */
- int limit_stack;
+ /* Opaque pointer used by get_hard_reg_initial_val and
+ has_hard_reg_initial_val (see integrate.[hc]). */
+ struct initial_value_struct *hard_reg_initial_vals;
/* Number of function calls seen so far in current function. */
int x_function_call_count;
- /* 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
- commences. */
- int x_whole_function_mode_p;
-
- /* Nonzero if the back-end should not keep track of expressions that
- determine the size of variable-sized objects. Normally, such
- expressions are saved away, and then expanded when the next
- function is started. For example, if a parameter has a
- variable-sized type, then the size of the parameter is computed
- when the function body is entered. However, some front-ends do
- not desire this behavior. */
- int x_dont_save_pending_sizes_p;
-
/* List (chain of TREE_LIST) of LABEL_DECLs for all nonlocal labels
(labels to which there can be nonlocal gotos from nested functions)
in this function. */
during the nested function. */
struct var_refs_queue *fixup_var_refs_queue;
- /* For tree.c. */
- int all_types_permanent;
- struct momentary_level *momentary_stack;
- char *maybepermanent_firstobj;
- char *temporary_firstobj;
- char *momentary_firstobj;
- char *momentary_function_firstobj;
- struct obstack *current_obstack;
- struct obstack *function_obstack;
- struct obstack *function_maybepermanent_obstack;
- struct obstack *expression_obstack;
- struct obstack *saveable_obstack;
- struct obstack *rtl_obstack;
-
/* For integrate.c. */
int inlinable;
int no_debugging_symbols;
/* Highest label number in current function. */
int inl_max_label_num;
- /* Nonzero if the current function uses the constant pool. */
- int uses_const_pool;
-
/* For md files. */
- /* Nonzero if the current function uses pic_offset_table_rtx. */
- int uses_pic_offset_table;
/* tm.h can use this to store whatever it likes. */
struct machine_function *machine;
/* The largest alignment of slot allocated on the stack. */
/* If some insns can be deferred to the delay slots of the epilogue, the
delay list for them is recorded here. */
rtx epilogue_delay_list;
+
+ /* Collected bit flags. */
+
+ /* Nonzero if function being compiled needs to be given an address
+ where the value should be stored. */
+ unsigned int returns_struct : 1;
+
+ /* Nonzero if function being compiled needs to
+ return the address of where it has put a structure value. */
+ unsigned int returns_pcc_struct : 1;
+
+ /* Nonzero if the current function returns a pointer type. */
+ unsigned int returns_pointer : 1;
+
+ /* Nonzero if function being compiled needs to be passed a static chain. */
+ unsigned int needs_context : 1;
+
+ /* Nonzero if function being compiled can call setjmp. */
+ unsigned int calls_setjmp : 1;
+
+ /* Nonzero if function being compiled can call longjmp. */
+ unsigned int calls_longjmp : 1;
+
+ /* Nonzero if function being compiled can call alloca,
+ either as a subroutine or builtin. */
+ unsigned int calls_alloca : 1;
+
+ /* Nonzero if the function calls __builtin_eh_return. */
+ unsigned int calls_eh_return : 1;
+
+ /* Nonzero if function being compiled receives nonlocal gotos
+ from nested functions. */
+ unsigned int has_nonlocal_label : 1;
+
+ /* Nonzero if function being compiled has nonlocal gotos to parent
+ function. */
+ unsigned int has_nonlocal_goto : 1;
+
+ /* Nonzero if function being compiled contains nested functions. */
+ unsigned int contains_functions : 1;
+
+ /* Nonzero if the function being compiled issues a computed jump. */
+ unsigned int has_computed_jump : 1;
+
+ /* Nonzero if the current function is a thunk (a lightweight function that
+ just adjusts one of its arguments and forwards to another function), so
+ we should try to cut corners where we can. */
+ unsigned int is_thunk : 1;
+
+ /* Nonzero if instrumentation calls for function entry and exit should be
+ generated. */
+ unsigned int instrument_entry_exit : 1;
+
+ /* Nonzero if memory access checking be enabled in the current function. */
+ unsigned int check_memory_usage : 1;
+
+ /* Nonzero if stack limit checking should be enabled in the current
+ function. */
+ unsigned int limit_stack : 1;
+
+ /* Nonzero if current function uses varargs.h or equivalent.
+ Zero for functions that use stdarg.h. */
+ unsigned int varargs : 1;
+
+ /* Nonzero if current function uses stdarg.h or equivalent.
+ Zero for functions that use varargs.h. */
+ unsigned int stdarg : 1;
+
+ /* 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
+ commences. */
+ unsigned int x_whole_function_mode_p : 1;
+
+ /* Nonzero if the back-end should not keep track of expressions that
+ determine the size of variable-sized objects. Normally, such
+ expressions are saved away, and then expanded when the next
+ function is started. For example, if a parameter has a
+ variable-sized type, then the size of the parameter is computed
+ when the function body is entered. However, some front-ends do
+ not desire this behavior. */
+ unsigned int x_dont_save_pending_sizes_p : 1;
+
+ /* Nonzero if the current function uses the constant pool. */
+ unsigned int uses_const_pool : 1;
+
+ /* Nonzero if the current function uses pic_offset_table_rtx. */
+ unsigned int uses_pic_offset_table : 1;
+
+ /* Nonzero if the current function needs an lsda for exception handling. */
+ unsigned int uses_eh_lsda : 1;
};
/* The function currently being compiled. */
/* A list of all functions we have compiled so far. */
extern struct function *all_functions;
+/* Nonzero if we've already converted virtual regs to hard regs. */
+extern int virtuals_instantiated;
+
/* For backward compatibility... eventually these should all go away. */
#define current_function_name (cfun->name)
#define current_function_pops_args (cfun->pops_args)
#define current_function_calls_setjmp (cfun->calls_setjmp)
#define current_function_calls_alloca (cfun->calls_alloca)
#define current_function_calls_longjmp (cfun->calls_longjmp)
+#define current_function_calls_eh_return (cfun->calls_eh_return)
#define current_function_has_computed_jump (cfun->has_computed_jump)
#define current_function_contains_functions (cfun->contains_functions)
#define current_function_is_thunk (cfun->is_thunk)
/* Likewise, but for a different than the current 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. */
+/* These variables hold pointers to functions to create and destroy
+ target specific, per-function data structures. */
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 *));
+/* This variable holds a pointer to a function to register any
+ data items in the target specific, per-function data structure
+ that will need garbage collection. */
+extern void (*mark_machine_status) PARAMS ((struct function *));
/* Likewise, but for language-specific data. */
extern void (*init_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 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 *));