]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/except.h
Use MODE_BASE_REG_CLASS in legitimize macros.
[thirdparty/gcc.git] / gcc / except.h
CommitLineData
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 6This file is part of GCC.
4956d07c 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
4956d07c 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
4956d07c
MS
17
18You should have received a copy of the GNU General Public License
1322177d
LB
19along with GCC; see the file COPYING. If not, write to the Free
20Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2102111-1307, USA. */
4956d07c 22
9a0d1e1b 23
88657302 24#ifndef GCC_VARRAY_H
52a11cbf
RH
25struct 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. */
32struct eh_status;
911fdd58 33
52a11cbf
RH
34/* Internal structure describing a region. */
35struct eh_region;
ce152ef8 36
52a11cbf
RH
37/* Test: is exception handling turned on? */
38extern 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. */
43extern 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. */
47extern 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. */
51extern 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 56extern void expand_start_catch PARAMS ((tree));
911fdd58 57
52a11cbf
RH
58/* End a catch clause. Control will resume after the try/catch block. */
59extern void expand_end_catch PARAMS ((void));
911fdd58 60
52a11cbf
RH
61/* End a sequence of catch handlers for a try block. */
62extern 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 67extern 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. */
71extern 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. */
76extern 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. */
81extern 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 85extern 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. */
90extern 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 94extern void end_protect_partials PARAMS ((void));
911fdd58 95
911fdd58 96
52a11cbf 97/* A list of labels used for exception handlers. */
4956d07c
MS
98extern rtx exception_handler_labels;
99
0519ce30 100/* Determine if the given INSN can throw an exception. */
52a11cbf
RH
101extern bool can_throw_internal PARAMS ((rtx));
102extern bool can_throw_external PARAMS ((rtx));
0519ce30 103
fb13d4d0 104/* Return nonzero if nothing in this function can throw. */
52a11cbf 105extern bool nothrow_function_p PARAMS ((void));
fb13d4d0 106
52a11cbf
RH
107/* After initial rtl generation, call back to finish generating
108 exception support code. */
109extern void finish_eh_generation PARAMS ((void));
fb13d4d0 110
52a11cbf
RH
111extern void init_eh PARAMS ((void));
112extern void init_eh_for_function PARAMS ((void));
911fdd58 113
52a11cbf
RH
114extern rtx reachable_handlers PARAMS ((rtx));
115extern void maybe_remove_eh_handler PARAMS ((rtx));
e976b8b2 116
52a11cbf
RH
117extern void convert_from_eh_region_ranges PARAMS ((void));
118extern void convert_to_eh_region_ranges PARAMS ((void));
119extern void find_exception_handler_labels PARAMS ((void));
120extern void output_function_exception_table PARAMS ((void));
154bba13 121
52a11cbf
RH
122extern void expand_builtin_unwind_init PARAMS ((void));
123extern rtx expand_builtin_eh_return_data_regno PARAMS ((tree));
124extern rtx expand_builtin_extract_return_addr PARAMS ((tree));
02d208ff 125extern void expand_builtin_init_dwarf_reg_sizes PARAMS ((tree));
52a11cbf 126extern rtx expand_builtin_frob_return_addr PARAMS ((tree));
efc45658 127extern rtx expand_builtin_dwarf_fp_regnum PARAMS ((void));
52a11cbf
RH
128extern void expand_builtin_eh_return PARAMS ((tree, tree));
129extern void expand_eh_return PARAMS ((void));
e976b8b2 130
86c99549 131extern rtx get_exception_pointer PARAMS ((struct function *));
e976b8b2 132
52a11cbf
RH
133struct function;
134struct inline_remap;
135extern int duplicate_eh_regions PARAMS ((struct function *,
136 struct inline_remap *));
e976b8b2 137
52a11cbf 138extern 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'. */
147extern tree (*lang_protect_cleanup_actions) PARAMS ((void));
f54a7f6f 148
52a11cbf 149/* Return true if type A catches type B. */
847abd1f 150extern 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 153extern 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