]>
Commit | Line | Data |
---|---|---|
4956d07c | 1 | /* Exception Handling interface routines. |
02d208ff AJ |
2 | Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 |
3 | Free Software Foundation, Inc. | |
4956d07c MS |
4 | Contributed by Mike Stump <mrs@cygnus.com>. |
5 | ||
1322177d | 6 | This file is part of GCC. |
4956d07c | 7 | |
1322177d LB |
8 | GCC is free software; you can redistribute it and/or modify it under |
9 | the terms of the GNU General Public License as published by the Free | |
10 | Software Foundation; either version 2, or (at your option) any later | |
11 | version. | |
4956d07c | 12 | |
1322177d LB |
13 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 | for more details. | |
4956d07c MS |
17 | |
18 | You should have received a copy of the GNU General Public License | |
1322177d LB |
19 | along with GCC; see the file COPYING. If not, write to the Free |
20 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
21 | 02111-1307, USA. */ | |
4956d07c | 22 | |
9a0d1e1b | 23 | |
88657302 | 24 | #ifndef GCC_VARRAY_H |
52a11cbf RH |
25 | struct varray_head_tag; |
26 | #define varray_type struct varray_head_tag * | |
9a0d1e1b AM |
27 | #endif |
28 | ||
911fdd58 | 29 | |
52a11cbf RH |
30 | /* Per-function EH data. Used only in except.c, but GC and others |
31 | manipulate pointers to the opaque type. */ | |
32 | struct eh_status; | |
911fdd58 | 33 | |
52a11cbf RH |
34 | /* Internal structure describing a region. */ |
35 | struct eh_region; | |
ce152ef8 | 36 | |
52a11cbf RH |
37 | /* Test: is exception handling turned on? */ |
38 | extern int doing_eh PARAMS ((int)); | |
ce152ef8 | 39 | |
52a11cbf RH |
40 | /* Start an exception handling region. All instructions emitted after |
41 | this point are considered to be part of the region until an | |
42 | expand_eh_region_end variant is invoked. */ | |
43 | extern void expand_eh_region_start PARAMS ((void)); | |
ce152ef8 | 44 | |
52a11cbf RH |
45 | /* End an exception handling region for a cleanup. HANDLER is an |
46 | expression to expand for the cleanup. */ | |
47 | extern void expand_eh_region_end_cleanup PARAMS ((tree)); | |
ce152ef8 | 48 | |
52a11cbf RH |
49 | /* End an exception handling region for a try block, and prepares |
50 | for subsequent calls to expand_start_catch. */ | |
51 | extern void expand_start_all_catch PARAMS ((void)); | |
911fdd58 | 52 | |
52a11cbf | 53 | /* Begin a catch clause. TYPE is an object to be matched by the |
6d41a92f OH |
54 | runtime, or a list of such objects, or null if this is a catch-all |
55 | clause. */ | |
52a11cbf | 56 | extern void expand_start_catch PARAMS ((tree)); |
911fdd58 | 57 | |
52a11cbf RH |
58 | /* End a catch clause. Control will resume after the try/catch block. */ |
59 | extern void expand_end_catch PARAMS ((void)); | |
911fdd58 | 60 | |
52a11cbf RH |
61 | /* End a sequence of catch handlers for a try block. */ |
62 | extern void expand_end_all_catch PARAMS ((void)); | |
911fdd58 | 63 | |
52a11cbf RH |
64 | /* End an exception region for an exception type filter. ALLOWED is a |
65 | TREE_LIST of TREE_VALUE objects to be matched by the runtime. | |
ff7cc307 | 66 | FAILURE is a function to invoke if a mismatch occurs. */ |
52a11cbf | 67 | extern void expand_eh_region_end_allowed PARAMS ((tree, tree)); |
911fdd58 | 68 | |
52a11cbf RH |
69 | /* End an exception region for a must-not-throw filter. FAILURE is a |
70 | function to invoke if an uncaught exception propagates this far. */ | |
71 | extern void expand_eh_region_end_must_not_throw PARAMS ((tree)); | |
911fdd58 | 72 | |
52a11cbf RH |
73 | /* End an exception region for a throw. No handling goes on here, |
74 | but it's the easiest way for the front-end to indicate what type | |
75 | is being thrown. */ | |
76 | extern void expand_eh_region_end_throw PARAMS ((tree)); | |
911fdd58 | 77 | |
52a11cbf RH |
78 | /* End a fixup region. Within this region the cleanups for the immediately |
79 | enclosing region are _not_ run. This is used for goto cleanup to avoid | |
80 | destroying an object twice. */ | |
81 | extern void expand_eh_region_end_fixup PARAMS ((tree)); | |
911fdd58 | 82 | |
76fc91c7 MM |
83 | /* Begin a region that will contain entries created with |
84 | add_partial_entry. */ | |
711d877c | 85 | extern void begin_protect_partials PARAMS ((void)); |
76fc91c7 | 86 | |
911fdd58 | 87 | /* Create a new exception region and add the handler for the region |
52a11cbf RH |
88 | onto a list. These regions will be ended (and their handlers emitted) |
89 | when end_protect_partials is invoked. */ | |
90 | extern void add_partial_entry PARAMS ((tree)); | |
911fdd58 RK |
91 | |
92 | /* End all of the pending exception regions that have handlers added with | |
52a11cbf | 93 | add_partial_entry. */ |
711d877c | 94 | extern void end_protect_partials PARAMS ((void)); |
911fdd58 | 95 | |
911fdd58 | 96 | |
52a11cbf | 97 | /* A list of labels used for exception handlers. */ |
4956d07c MS |
98 | extern rtx exception_handler_labels; |
99 | ||
0519ce30 | 100 | /* Determine if the given INSN can throw an exception. */ |
52a11cbf RH |
101 | extern bool can_throw_internal PARAMS ((rtx)); |
102 | extern bool can_throw_external PARAMS ((rtx)); | |
0519ce30 | 103 | |
fb13d4d0 | 104 | /* Return nonzero if nothing in this function can throw. */ |
52a11cbf | 105 | extern bool nothrow_function_p PARAMS ((void)); |
fb13d4d0 | 106 | |
52a11cbf RH |
107 | /* After initial rtl generation, call back to finish generating |
108 | exception support code. */ | |
109 | extern void finish_eh_generation PARAMS ((void)); | |
fb13d4d0 | 110 | |
52a11cbf RH |
111 | extern void init_eh PARAMS ((void)); |
112 | extern void init_eh_for_function PARAMS ((void)); | |
911fdd58 | 113 | |
52a11cbf RH |
114 | extern rtx reachable_handlers PARAMS ((rtx)); |
115 | extern void maybe_remove_eh_handler PARAMS ((rtx)); | |
e976b8b2 | 116 | |
52a11cbf RH |
117 | extern void convert_from_eh_region_ranges PARAMS ((void)); |
118 | extern void convert_to_eh_region_ranges PARAMS ((void)); | |
119 | extern void find_exception_handler_labels PARAMS ((void)); | |
120 | extern void output_function_exception_table PARAMS ((void)); | |
154bba13 | 121 | |
52a11cbf RH |
122 | extern void expand_builtin_unwind_init PARAMS ((void)); |
123 | extern rtx expand_builtin_eh_return_data_regno PARAMS ((tree)); | |
124 | extern rtx expand_builtin_extract_return_addr PARAMS ((tree)); | |
02d208ff | 125 | extern void expand_builtin_init_dwarf_reg_sizes PARAMS ((tree)); |
52a11cbf | 126 | extern rtx expand_builtin_frob_return_addr PARAMS ((tree)); |
efc45658 | 127 | extern rtx expand_builtin_dwarf_fp_regnum PARAMS ((void)); |
52a11cbf RH |
128 | extern void expand_builtin_eh_return PARAMS ((tree, tree)); |
129 | extern void expand_eh_return PARAMS ((void)); | |
e976b8b2 | 130 | |
86c99549 | 131 | extern rtx get_exception_pointer PARAMS ((struct function *)); |
e976b8b2 | 132 | |
52a11cbf RH |
133 | struct function; |
134 | struct inline_remap; | |
135 | extern int duplicate_eh_regions PARAMS ((struct function *, | |
136 | struct inline_remap *)); | |
e976b8b2 | 137 | |
52a11cbf | 138 | extern void sjlj_emit_function_exit_after PARAMS ((rtx)); |
e976b8b2 | 139 | |
f54a7f6f | 140 | |
e6855a2d | 141 | /* If non-NULL, this is a function that returns an expression to be |
a1f300c0 | 142 | executed if an unhandled exception is propagated out of a cleanup |
e6855a2d MM |
143 | region. For example, in C++, an exception thrown by a destructor |
144 | during stack unwinding is required to result in a call to | |
145 | `std::terminate', so the C++ version of this function returns a | |
146 | CALL_EXPR for `std::terminate'. */ | |
147 | extern tree (*lang_protect_cleanup_actions) PARAMS ((void)); | |
f54a7f6f | 148 | |
52a11cbf | 149 | /* Return true if type A catches type B. */ |
847abd1f | 150 | extern int (*lang_eh_type_covers) PARAMS ((tree a, tree b)); |
e976b8b2 | 151 | |
52a11cbf | 152 | /* Map a type to a runtime object to match type. */ |
847abd1f | 153 | extern tree (*lang_eh_runtime_type) PARAMS ((tree)); |
e976b8b2 | 154 | |
88657302 | 155 | #ifndef GCC_VARRAY_H |
52a11cbf | 156 | #undef varray_type |
0021b564 | 157 | #endif |
5aa55043 | 158 | |
531073e7 RH |
159 | |
160 | /* Just because the user configured --with-sjlj-exceptions=no doesn't | |
161 | mean that we can use call frame exceptions. Detect that the target | |
162 | has appropriate support. */ | |
163 | ||
2a1ee410 RH |
164 | #if ! (defined (EH_RETURN_DATA_REGNO) \ |
165 | && (defined (IA64_UNWIND_INFO) \ | |
84fc8b47 | 166 | || (DWARF2_UNWIND_INFO \ |
2a1ee410 RH |
167 | && defined (EH_RETURN_STACKADJ_RTX) \ |
168 | && (defined (EH_RETURN_HANDLER_RTX) \ | |
169 | || defined (HAVE_eh_return))))) | |
52a11cbf RH |
170 | #define MUST_USE_SJLJ_EXCEPTIONS 1 |
171 | #else | |
172 | #define MUST_USE_SJLJ_EXCEPTIONS 0 | |
173 | #endif | |
174 | ||
531073e7 RH |
175 | #ifdef CONFIG_SJLJ_EXCEPTIONS |
176 | # if CONFIG_SJLJ_EXCEPTIONS == 1 | |
177 | # define USING_SJLJ_EXCEPTIONS 1 | |
178 | # endif | |
179 | # if CONFIG_SJLJ_EXCEPTIONS == 0 | |
180 | # define USING_SJLJ_EXCEPTIONS 0 | |
52a11cbf RH |
181 | # ifndef EH_RETURN_DATA_REGNO |
182 | #error "EH_RETURN_DATA_REGNO required" | |
183 | # endif | |
184 | # ifndef EH_RETURN_STACKADJ_RTX | |
185 | #error "EH_RETURN_STACKADJ_RTX required" | |
186 | # endif | |
187 | # if !defined(EH_RETURN_HANDLER_RTX) && !defined(HAVE_eh_return) | |
188 | #error "EH_RETURN_HANDLER_RTX or eh_return required" | |
189 | # endif | |
531073e7 RH |
190 | # if !defined(DWARF2_UNWIND_INFO) && !defined(IA64_UNWIND_INFO) |
191 | #error "{DWARF2,IA64}_UNWIND_INFO required" | |
192 | # endif | |
193 | # endif | |
194 | #else | |
52a11cbf | 195 | # define USING_SJLJ_EXCEPTIONS MUST_USE_SJLJ_EXCEPTIONS |
531073e7 | 196 | #endif |