OSDN Git Service

Remove change of Oct 4.
[pf3gnuchains/gcc-fork.git] / gcc / except.h
1 /* Exception Handling interface routines.
2    Copyright (C) 1996 Free Software Foundation, Inc.
3    Contributed by Mike Stump <mrs@cygnus.com>.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 #ifndef GET_CODE
24 #define rtx int *
25 #endif
26
27 #ifdef TREE_CODE
28
29 /* A stack of labels. CHAIN points to the next entry in the stack.  */
30
31 struct label_node {
32   union {
33     rtx rlabel;
34     tree tlabel;
35   } u;
36   struct label_node *chain;
37 };
38
39 /* An eh_entry is used to describe one exception handling region.
40
41    START_LABEL is the label corresponding to the start of the region.
42
43    END_LABEL is the label corresponding to the end of the region.
44
45    EXCEPTION_HANDLER_LABEL is the label corresponding to the handler
46    for this region.
47
48    FINALIZATION is the tree codes for the handler, or is NULL_TREE if
49    one hasn't been generated yet, or is integer_zero_node to mark the
50    end of a group of try blocks.  */
51
52 struct eh_entry {
53   rtx start_label;
54   rtx end_label;
55   rtx exception_handler_label;
56
57   tree finalization;
58 };
59
60 /* A list of EH_ENTRYs. ENTRY is the entry; CHAIN points to the next
61    entry in the list, or is NULL if this is the last entry.  */
62
63 struct eh_node {
64   struct eh_entry *entry;
65   struct eh_node *chain;
66 };
67
68 /* A stack of EH_ENTRYs. TOP is the topmost entry on the stack. TOP is
69    NULL if the stack is empty.  */
70
71 struct eh_stack {
72   struct eh_node *top;
73 };
74
75 /* A queue of EH_ENTRYs. HEAD is the front of the queue; TAIL is the
76    end (the latest entry). HEAD and TAIL are NULL if the queue is
77    empty.  */
78
79 struct eh_queue {
80   struct eh_node *head;
81   struct eh_node *tail;
82 };
83
84
85 extern void expand_eh_region_start              PROTO((void));
86
87 extern void expand_eh_region_end                PROTO((tree));
88
89 /* Push RLABEL or TLABEL onto LABELSTACK. Only one of RLABEL or TLABEL
90    should be set; the other must be NULL.  */
91
92 extern void push_label_entry                    PROTO((struct label_node **labelstack, rtx rlabel, tree tlabel));
93
94 /* Pop the topmost entry from LABELSTACK and return its value as an
95    rtx node. If LABELSTACK is empty, return NULL.  */
96
97 extern rtx pop_label_entry                      PROTO((struct label_node **labelstack));
98
99 /* Return the topmost entry of LABELSTACK as a tree node, or return
100    NULL_TREE if LABELSTACK is empty.  */
101
102 extern tree top_label_entry                     PROTO((struct label_node **labelstack));
103
104 /* The stack used to keep track of the exception region corresponding to
105    the current instruction.  */
106
107 extern struct eh_stack ehstack;
108
109 /* A queue used to track closed exception regions whose handlers have
110    not been emitted yet.  */
111
112 extern struct eh_queue ehqueue;
113
114 /* A set of insns for the catch clauses in the current function. They
115    will be emitted at the end of the current function.  */
116
117 extern rtx catch_clauses;
118
119 #endif
120
121 struct function;
122
123 /* Toplevel initialization for EH.  */
124
125 extern void init_eh                             PROTO((void));
126
127 /* Initialization for the per-function EH data.  */
128
129 extern void init_eh_for_function                PROTO((void));
130
131 /* Saves the current per-function EH data into P.  */
132
133 extern void save_eh_status                      PROTO((struct function *p));
134
135 /* Restores the per-function EH data from P.  */
136
137 extern void restore_eh_status                   PROTO((struct function *p));
138
139 /* Adds an EH table entry for EH entry number N. Called from
140    final_scan_insn for NOTE_INSN_EH_REGION_BEG.  */
141
142 extern void add_eh_table_entry                  PROTO((int n));
143
144 /* Returns a non-zero value if we need to output an exception table.  */
145
146 extern int exception_table_p                    PROTO((void));
147
148 /* Outputs the exception table if we have one.  */
149
150 extern void output_exception_table              PROTO((void));
151
152 /* Given a return address in ADDR, determine the address we should use
153    to find the corresponding EH region.  */
154
155 extern rtx eh_outer_context                     PROTO((rtx addr));
156
157 /* Called at the start of a block of try statements for which there is
158    a supplied catch handler.  */
159
160 extern void expand_start_try_stmts              PROTO((void));
161
162 /* Called at the start of a block of catch statements. It terminates the
163    previous set of try statements.  */
164
165 extern void expand_start_all_catch              PROTO((void));
166
167 /* Called at the end of a block of catch statements.  */
168
169 extern void expand_end_all_catch                PROTO((void));
170
171 #ifdef TREE_CODE
172 /* Create a new exception region and add the handler for the region
173    onto a list. These regions will be ended (and their handlers
174    emitted) when end_protect_partials is invoked.  */
175
176 extern void add_partial_entry                   PROTO((tree handler));
177 #endif
178
179 /* End all of the pending exception regions that have handlers added with
180    push_protect_entry ().  */
181
182 extern void end_protect_partials                PROTO((void));
183
184 /* An internal throw with a direct CONTEXT we want to throw
185    from. CONTEXT must be a label.  */
186
187 extern void expand_internal_throw               PROTO((rtx context));
188
189 /* Called from expand_exception_blocks and expand_end_catch_block to
190    expand and pending handlers.  */
191
192 extern void expand_leftover_cleanups            PROTO((void));
193
194 /* If necessary, emit insns for the start of per-function unwinder for
195    the current function.  */
196
197 extern void emit_unwinder                       PROTO((void));
198
199 /* If necessary, emit insns for the end of the per-function unwinder
200    for the current function.  */
201
202 extern void end_eh_unwinder                     PROTO((void));
203
204 /* Builds a list of handler labels and puts them in the global
205    variable exception_handler_labels.  */
206
207 extern void find_exception_handler_labels       PROTO((void));
208
209 /* Performs sanity checking on the check_exception_handler_labels
210    list.  */
211
212 extern void check_exception_handler_labels      PROTO((void));
213
214 /* A stack used to keep track of the label used to resume normal program
215    flow out of the current exception handler region.  */
216
217 extern struct label_node *caught_return_label_stack;
218
219 /* A random area used for purposes elsewhere.  */
220
221 extern struct label_node *false_label_stack;
222
223 /* A list of labels used for exception handlers. It is created by
224    find_exception_handler_labels for the optimization passes.  */
225
226 extern rtx exception_handler_labels;
227
228 /* The rtx for the saved PC value.  */
229
230 extern rtx eh_saved_pc_rtx;
231
232 /* Performs optimizations for exception handling, such as removing
233    unnecessary exception regions. Invoked from jump_optimize ().  */
234
235 extern void exception_optimize                  PROTO((void));