[multiple changes]
[gcc.git] / gcc / function.h
1 /* Structure for saving state for a nested function.
2 Copyright (C) 1989, 92-97, 1998 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21
22 #if !defined(NULL_TREE) && !defined(tree)
23 typedef union union_node *_function_tree;
24 #define tree _function_tree
25 #endif
26 #if !defined(NULL_RTX) && !defined(rtx)
27 typedef struct rtx_def *_function_rtx;
28 #define rtx _function_rtx
29 #endif
30
31 struct var_refs_queue
32 {
33 rtx modified;
34 enum machine_mode promoted_mode;
35 int unsignedp;
36 struct var_refs_queue *next;
37 };
38
39 /* Stack of pending (incomplete) sequences saved by `start_sequence'.
40 Each element describes one pending sequence.
41 The main insn-chain is saved in the last element of the chain,
42 unless the chain is empty. */
43
44 struct sequence_stack
45 {
46 /* First and last insns in the chain of the saved sequence. */
47 rtx first, last;
48 tree sequence_rtl_expr;
49 struct sequence_stack *next;
50 };
51
52 extern struct sequence_stack *sequence_stack;
53
54 /* Stack of single obstacks. */
55
56 struct simple_obstack_stack
57 {
58 struct obstack *obstack;
59 struct simple_obstack_stack *next;
60 };
61 \f
62 /* This structure can save all the important global and static variables
63 describing the status of the current function. */
64
65 struct function
66 {
67 struct function *next;
68
69 /* For function.c. */
70 char *name;
71 tree decl;
72 int pops_args;
73 int returns_struct;
74 int returns_pcc_struct;
75 int returns_pointer;
76 int needs_context;
77 int calls_setjmp;
78 int calls_longjmp;
79 int calls_alloca;
80 int has_nonlocal_label;
81 int has_nonlocal_goto;
82 int contains_functions;
83 int has_computed_jump;
84 int is_thunk;
85 rtx nonlocal_goto_handler_slots;
86 rtx nonlocal_goto_handler_labels;
87 rtx nonlocal_goto_stack_level;
88 tree nonlocal_labels;
89 int args_size;
90 int pretend_args_size;
91 rtx arg_offset_rtx;
92 int varargs;
93 int stdarg;
94 int max_parm_reg;
95 rtx *parm_reg_stack_loc;
96 int outgoing_args_size;
97 rtx return_rtx;
98 rtx cleanup_label;
99 rtx return_label;
100 rtx save_expr_regs;
101 rtx stack_slot_list;
102 rtx parm_birth_insn;
103 HOST_WIDE_INT frame_offset;
104 rtx tail_recursion_label;
105 rtx tail_recursion_reentry;
106 rtx internal_arg_pointer;
107 char *cannot_inline;
108 rtx arg_pointer_save_area;
109 tree rtl_expr_chain;
110 rtx last_parm_insn;
111 tree context_display;
112 tree trampoline_list;
113 int function_call_count;
114 struct temp_slot *temp_slots;
115 int temp_slot_level;
116 int target_temp_slot_level;
117 int var_temp_slot_level;
118 int instrument_entry_exit;
119 /* This slot is initialized as 0 and is added to
120 during the nested function. */
121 struct var_refs_queue *fixup_var_refs_queue;
122 CUMULATIVE_ARGS args_info;
123
124 /* For stmt.c */
125 struct nesting *block_stack;
126 struct nesting *stack_block_stack;
127 struct nesting *cond_stack;
128 struct nesting *loop_stack;
129 struct nesting *case_stack;
130 struct nesting *nesting_stack;
131 int nesting_depth;
132 int block_start_count;
133 tree last_expr_type;
134 rtx last_expr_value;
135 int expr_stmts_for_value;
136 char *emit_filename;
137 int emit_lineno;
138 struct goto_fixup *goto_fixup_chain;
139
140 /* For exception handling information. */
141 struct eh_stack ehstack;
142 struct eh_stack catchstack;
143 struct eh_queue ehqueue;
144 rtx catch_clauses;
145 struct label_node *false_label_stack;
146 struct label_node *caught_return_label_stack;
147 tree protect_list;
148 rtx ehc;
149
150 /* For expr.c. */
151 rtx pending_chain;
152 int pending_stack_adjust;
153 int inhibit_defer_pop;
154 rtx saveregs_value;
155 rtx apply_args_value;
156 rtx forced_labels;
157 int check_memory_usage;
158
159 /* For emit-rtl.c. */
160 int reg_rtx_no;
161 int first_label_num;
162 rtx first_insn;
163 rtx last_insn;
164 tree sequence_rtl_expr;
165 struct sequence_stack *sequence_stack;
166 int cur_insn_uid;
167 int last_linenum;
168 char *last_filename;
169 char *regno_pointer_flag;
170 char *regno_pointer_align;
171 int regno_pointer_flag_length;
172 rtx *regno_reg_rtx;
173
174 /* For stor-layout.c. */
175 tree permanent_type_chain;
176 tree temporary_type_chain;
177 tree permanent_type_end;
178 tree temporary_type_end;
179 tree pending_sizes;
180 int immediate_size_expand;
181
182 /* For tree.c. */
183 int all_types_permanent;
184 struct momentary_level *momentary_stack;
185 char *maybepermanent_firstobj;
186 char *temporary_firstobj;
187 char *momentary_firstobj;
188 char *momentary_function_firstobj;
189 struct obstack *current_obstack;
190 struct obstack *function_obstack;
191 struct obstack *function_maybepermanent_obstack;
192 struct obstack *expression_obstack;
193 struct obstack *saveable_obstack;
194 struct obstack *rtl_obstack;
195 struct simple_obstack_stack *inline_obstacks;
196
197 /* For integrate.c. */
198 int uses_const_pool;
199
200 /* For md files. */
201 int uses_pic_offset_table;
202 /* tm.h can use this to store whatever it likes. */
203 struct machine_function *machine;
204
205 /* For reorg. */
206 rtx epilogue_delay_list;
207
208 /* For varasm. */
209 struct constant_descriptor **const_rtx_hash_table;
210 struct pool_sym **const_rtx_sym_hash_table;
211 struct pool_constant *first_pool, *last_pool;
212 int pool_offset;
213 rtx const_double_chain;
214 };
215
216 /* The FUNCTION_DECL for an inline function currently being expanded. */
217 extern tree inline_function_decl;
218
219 /* Label that will go on parm cleanup code, if any.
220 Jumping to this label runs cleanup code for parameters, if
221 such code must be run. Following this code is the logical return label. */
222
223 extern rtx cleanup_label;
224
225 /* Label that will go on function epilogue.
226 Jumping to this label serves as a "return" instruction
227 on machines which require execution of the epilogue on all returns. */
228
229 extern rtx return_label;
230
231 /* Offset to end of allocated area of stack frame.
232 If stack grows down, this is the address of the last stack slot allocated.
233 If stack grows up, this is the address for the next slot. */
234 extern HOST_WIDE_INT frame_offset;
235
236 /* Label to jump back to for tail recursion, or 0 if we have
237 not yet needed one for this function. */
238 extern rtx tail_recursion_label;
239
240 /* Place after which to insert the tail_recursion_label if we need one. */
241 extern rtx tail_recursion_reentry;
242
243 /* Location at which to save the argument pointer if it will need to be
244 referenced. There are two cases where this is done: if nonlocal gotos
245 exist, or if vars whose is an offset from the argument pointer will be
246 needed by inner routines. */
247
248 extern rtx arg_pointer_save_area;
249
250 /* Chain of all RTL_EXPRs that have insns in them. */
251 extern tree rtl_expr_chain;
252
253 /* List (chain of EXPR_LISTs) of all stack slots in this function.
254 Made for the sake of unshare_all_rtl. */
255 extern rtx stack_slot_list;
256
257 /* Given a function decl for a containing function,
258 return the `struct function' for it. */
259 struct function *find_function_data PROTO((tree));
260
261 /* Pointer to chain of `struct function' for containing functions. */
262 extern struct function *outer_function_chain;
263
264 /* Put all this function's BLOCK nodes into a vector and return it.
265 Also store in each NOTE for the beginning or end of a block
266 the index of that block in the vector. */
267 extern tree *identify_blocks PROTO((tree, rtx));
268
269 /* Return size needed for stack frame based on slots so far allocated.
270 This size counts from zero. It is not rounded to STACK_BOUNDARY;
271 the caller may have to do that. */
272 extern HOST_WIDE_INT get_frame_size PROTO((void));
273
274 /* These variables hold pointers to functions to
275 save and restore machine-specific data,
276 in push_function_context and pop_function_context. */
277 extern void (*save_machine_status) PROTO((struct function *));
278 extern void (*restore_machine_status) PROTO((struct function *));
279
280 /* Save and restore status information for a nested function. */
281 extern void save_tree_status PROTO((struct function *, tree));
282 extern void restore_tree_status PROTO((struct function *, tree));
283 extern void save_varasm_status PROTO((struct function *, tree));
284 extern void restore_varasm_status PROTO((struct function *));
285 extern void save_eh_status PROTO((struct function *));
286 extern void restore_eh_status PROTO((struct function *));
287 extern void save_stmt_status PROTO((struct function *));
288 extern void restore_stmt_status PROTO((struct function *));
289 extern void save_expr_status PROTO((struct function *));
290 extern void restore_expr_status PROTO((struct function *));
291 extern void save_emit_status PROTO((struct function *));
292 extern void restore_emit_status PROTO((struct function *));
293 extern void save_storage_status PROTO((struct function *));
294 extern void restore_storage_status PROTO((struct function *));
295
296 extern rtx get_first_block_beg PROTO((void));
297
298 #ifdef rtx
299 #undef rtx
300 #endif
301
302 #ifdef tree
303 #undef tree
304 #endif