Commit | Line | Data |
---|---|---|
9bf86ebb PR |
1 | /* Structure for saving state for a nested function. |
2 | Copyright (C) 1989, 1992 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | ||
20 | ||
21 | #ifndef NULL_TREE | |
22 | #define tree int * | |
23 | #endif | |
24 | #ifndef GET_CODE | |
25 | #define rtx int * | |
26 | #endif | |
27 | ||
28 | struct var_refs_queue | |
29 | { | |
30 | rtx modified; | |
31 | enum machine_mode promoted_mode; | |
32 | int unsignedp; | |
33 | struct var_refs_queue *next; | |
34 | }; | |
35 | ||
36 | /* Stack of pending (incomplete) sequences saved by `start_sequence'. | |
37 | Each element describes one pending sequence. | |
38 | The main insn-chain is saved in the last element of the chain, | |
39 | unless the chain is empty. */ | |
40 | ||
41 | struct sequence_stack | |
42 | { | |
43 | /* First and last insns in the chain of the saved sequence. */ | |
44 | rtx first, last; | |
45 | struct sequence_stack *next; | |
46 | }; | |
47 | ||
48 | extern struct sequence_stack *sequence_stack; | |
49 | \f | |
50 | /* This structure can save all the important global and static variables | |
51 | describing the status of the current function. */ | |
52 | ||
53 | struct function | |
54 | { | |
55 | struct function *next; | |
56 | ||
57 | /* For function.c. */ | |
58 | char *name; | |
59 | tree decl; | |
60 | int pops_args; | |
61 | int returns_struct; | |
62 | int returns_pcc_struct; | |
63 | int needs_context; | |
64 | int calls_setjmp; | |
65 | int calls_longjmp; | |
66 | int calls_alloca; | |
67 | int has_nonlocal_label; | |
68 | rtx nonlocal_goto_handler_slot; | |
69 | rtx nonlocal_goto_stack_level; | |
70 | tree nonlocal_labels; | |
71 | int args_size; | |
72 | int pretend_args_size; | |
73 | rtx arg_offset_rtx; | |
74 | int max_parm_reg; | |
75 | rtx *parm_reg_stack_loc; | |
76 | int outgoing_args_size; | |
77 | rtx return_rtx; | |
78 | rtx cleanup_label; | |
79 | rtx return_label; | |
80 | rtx save_expr_regs; | |
81 | rtx stack_slot_list; | |
82 | rtx parm_birth_insn; | |
83 | int frame_offset; | |
84 | rtx tail_recursion_label; | |
85 | rtx tail_recursion_reentry; | |
86 | rtx internal_arg_pointer; | |
87 | rtx arg_pointer_save_area; | |
88 | tree rtl_expr_chain; | |
89 | rtx last_parm_insn; | |
90 | tree context_display; | |
91 | tree trampoline_list; | |
92 | int function_call_count; | |
93 | struct temp_slot *temp_slots; | |
94 | int temp_slot_level; | |
95 | /* This slot is initialized as 0 and is added to | |
96 | during the nested function. */ | |
97 | struct var_refs_queue *fixup_var_refs_queue; | |
98 | ||
99 | /* For stmt.c */ | |
100 | struct nesting *block_stack; | |
101 | struct nesting *stack_block_stack; | |
102 | struct nesting *cond_stack; | |
103 | struct nesting *loop_stack; | |
104 | struct nesting *case_stack; | |
105 | struct nesting *nesting_stack; | |
106 | int nesting_depth; | |
107 | int block_start_count; | |
108 | tree last_expr_type; | |
109 | rtx last_expr_value; | |
110 | int expr_stmts_for_value; | |
111 | char *emit_filename; | |
112 | int emit_lineno; | |
113 | struct goto_fixup *goto_fixup_chain; | |
114 | ||
115 | /* For expr.c. */ | |
116 | int pending_stack_adjust; | |
117 | int inhibit_defer_pop; | |
118 | tree cleanups_this_call; | |
119 | rtx saveregs_value; | |
120 | rtx apply_args_value; | |
121 | rtx forced_labels; | |
122 | ||
123 | /* For emit-rtl.c. */ | |
124 | int reg_rtx_no; | |
125 | int first_label_num; | |
126 | rtx first_insn; | |
127 | rtx last_insn; | |
128 | struct sequence_stack *sequence_stack; | |
129 | int cur_insn_uid; | |
130 | int last_linenum; | |
131 | char *last_filename; | |
132 | char *regno_pointer_flag; | |
133 | int regno_pointer_flag_length; | |
134 | rtx *regno_reg_rtx; | |
135 | ||
136 | /* For stor-layout.c. */ | |
137 | tree permanent_type_chain; | |
138 | tree temporary_type_chain; | |
139 | tree permanent_type_end; | |
140 | tree temporary_type_end; | |
141 | tree pending_sizes; | |
142 | int immediate_size_expand; | |
143 | ||
144 | /* For tree.c. */ | |
145 | int all_types_permanent; | |
146 | struct momentary_level *momentary_stack; | |
147 | char *maybepermanent_firstobj; | |
148 | char *temporary_firstobj; | |
149 | char *momentary_firstobj; | |
150 | struct obstack *current_obstack; | |
151 | struct obstack *function_obstack; | |
152 | struct obstack *function_maybepermanent_obstack; | |
153 | struct obstack *expression_obstack; | |
154 | struct obstack *saveable_obstack; | |
155 | struct obstack *rtl_obstack; | |
156 | ||
157 | /* For integrate.c. */ | |
158 | int uses_const_pool; | |
159 | ||
160 | /* For md files. */ | |
161 | int uses_pic_offset_table; | |
162 | ||
163 | /* For reorg. */ | |
164 | rtx epilogue_delay_list; | |
165 | ||
166 | /* For varasm. */ | |
167 | struct constant_descriptor **const_rtx_hash_table; | |
168 | struct pool_sym **const_rtx_sym_hash_table; | |
169 | struct pool_constant *first_pool, *last_pool; | |
170 | int pool_offset; | |
171 | }; | |
172 | ||
173 | /* The FUNCTION_DECL for an inline function currently being expanded. */ | |
174 | extern tree inline_function_decl; | |
175 | ||
176 | /* Label that will go on function epilogue. | |
177 | Jumping to this label serves as a "return" instruction | |
178 | on machines which require execution of the epilogue on all returns. */ | |
179 | extern rtx return_label; | |
180 | ||
181 | /* List (chain of EXPR_LISTs) of all stack slots in this function. | |
182 | Made for the sake of unshare_all_rtl. */ | |
183 | extern rtx stack_slot_list; | |
184 | ||
185 | /* Given a function decl for a containing function, | |
186 | return the `struct function' for it. */ | |
187 | struct function *find_function_data PROTO((tree)); | |
188 | ||
189 | /* Pointer to chain of `struct function' for containing functions. */ | |
190 | extern struct function *outer_function_chain; | |
191 | ||
192 | /* Put all this function's BLOCK nodes into a vector and return it. | |
193 | Also store in each NOTE for the beginning or end of a block | |
194 | the index of that block in the vector. */ | |
195 | tree *identify_blocks PROTO((tree, rtx)); | |
196 | ||
197 | #ifdef rtx | |
198 | #undef rtx | |
199 | #endif | |
200 | ||
201 | #ifdef tree | |
202 | #undef tree | |
203 | #endif |