GCC Middle and Back End API Reference
except.h
Go to the documentation of this file.
1/* Exception Handling interface routines.
2 Copyright (C) 1996-2024 Free Software Foundation, Inc.
3 Contributed by Mike Stump <mrs@cygnus.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21/* No include guards here, but define an include file marker anyway, so
22 that the compiler can keep track of where this file is included. This
23 is e.g. used to avoid including this file in front-end specific files. */
24#ifndef GCC_EXCEPT_H
25#define GCC_EXCEPT_H
26
27
28struct function;
29struct eh_region_d;
30
31/* The type of an exception region. */
33{
34 /* CLEANUP regions implement e.g. destructors run when exiting a block.
35 They can be generated from both GIMPLE_TRY_FINALLY and GIMPLE_TRY_CATCH
36 nodes. It is expected by the runtime that cleanup regions will *not*
37 resume normal program flow, but will continue propagation of the
38 exception. */
40
41 /* TRY regions implement catching an exception. The list of types associated
42 with the attached catch handlers is examined in order by the runtime and
43 control is transferred to the appropriate handler. Note that a NULL type
44 list is a catch-all handler, and that it will catch *all* exceptions
45 including those originating from a different language. */
47
48 /* ALLOWED_EXCEPTIONS regions implement exception filtering, e.g. the
49 throw(type-list) specification that can be added to C++ functions.
50 The runtime examines the thrown exception vs the type list, and if
51 the exception does not match, transfers control to the handler. The
52 normal handler for C++ calls __cxa_call_unexpected. */
54
55 /* MUST_NOT_THROW regions prevent all exceptions from propagating. This
56 region type is used in C++ to surround destructors being run inside a
57 CLEANUP region. This differs from an ALLOWED_EXCEPTIONS region with
58 an empty type list in that the runtime is prepared to terminate the
59 program directly. We only generate code for MUST_NOT_THROW regions
60 along control paths that are already handling an exception within the
61 current function. */
63};
64
65
66/* A landing pad for a given exception region. Any transfer of control
67 from the EH runtime to the function happens at a landing pad. */
68
69struct GTY((chain_next("%h.next_lp"))) eh_landing_pad_d
70{
71 /* The linked list of all landing pads associated with the region. */
73
74 /* The region with which this landing pad is associated. */
76
77 /* At the gimple level, the location to which control will be transferred
78 for this landing pad. There can be both EH and normal edges into the
79 block containing the post-landing-pad label. */
81
82 /* At the rtl level, the location to which the runtime will transfer
83 control. This differs from the post-landing-pad in that the target's
84 EXCEPTION_RECEIVER pattern will be expanded here, as well as other
85 bookkeeping specific to exceptions. There must not be normal edges
86 into the block containing the landing-pad label. */
88
89 /* The index of this landing pad within fun->eh->lp_array. */
90 int index;
91};
92
93/* A catch handler associated with an ERT_TRY region. */
94
95struct GTY(()) eh_catch_d
96{
97 /* The double-linked list of all catch handlers for the region. */
100
101 /* A TREE_LIST of runtime type objects that this catch handler
102 will catch, or NULL if all exceptions are caught. */
104
105 /* A TREE_LIST of INTEGER_CSTs that correspond to the type_list entries,
106 having been mapped by assign_filter_values. These integers are to be
107 compared against the __builtin_eh_filter value. */
109
110 /* The code that should be executed if this catch handler matches the
111 thrown exception. This label is only maintained until
112 pass_lower_eh_dispatch, at which point it is cleared. */
114};
115
116/* Describes one exception region. */
117
118struct GTY(()) eh_region_d
119{
120 /* The immediately surrounding region. */
122
123 /* The list of immediately contained regions. */
126
127 /* The index of this region within fun->eh->region_array. */
128 int index;
129
130 /* Each region does exactly one thing. */
132
133 /* Holds the action to perform based on the preceding type. */
136 /* The double-linked list of all catch handlers for this region. */
139 } GTY ((tag ("ERT_TRY"))) eh_try;
140
142 /* A TREE_LIST of runtime type objects allowed to pass. */
144 /* The code that should be executed if the thrown exception does
145 not match the type list. This label is only maintained until
146 pass_lower_eh_dispatch, at which point it is cleared. */
148 /* The integer that will be passed by the runtime to signal that
149 we should execute the code at LABEL. This integer is assigned
150 by assign_filter_values and is to be compared against the
151 __builtin_eh_filter value. */
153 } GTY ((tag ("ERT_ALLOWED_EXCEPTIONS"))) allowed;
154
156 /* A function decl to be invoked if this region is actually reachable
157 from within the function, rather than implementable from the runtime.
158 The normal way for this to happen is for there to be a TRY region
159 contained within this MUST_NOT_THROW region. Note that if the
160 runtime handles the MUST_NOT_THROW region, we have no control over
161 what termination function is called; it will be decided by the
162 personality function in effect for this CIE. */
164 /* The location assigned to the call of FAILURE_DECL, if expanded. */
165 location_t failure_loc;
166 } GTY ((tag ("ERT_MUST_NOT_THROW"))) must_not_throw;
167 } GTY ((desc ("%0.type"))) u;
168
169 /* The list of landing pads associated with this region. */
170 struct eh_landing_pad_d *landing_pads;
171
172 /* EXC_PTR and FILTER values copied from the runtime for this region.
173 Each region gets its own psuedos so that if there are nested exceptions
174 we do not overwrite the values of the first exception. */
175 rtx exc_ptr_reg, filter_reg;
176
177 /* True if this region should use __cxa_end_cleanup instead
178 of _Unwind_Resume. */
179 bool use_cxa_end_cleanup;
180};
181
183typedef struct eh_catch_d *eh_catch;
184typedef struct eh_region_d *eh_region;
185
186
187
188
189/* The exception status for each function. */
190
191struct GTY(()) eh_status
192{
193 /* The tree of all regions for this function. */
195
196 /* The same information as an indexable array. */
198
199 /* The landing pads as an indexable array. */
201
202 /* At the gimple level, a mapping from gimple statement to landing pad
203 or must-not-throw region. See record_stmt_eh_region. */
204 hash_map<gimple *, int> *GTY(()) throw_stmt_table;
205
206 /* All of the runtime type data used by the function. These objects
207 are emitted to the lang-specific-data-area for the function. */
208 vec<tree, va_gc> *ttype_data;
209
210 /* The table of all action chains. These encode the eh_region tree in
211 a compact form for use by the runtime, and is also emitted to the
212 lang-specific-data-area. Note that the ARM EABI uses a different
213 format for the encoding than all other ports. */
215 vec<tree, va_gc> *GTY((tag ("1"))) arm_eabi;
216 vec<uchar, va_gc> *GTY((tag ("0"))) other;
217 } GTY ((desc ("targetm.arm_eabi_unwinder"))) ehspec_data;
218};
219
220
221/* Invokes CALLBACK for every exception handler label. Only used by old
222 loop hackery; should not be used by new code. */
223extern void for_each_eh_label (void (*) (rtx));
224
225extern void init_eh_for_function (void);
226
228extern void remove_eh_handler (eh_region);
230
232extern void output_function_exception_table (int);
233
237extern void expand_builtin_unwind_init (void);
243extern void expand_builtin_eh_return (tree, tree);
244extern void expand_eh_return (void);
246
247typedef tree (*duplicate_eh_regions_map) (tree, void *);
248extern hash_map<void *, void *> *duplicate_eh_regions
249 (struct function *, eh_region, int, duplicate_eh_regions_map, void *);
250
252extern void update_sjlj_context (void);
253
258
261
262extern eh_region get_eh_region_from_number_fn (struct function *, int);
268
270
271extern void make_reg_eh_region_note (rtx_insn *insn, int ecf_flags, int lp_nr);
273
274extern void verify_eh_tree (struct function *);
275extern void dump_eh_tree (FILE *, struct function *);
276void debug_eh_tree (struct function *);
277extern void add_type_for_runtime (tree);
279extern void assign_filter_values (void);
280
283
284extern void finish_eh_generation (void);
285
288 int lp_nr;
289};
290
293
299
300extern enum eh_personality_kind
302
303/* Pre-order iteration within the eh_region tree. */
304
305inline eh_region
307{
308 if (r->inner)
309 r = r->inner;
310 else if (r->next_peer && r != start)
311 r = r->next_peer;
312 else
313 {
314 do
315 {
316 r = r->outer;
317 if (r == start)
318 return NULL;
319 }
320 while (r->next_peer == NULL);
321 r = r->next_peer;
322 }
323 return r;
324}
325
326#define FOR_ALL_EH_REGION_AT(R, START) \
327 for ((R) = (START); (R) != NULL; (R) = ehr_next (R, START))
328
329#define FOR_ALL_EH_REGION_FN(R, FN) \
330 for ((R) = (FN)->eh->region_tree; (R) != NULL; (R) = ehr_next (R, NULL))
331
332#define FOR_ALL_EH_REGION(R) FOR_ALL_EH_REGION_FN (R, cfun)
333
334#endif
Definition hash-map.h:40
unsigned char uchar
Definition coretypes.h:476
#define GTY(x)
Definition coretypes.h:41
union tree_node * tree
Definition coretypes.h:97
rtx expand_builtin_dwarf_sp_column(void)
Definition dwarf2cfi.cc:249
void expand_builtin_init_dwarf_reg_sizes(tree address)
Definition dwarf2cfi.cc:324
eh_region get_eh_region_from_lp_number_fn(struct function *ifun, int i)
Definition except.cc:498
eh_region get_eh_region_from_lp_number(int i)
Definition except.cc:513
rtx expand_builtin_frob_return_addr(tree addr_tree)
Definition except.cc:2228
eh_landing_pad get_eh_landing_pad_from_number_fn(struct function *ifun, int i)
Definition except.cc:486
eh_catch gen_eh_region_catch(eh_region t, tree type_or_list)
Definition except.cc:407
hash_map< void *, void * > * duplicate_eh_regions(struct function *ifun, eh_region copy_region, int outer_lp, duplicate_eh_regions_map map, void *map_data)
Definition except.cc:613
rtx expand_builtin_eh_filter(tree exp)
Definition except.cc:2110
eh_region get_eh_region_from_number(int i)
Definition except.cc:480
bool current_function_has_exception_handlers(void)
Definition except.cc:521
eh_region eh_region_outermost(struct function *ifun, eh_region region_a, eh_region region_b)
Definition except.cc:648
DEBUG_FUNCTION void verify_eh_tree(struct function *fun)
Definition except.cc:3435
eh_region get_eh_region_from_rtx(const_rtx insn)
Definition except.cc:1874
eh_landing_pad get_eh_landing_pad_from_number(int i)
Definition except.cc:492
rtx expand_builtin_extract_return_addr(tree addr_tree)
Definition except.cc:2197
tree lookup_type_for_runtime(tree type)
Definition except.cc:689
eh_region gen_eh_region_must_not_throw(eh_region outer)
Definition except.cc:453
eh_landing_pad get_eh_landing_pad_from_rtx(const_rtx insn)
Definition except.cc:1861
rtx expand_builtin_eh_pointer(tree exp)
Definition except.cc:2098
void remove_eh_landing_pad(eh_landing_pad lp)
Definition except.cc:1571
void remove_eh_handler(eh_region region)
Definition except.cc:1626
void make_reg_eh_region_note_nothrow_nononlocal(rtx_insn *insn)
Definition except.cc:1733
void finish_eh_generation(void)
Definition except.cc:1520
void expand_eh_return(void)
Definition except.cc:2280
hash_map< gimple *, int > * get_eh_throw_stmt_table(struct function *fun)
Definition except.cc:3269
rtx expand_builtin_extend_pointer(tree addr_tree)
Definition except.cc:2340
void expand_builtin_unwind_init(void)
Definition except.cc:2151
eh_region gen_eh_region_try(eh_region outer)
Definition except.cc:401
enum eh_personality_kind function_needs_eh_personality(struct function *fn)
Definition except.cc:3277
void sjlj_emit_function_exit_after(rtx_insn *after)
Definition except.cc:1270
void init_eh_for_function(void)
Definition except.cc:351
DEBUG_FUNCTION void debug_eh_tree(struct function *fn)
Definition except.cc:3427
void expand_builtin_eh_return(tree stackadj_tree, tree handler_tree)
Definition except.cc:2247
void output_function_exception_table(int section)
Definition except.cc:3229
void remove_unreachable_eh_regions(sbitmap r_reachable)
Definition except.cc:1666
eh_region get_eh_region_from_number_fn(struct function *ifun, int i)
Definition except.cc:474
rtx expand_builtin_eh_return_data_regno(tree exp)
Definition except.cc:2165
void make_reg_eh_region_note(rtx_insn *insn, int ecf_flags, int lp_nr)
Definition except.cc:1716
void dump_eh_tree(FILE *out, struct function *fun)
Definition except.cc:3310
eh_region gen_eh_region_cleanup(eh_region outer)
Definition except.cc:395
void for_each_eh_label(void(*callback)(rtx))
Definition except.cc:1675
void add_type_for_runtime(tree type)
Definition except.cc:676
eh_landing_pad gen_eh_landing_pad(eh_region region)
Definition except.cc:459
void set_eh_throw_stmt_table(function *fun, hash_map< gimple *, int > *table)
Definition except.cc:3263
eh_region gen_eh_region_allowed(eh_region outer, tree allowed)
Definition except.cc:441
rtx expand_builtin_eh_copy_values(tree exp)
Definition except.cc:2123
void update_sjlj_context(void)
Definition except.cc:1508
void assign_filter_values(void)
Definition except.cc:852
eh_personality_kind
Definition except.h:294
@ eh_personality_lang
Definition except.h:297
@ eh_personality_none
Definition except.h:295
@ eh_personality_any
Definition except.h:296
rtx expand_builtin_eh_return_data_regno(tree)
Definition except.cc:2165
rtx expand_builtin_extend_pointer(tree)
Definition except.cc:2340
eh_landing_pad gen_eh_landing_pad(eh_region)
Definition except.cc:459
tree lookup_type_for_runtime(tree)
Definition except.cc:689
rtx expand_builtin_dwarf_sp_column(void)
Definition dwarf2cfi.cc:249
enum eh_personality_kind function_needs_eh_personality(struct function *)
Definition except.cc:3277
bool current_function_has_exception_handlers(void)
Definition except.cc:521
struct eh_landing_pad_d * eh_landing_pad
Definition except.h:182
eh_catch gen_eh_region_catch(eh_region, tree)
Definition except.cc:407
void add_type_for_runtime(tree)
Definition except.cc:676
eh_region gen_eh_region_try(eh_region)
Definition except.cc:401
eh_region eh_region_outermost(struct function *, eh_region, eh_region)
Definition except.cc:648
void for_each_eh_label(void(*)(rtx))
Definition except.cc:1675
rtx expand_builtin_eh_pointer(tree)
Definition except.cc:2098
eh_region get_eh_region_from_number_fn(struct function *, int)
Definition except.cc:474
eh_landing_pad get_eh_landing_pad_from_rtx(const_rtx)
Definition except.cc:1861
void make_reg_eh_region_note_nothrow_nononlocal(rtx_insn *)
Definition except.cc:1733
rtx expand_builtin_extract_return_addr(tree)
Definition except.cc:2197
eh_region get_eh_region_from_lp_number(int)
Definition except.cc:513
void expand_builtin_eh_return(tree, tree)
Definition except.cc:2247
rtx expand_builtin_frob_return_addr(tree)
Definition except.cc:2228
rtx expand_builtin_eh_filter(tree)
Definition except.cc:2110
void debug_eh_tree(struct function *)
Definition except.cc:3427
struct eh_catch_d * eh_catch
Definition except.h:183
void finish_eh_generation(void)
Definition except.cc:1520
void expand_eh_return(void)
Definition except.cc:2280
tree(* duplicate_eh_regions_map)(tree, void *)
Definition except.h:247
eh_region gen_eh_region_allowed(eh_region, tree)
Definition except.cc:441
void remove_eh_handler(eh_region)
Definition except.cc:1626
void expand_builtin_unwind_init(void)
Definition except.cc:2151
void set_eh_throw_stmt_table(function *, hash_map< gimple *, int > *)
Definition except.cc:3263
void expand_builtin_init_dwarf_reg_sizes(tree)
Definition dwarf2cfi.cc:324
void sjlj_emit_function_exit_after(rtx_insn *)
Definition except.cc:1270
eh_region_type
Definition except.h:33
@ ERT_MUST_NOT_THROW
Definition except.h:62
@ ERT_TRY
Definition except.h:46
@ ERT_ALLOWED_EXCEPTIONS
Definition except.h:53
@ ERT_CLEANUP
Definition except.h:39
void init_eh_for_function(void)
Definition except.cc:351
eh_region ehr_next(eh_region r, eh_region start)
Definition except.h:306
eh_region get_eh_region_from_number(int)
Definition except.cc:480
void remove_eh_landing_pad(eh_landing_pad)
Definition except.cc:1571
void verify_eh_tree(struct function *)
Definition except.cc:3435
struct eh_region_d * eh_region
Definition except.h:184
void make_reg_eh_region_note(rtx_insn *insn, int ecf_flags, int lp_nr)
Definition except.cc:1716
hash_map< gimple *, int > * get_eh_throw_stmt_table(struct function *)
Definition except.cc:3269
eh_region gen_eh_region_cleanup(eh_region)
Definition except.cc:395
eh_region get_eh_region_from_rtx(const_rtx)
Definition except.cc:1874
eh_region get_eh_region_from_lp_number_fn(struct function *, int)
Definition except.cc:498
rtx expand_builtin_eh_copy_values(tree)
Definition except.cc:2123
eh_region gen_eh_region_must_not_throw(eh_region)
Definition except.cc:453
void output_function_exception_table(int)
Definition except.cc:3229
void update_sjlj_context(void)
Definition except.cc:1508
eh_landing_pad get_eh_landing_pad_from_number(int)
Definition except.cc:492
eh_landing_pad get_eh_landing_pad_from_number_fn(struct function *, int)
Definition except.cc:486
hash_map< void *, void * > * duplicate_eh_regions(struct function *, eh_region, int, duplicate_eh_regions_map, void *)
Definition except.cc:613
void assign_filter_values(void)
Definition except.cc:852
void dump_eh_tree(FILE *, struct function *)
Definition except.cc:3310
void remove_unreachable_eh_regions(sbitmap)
Definition except.cc:1666
poly_int< N, C > r
Definition poly-int.h:774
Definition except.h:96
tree label
Definition except.h:113
struct eh_catch_d * prev_catch
Definition except.h:99
tree filter_list
Definition except.h:108
tree type_list
Definition except.h:103
struct eh_catch_d * next_catch
Definition except.h:98
Definition except.h:70
tree post_landing_pad
Definition except.h:80
rtx_code_label * landing_pad
Definition except.h:87
int index
Definition except.h:90
struct eh_landing_pad_d * next_lp
Definition except.h:72
struct eh_region_d * region
Definition except.h:75
location_t failure_loc
Definition except.h:165
struct eh_catch_d * last_catch
Definition except.h:138
struct eh_catch_d * first_catch
Definition except.h:137
Definition except.h:119
bool use_cxa_end_cleanup
Definition except.h:179
enum eh_region_type type
Definition except.h:131
struct eh_region_d * outer
Definition except.h:121
struct eh_region_d * inner
Definition except.h:124
union eh_region_d::eh_region_u u
rtx filter_reg
Definition except.h:175
rtx exc_ptr_reg
Definition except.h:175
int index
Definition except.h:128
struct eh_landing_pad_d * landing_pads
Definition except.h:170
struct eh_region_d * next_peer
Definition except.h:125
Definition except.h:192
vec< eh_region, va_gc > * region_array
Definition except.h:197
vec< eh_landing_pad, va_gc > * lp_array
Definition except.h:200
hash_map< gimple *, int > * throw_stmt_table
Definition except.h:204
union eh_status::eh_status_u ehspec_data
eh_region region_tree
Definition except.h:194
vec< tree, va_gc > * ttype_data
Definition except.h:208
Definition function.h:249
Definition gimple.h:221
Definition rtl.h:679
Definition rtl.h:312
Definition rtl.h:546
Definition sbitmap.h:87
Definition except.h:286
int lp_nr
Definition except.h:288
gimple * stmt
Definition except.h:287
Definition gengtype.h:252
Definition vec.h:359
Definition vec.h:450
#define NULL
Definition system.h:50
struct gcc_target targetm
Definition except.h:134
struct eh_region_d::eh_region_u::eh_region_u_allowed allowed
struct eh_region_d::eh_region_u::eh_region_u_try eh_try
struct eh_region_d::eh_region_u::eh_region_u_must_not_throw must_not_throw
Definition except.h:214
vec< uchar, va_gc > * other
Definition except.h:216
vec< tree, va_gc > * arm_eabi
Definition except.h:215