OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [lib/] [gcc/] [or1knd-elf/] [4.8.0/] [plugin/] [include/] [except.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
/* Exception Handling interface routines.
2
   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2007, 2008, 2009, 2010  Free Software Foundation, Inc.
4
   Contributed by Mike Stump <mrs@cygnus.com>.
5
 
6
This file is part of GCC.
7
 
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 3, or (at your option) any later
11
version.
12
 
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.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* No include guards here, but define an include file marker anyway, so
23
   that the compiler can keep track of where this file is included.  This
24
   is e.g. used to avoid including this file in front-end specific files.  */
25
#ifndef GCC_EXCEPT_H
26
#  define GCC_EXCEPT_H
27
#endif
28
 
29
#include "hashtab.h"
30
 
31
struct function;
32
struct eh_region_d;
33
struct pointer_map_t;
34
 
35
/* The type of an exception region.  */
36
enum eh_region_type
37
{
38
  /* CLEANUP regions implement e.g. destructors run when exiting a block.
39
     They can be generated from both GIMPLE_TRY_FINALLY and GIMPLE_TRY_CATCH
40
     nodes.  It is expected by the runtime that cleanup regions will *not*
41
     resume normal program flow, but will continue propagation of the
42
     exception.  */
43
  ERT_CLEANUP,
44
 
45
  /* TRY regions implement catching an exception.  The list of types associated
46
     with the attached catch handlers is examined in order by the runtime and
47
     control is transferred to the appropriate handler.  Note that a NULL type
48
     list is a catch-all handler, and that it will catch *all* exceptions
49
     including those originating from a different language.  */
50
  ERT_TRY,
51
 
52
  /* ALLOWED_EXCEPTIONS regions implement exception filtering, e.g. the
53
     throw(type-list) specification that can be added to C++ functions.
54
     The runtime examines the thrown exception vs the type list, and if
55
     the exception does not match, transfers control to the handler.  The
56
     normal handler for C++ calls __cxa_call_unexpected.  */
57
  ERT_ALLOWED_EXCEPTIONS,
58
 
59
  /* MUST_NOT_THROW regions prevent all exceptions from propagating.  This
60
     region type is used in C++ to surround destructors being run inside a
61
     CLEANUP region.  This differs from an ALLOWED_EXCEPTIONS region with
62
     an empty type list in that the runtime is prepared to terminate the
63
     program directly.  We only generate code for MUST_NOT_THROW regions
64
     along control paths that are already handling an exception within the
65
     current function.  */
66
  ERT_MUST_NOT_THROW
67
};
68
 
69
 
70
/* A landing pad for a given exception region.  Any transfer of control
71
   from the EH runtime to the function happens at a landing pad.  */
72
 
73
struct GTY(()) eh_landing_pad_d
74
{
75
  /* The linked list of all landing pads associated with the region.  */
76
  struct eh_landing_pad_d *next_lp;
77
 
78
  /* The region with which this landing pad is associated.  */
79
  struct eh_region_d *region;
80
 
81
  /* At the gimple level, the location to which control will be transferred
82
     for this landing pad.  There can be both EH and normal edges into the
83
     block containing the post-landing-pad label.  */
84
  tree post_landing_pad;
85
 
86
  /* At the rtl level, the location to which the runtime will transfer
87
     control.  This differs from the post-landing-pad in that the target's
88
     EXCEPTION_RECEIVER pattern will be expanded here, as well as other
89
     bookkeeping specific to exceptions.  There must not be normal edges
90
     into the block containing the landing-pad label.  */
91
  rtx landing_pad;
92
 
93
  /* The index of this landing pad within fun->eh->lp_array.  */
94
  int index;
95
};
96
 
97
/* A catch handler associated with an ERT_TRY region.  */
98
 
99
struct GTY(()) eh_catch_d
100
{
101
  /* The double-linked list of all catch handlers for the region.  */
102
  struct eh_catch_d *next_catch;
103
  struct eh_catch_d *prev_catch;
104
 
105
  /* A TREE_LIST of runtime type objects that this catch handler
106
     will catch, or NULL if all exceptions are caught.  */
107
  tree type_list;
108
 
109
  /* A TREE_LIST of INTEGER_CSTs that correspond to the type_list entries,
110
     having been mapped by assign_filter_values.  These integers are to be
111
     compared against the __builtin_eh_filter value.  */
112
  tree filter_list;
113
 
114
  /* The code that should be executed if this catch handler matches the
115
     thrown exception.  This label is only maintained until
116
     pass_lower_eh_dispatch, at which point it is cleared.  */
117
  tree label;
118
};
119
 
120
/* Describes one exception region.  */
121
 
122
struct GTY(()) eh_region_d
123
{
124
  /* The immediately surrounding region.  */
125
  struct eh_region_d *outer;
126
 
127
  /* The list of immediately contained regions.  */
128
  struct eh_region_d *inner;
129
  struct eh_region_d *next_peer;
130
 
131
  /* The index of this region within fun->eh->region_array.  */
132
  int index;
133
 
134
  /* Each region does exactly one thing.  */
135
  enum eh_region_type type;
136
 
137
  /* Holds the action to perform based on the preceding type.  */
138
  union eh_region_u {
139
    struct eh_region_u_try {
140
      /* The double-linked list of all catch handlers for this region.  */
141
      struct eh_catch_d *first_catch;
142
      struct eh_catch_d *last_catch;
143
    } GTY ((tag ("ERT_TRY"))) eh_try;
144
 
145
    struct eh_region_u_allowed {
146
      /* A TREE_LIST of runtime type objects allowed to pass.  */
147
      tree type_list;
148
      /* The code that should be executed if the thrown exception does
149
         not match the type list.  This label is only maintained until
150
         pass_lower_eh_dispatch, at which point it is cleared.  */
151
      tree label;
152
      /* The integer that will be passed by the runtime to signal that
153
         we should execute the code at LABEL.  This integer is assigned
154
         by assign_filter_values and is to be compared against the
155
         __builtin_eh_filter value.  */
156
      int filter;
157
    } GTY ((tag ("ERT_ALLOWED_EXCEPTIONS"))) allowed;
158
 
159
    struct eh_region_u_must_not_throw {
160
      /* A function decl to be invoked if this region is actually reachable
161
         from within the function, rather than implementable from the runtime.
162
         The normal way for this to happen is for there to be a CLEANUP region
163
         contained within this MUST_NOT_THROW region.  Note that if the
164
         runtime handles the MUST_NOT_THROW region, we have no control over
165
         what termination function is called; it will be decided by the
166
         personality function in effect for this CIE.  */
167
      tree failure_decl;
168
      /* The location assigned to the call of FAILURE_DECL, if expanded.  */
169
      location_t failure_loc;
170
    } GTY ((tag ("ERT_MUST_NOT_THROW"))) must_not_throw;
171
  } GTY ((desc ("%0.type"))) u;
172
 
173
  /* The list of landing pads associated with this region.  */
174
  struct eh_landing_pad_d *landing_pads;
175
 
176
  /* EXC_PTR and FILTER values copied from the runtime for this region.
177
     Each region gets its own psuedos so that if there are nested exceptions
178
     we do not overwrite the values of the first exception.  */
179
  rtx exc_ptr_reg, filter_reg;
180
 
181
  /* True if this region should use __cxa_end_cleanup instead
182
     of _Unwind_Resume.  */
183
  bool use_cxa_end_cleanup;
184
};
185
 
186
typedef struct eh_landing_pad_d *eh_landing_pad;
187
typedef struct eh_catch_d *eh_catch;
188
typedef struct eh_region_d *eh_region;
189
 
190
 
191
 
192
 
193
/* The exception status for each function.  */
194
 
195
struct GTY(()) eh_status
196
{
197
  /* The tree of all regions for this function.  */
198
  eh_region region_tree;
199
 
200
  /* The same information as an indexable array.  */
201
  vec<eh_region, va_gc> *region_array;
202
 
203
  /* The landing pads as an indexable array.  */
204
  vec<eh_landing_pad, va_gc> *lp_array;
205
 
206
  /* At the gimple level, a mapping from gimple statement to landing pad
207
     or must-not-throw region.  See record_stmt_eh_region.  */
208
  htab_t GTY((param_is (struct throw_stmt_node))) throw_stmt_table;
209
 
210
  /* All of the runtime type data used by the function.  These objects
211
     are emitted to the lang-specific-data-area for the function.  */
212
  vec<tree, va_gc> *ttype_data;
213
 
214
  /* The table of all action chains.  These encode the eh_region tree in
215
     a compact form for use by the runtime, and is also emitted to the
216
     lang-specific-data-area.  Note that the ARM EABI uses a different
217
     format for the encoding than all other ports.  */
218
  union eh_status_u {
219
    vec<tree, va_gc> *GTY((tag ("1"))) arm_eabi;
220
    vec<uchar, va_gc> *GTY((tag ("0"))) other;
221
  } GTY ((desc ("targetm.arm_eabi_unwinder"))) ehspec_data;
222
};
223
 
224
 
225
/* Invokes CALLBACK for every exception handler label.  Only used by old
226
   loop hackery; should not be used by new code.  */
227
extern void for_each_eh_label (void (*) (rtx));
228
 
229
extern void init_eh_for_function (void);
230
 
231
extern void remove_eh_landing_pad (eh_landing_pad);
232
extern void remove_eh_handler (eh_region);
233
 
234
extern bool current_function_has_exception_handlers (void);
235
extern void output_function_exception_table (const char *);
236
 
237
extern rtx expand_builtin_eh_pointer (tree);
238
extern rtx expand_builtin_eh_filter (tree);
239
extern rtx expand_builtin_eh_copy_values (tree);
240
extern void expand_builtin_unwind_init (void);
241
extern rtx expand_builtin_eh_return_data_regno (tree);
242
extern rtx expand_builtin_extract_return_addr (tree);
243
extern void expand_builtin_init_dwarf_reg_sizes (tree);
244
extern rtx expand_builtin_frob_return_addr (tree);
245
extern rtx expand_builtin_dwarf_sp_column (void);
246
extern void expand_builtin_eh_return (tree, tree);
247
extern void expand_eh_return (void);
248
extern rtx expand_builtin_extend_pointer (tree);
249
extern void expand_dw2_landing_pad_for_region (eh_region);
250
 
251
typedef tree (*duplicate_eh_regions_map) (tree, void *);
252
extern struct pointer_map_t *duplicate_eh_regions
253
  (struct function *, eh_region, int, duplicate_eh_regions_map, void *);
254
 
255
extern void sjlj_emit_function_exit_after (rtx);
256
 
257
extern eh_region gen_eh_region_cleanup (eh_region);
258
extern eh_region gen_eh_region_try (eh_region);
259
extern eh_region gen_eh_region_allowed (eh_region, tree);
260
extern eh_region gen_eh_region_must_not_throw (eh_region);
261
 
262
extern eh_catch gen_eh_region_catch (eh_region, tree);
263
extern eh_landing_pad gen_eh_landing_pad (eh_region);
264
 
265
extern eh_region get_eh_region_from_number_fn (struct function *, int);
266
extern eh_region get_eh_region_from_number (int);
267
extern eh_landing_pad get_eh_landing_pad_from_number_fn (struct function*,int);
268
extern eh_landing_pad get_eh_landing_pad_from_number (int);
269
extern eh_region get_eh_region_from_lp_number_fn (struct function *, int);
270
extern eh_region get_eh_region_from_lp_number (int);
271
 
272
extern eh_region eh_region_outermost (struct function *, eh_region, eh_region);
273
 
274
extern void make_reg_eh_region_note (rtx insn, int ecf_flags, int lp_nr);
275
extern void make_reg_eh_region_note_nothrow_nononlocal (rtx);
276
 
277
extern void verify_eh_tree (struct function *);
278
extern void dump_eh_tree (FILE *, struct function *);
279
void debug_eh_tree (struct function *);
280
extern void add_type_for_runtime (tree);
281
extern tree lookup_type_for_runtime (tree);
282
extern void assign_filter_values (void);
283
 
284
extern eh_region get_eh_region_from_rtx (const_rtx);
285
extern eh_landing_pad get_eh_landing_pad_from_rtx (const_rtx);
286
 
287
extern void finish_eh_generation (void);
288
 
289
struct GTY(()) throw_stmt_node {
290
  gimple stmt;
291
  int lp_nr;
292
};
293
 
294
extern struct htab *get_eh_throw_stmt_table (struct function *);
295
extern void set_eh_throw_stmt_table (struct function *, struct htab *);
296
 
297
enum eh_personality_kind {
298
  eh_personality_none,
299
  eh_personality_any,
300
  eh_personality_lang
301
};
302
 
303
extern enum eh_personality_kind
304
function_needs_eh_personality (struct function *);
305
 
306
/* Pre-order iteration within the eh_region tree.  */
307
 
308
static inline eh_region
309
ehr_next (eh_region r, eh_region start)
310
{
311
  if (r->inner)
312
    r = r->inner;
313
  else if (r->next_peer && r != start)
314
    r = r->next_peer;
315
  else
316
    {
317
      do
318
        {
319
          r = r->outer;
320
          if (r == start)
321
            return NULL;
322
        }
323
      while (r->next_peer == NULL);
324
      r = r->next_peer;
325
    }
326
  return r;
327
}
328
 
329
#define FOR_ALL_EH_REGION_AT(R, START) \
330
  for ((R) = (START); (R) != NULL; (R) = ehr_next (R, START))
331
 
332
#define FOR_ALL_EH_REGION_FN(R, FN) \
333
  for ((R) = (FN)->eh->region_tree; (R) != NULL; (R) = ehr_next (R, NULL))
334
 
335
#define FOR_ALL_EH_REGION(R) FOR_ALL_EH_REGION_FN (R, cfun)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.