OSDN Git Service

2008-08-22 Sergey Rybin <rybin@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / raise-gcc.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                            R A I S E - G C C                             *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *             Copyright (C) 1992-2008, Free Software Foundation, Inc.      *
10  *                                                                          *
11  * GNAT is free software;  you can  redistribute it  and/or modify it under *
12  * terms of the  GNU General Public License as published  by the Free Soft- *
13  * ware  Foundation;  either version 2,  or (at your option) any later ver- *
14  * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
15  * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
17  * for  more details.  You should have  received  a copy of the GNU General *
18  * Public License  distributed with GNAT;  see file COPYING.  If not, write *
19  * to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, *
20  * Boston, MA 02110-1301, USA.                                              *
21  *                                                                          *
22  * As a  special  exception,  if you  link  this file  with other  files to *
23  * produce an executable,  this file does not by itself cause the resulting *
24  * executable to be covered by the GNU General Public License. This except- *
25  * ion does not  however invalidate  any other reasons  why the  executable *
26  * file might be covered by the  GNU Public License.                        *
27  *                                                                          *
28  * GNAT was originally developed  by the GNAT team at  New York University. *
29  * Extensive contributions were provided by Ada Core Technologies Inc.      *
30  *                                                                          *
31  ****************************************************************************/
32
33 /* Code related to the integration of the GCC mechanism for exception
34    handling.  */
35
36 #ifdef IN_RTS
37 #include "tconfig.h"
38 #include "tsystem.h"
39 /* In the top-of-tree GCC, tconfig does not include tm.h, but in GCC 3.2
40    it does.  To avoid branching raise.c just for that purpose, we kludge by
41    looking for a symbol always defined by tm.h and if it's not defined,
42    we include it.  */
43 #ifndef FIRST_PSEUDO_REGISTER
44 #include "coretypes.h"
45 #include "tm.h"
46 #endif
47 #include <sys/stat.h>
48 #include <stdarg.h>
49 typedef char bool;
50 # define true 1
51 # define false 0
52 #else
53 #include "config.h"
54 #include "system.h"
55 #endif
56
57 #include "adaint.h"
58 #include "raise.h"
59
60 /* The names of a couple of "standard" routines for unwinding/propagation
61    actually vary depending on the underlying GCC scheme for exception handling
62    (SJLJ or DWARF). We need a consistently named interface to import from
63    a-except, so wrappers are defined here.
64
65    Besides, even though the compiler is never setup to use the GCC propagation
66    circuitry, it still relies on exceptions internally and part of the sources
67    to handle to exceptions are shared with the run-time library.  We need
68    dummy definitions for the wrappers to satisfy the linker in this case.
69
70    The types to be used by those wrappers in the run-time library are target
71    types exported by unwind.h.  We used to piggyback on them for the compiler
72    stubs, but there is no guarantee that unwind.h is always in sight so we
73    define our own set below.  These are dummy types as the wrappers are never
74    called in the compiler case.  */
75
76 #ifdef IN_RTS
77
78 #include "unwind.h"
79
80 typedef struct _Unwind_Context _Unwind_Context;
81 typedef struct _Unwind_Exception _Unwind_Exception;
82
83 #else
84
85 typedef void _Unwind_Context;
86 typedef void _Unwind_Exception;
87 typedef int  _Unwind_Reason_Code;
88
89 #endif
90
91 _Unwind_Reason_Code
92 __gnat_Unwind_RaiseException (_Unwind_Exception *);
93
94 _Unwind_Reason_Code
95 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *, void *, void *);
96
97
98 #ifdef IN_RTS   /* For eh personality routine */
99
100 #include "dwarf2.h"
101 #include "unwind-dw2-fde.h"
102 #include "unwind-pe.h"
103
104
105 /* --------------------------------------------------------------
106    -- The DB stuff below is there for debugging purposes only. --
107    -------------------------------------------------------------- */
108
109 #define DB_PHASES     0x1
110 #define DB_CSITE      0x2
111 #define DB_ACTIONS    0x4
112 #define DB_REGIONS    0x8
113
114 #define DB_ERR        0x1000
115
116 /* The "action" stuff below is also there for debugging purposes only.  */
117
118 typedef struct
119 {
120   _Unwind_Action phase;
121   char * description;
122 } phase_descriptor;
123
124 static phase_descriptor phase_descriptors[]
125   = {{ _UA_SEARCH_PHASE,  "SEARCH_PHASE" },
126      { _UA_CLEANUP_PHASE, "CLEANUP_PHASE" },
127      { _UA_HANDLER_FRAME, "HANDLER_FRAME" },
128      { _UA_FORCE_UNWIND,  "FORCE_UNWIND" },
129      { -1, 0}};
130
131 static int
132 db_accepted_codes (void)
133 {
134   static int accepted_codes = -1;
135
136   if (accepted_codes == -1)
137     {
138       char * db_env = (char *) getenv ("EH_DEBUG");
139
140       accepted_codes = db_env ? (atoi (db_env) | DB_ERR) : 0;
141       /* Arranged for ERR stuff to always be visible when the variable
142          is defined. One may just set the variable to 0 to see the ERR
143          stuff only.  */
144     }
145
146   return accepted_codes;
147 }
148
149 #define DB_INDENT_INCREASE 0x01
150 #define DB_INDENT_DECREASE 0x02
151 #define DB_INDENT_OUTPUT   0x04
152 #define DB_INDENT_NEWLINE  0x08
153 #define DB_INDENT_RESET    0x10
154
155 #define DB_INDENT_UNIT     8
156
157 static void
158 db_indent (int requests)
159 {
160   static int current_indentation_level = 0;
161
162   if (requests & DB_INDENT_RESET)
163     {
164       current_indentation_level = 0;
165     }
166
167   if (requests & DB_INDENT_INCREASE)
168     {
169       current_indentation_level ++;
170     }
171
172   if (requests & DB_INDENT_DECREASE)
173     {
174       current_indentation_level --;
175     }
176
177   if (requests & DB_INDENT_NEWLINE)
178     {
179       fprintf (stderr, "\n");
180     }
181
182   if (requests & DB_INDENT_OUTPUT)
183     {
184       fprintf (stderr, "%*s",
185                current_indentation_level * DB_INDENT_UNIT, " ");
186     }
187
188 }
189
190 static void ATTRIBUTE_PRINTF_2
191 db (int db_code, char * msg_format, ...)
192 {
193   if (db_accepted_codes () & db_code)
194     {
195       va_list msg_args;
196
197       db_indent (DB_INDENT_OUTPUT);
198
199       va_start (msg_args, msg_format);
200       vfprintf (stderr, msg_format, msg_args);
201       va_end (msg_args);
202     }
203 }
204
205 static void
206 db_phases (int phases)
207 {
208   phase_descriptor *a = phase_descriptors;
209
210   if (! (db_accepted_codes() & DB_PHASES))
211     return;
212
213   db (DB_PHASES, "\n");
214
215   for (; a->description != 0; a++)
216     if (phases & a->phase)
217       db (DB_PHASES, "%s ", a->description);
218
219   db (DB_PHASES, " :\n");
220 }
221
222
223 /* ---------------------------------------------------------------
224    --  Now come a set of useful structures and helper routines. --
225    --------------------------------------------------------------- */
226
227 /* There are three major runtime tables involved, generated by the
228    GCC back-end. Contents slightly vary depending on the underlying
229    implementation scheme (dwarf zero cost / sjlj).
230
231    =======================================
232    * Tables for the dwarf zero cost case *
233    =======================================
234
235    call_site []
236    -------------------------------------------------------------------
237    * region-start | region-length | landing-pad | first-action-index *
238    -------------------------------------------------------------------
239
240    Identify possible actions to be taken and where to resume control
241    for that when an exception propagates through a pc inside the region
242    delimited by start and length.
243
244    A null landing-pad indicates that nothing is to be done.
245
246    Otherwise, first-action-index provides an entry into the action[]
247    table which heads a list of possible actions to be taken (see below).
248
249    If it is determined that indeed an action should be taken, that
250    is, if one action filter matches the exception being propagated,
251    then control should be transfered to landing-pad.
252
253    A null first-action-index indicates that there are only cleanups
254    to run there.
255
256    action []
257    -------------------------------
258    * action-filter | next-action *
259    -------------------------------
260
261    This table contains lists (called action chains) of possible actions
262    associated with call-site entries described in the call-site [] table.
263    There is at most one action list per call-site entry.
264
265    A null action-filter indicates a cleanup.
266
267    Non null action-filters provide an index into the ttypes [] table
268    (see below), from which information may be retrieved to check if it
269    matches the exception being propagated.
270
271    action-filter > 0  means there is a regular handler to be run,
272
273    action-filter < 0  means there is a some "exception_specification"
274                       data to retrieve, which is only relevant for C++
275                       and should never show up for Ada.
276
277    next-action indexes the next entry in the list. 0 indicates there is
278    no other entry.
279
280    ttypes []
281    ---------------
282    * ttype-value *
283    ---------------
284
285    A null value indicates a catch-all handler in C++, and an "others"
286    handler in Ada.
287
288    Non null values are used to match the exception being propagated:
289    In C++ this is a pointer to some rtti data, while in Ada this is an
290    exception id.
291
292    The special id value 1 indicates an "all_others" handler.
293
294    For C++, this table is actually also used to store "exception
295    specification" data. The differentiation between the two kinds
296    of entries is made by the sign of the associated action filter,
297    which translates into positive or negative offsets from the
298    so called base of the table:
299
300    Exception Specification data is stored at positive offsets from
301    the ttypes table base, which Exception Type data is stored at
302    negative offsets:
303
304    ---------------------------------------------------------------------------
305
306    Here is a quick summary of the tables organization:
307
308           +-- Unwind_Context (pc, ...)
309           |
310           |(pc)
311           |
312           |   CALL-SITE[]
313           |
314           |   +=============================================================+
315           |   | region-start + length |  landing-pad   | first-action-index |
316           |   +=============================================================+
317           +-> |       pc range          0 => no-action   0 => cleanups only |
318               |                         !0 => jump @              N --+     |
319               +====================================================== | ====+
320                                                                       |
321                                                                       |
322        ACTION []                                                      |
323                                                                       |
324        +==========================================================+   |
325        |              action-filter           |   next-action     |   |
326        +==========================================================+   |
327        |  0 => cleanup                                            |   |
328        | >0 => ttype index for handler ------+  0 => end of chain | <-+
329        | <0 => ttype index for spec data     |                    |
330        +==================================== | ===================+
331                                              |
332                                              |
333        TTYPES []                             |
334                                              |  Offset negated from
335                  +=====================+     |  the actual base.
336                  |     ttype-value     |     |
337     +============+=====================+     |
338     |            |  0 => "others"      |     |
339     |    ...     |  1 => "all others"  | <---+
340     |            |  X => exception id  |
341     |  handlers  +---------------------+
342     |            |        ...          |
343     |    ...     |        ...          |
344     |            |        ...          |
345     +============+=====================+ <<------ Table base
346     |    ...     |        ...          |
347     |   specs    |        ...          | (should not see negative filter
348     |    ...     |        ...          |  values for Ada).
349     +============+=====================+
350
351
352    ============================
353    * Tables for the sjlj case *
354    ============================
355
356    So called "function contexts" are pushed on a context stack by calls to
357    _Unwind_SjLj_Register on function entry, and popped off at exit points by
358    calls to _Unwind_SjLj_Unregister. The current call_site for a function is
359    updated in the function context as the function's code runs along.
360
361    The generic unwinding engine in _Unwind_RaiseException walks the function
362    context stack and not the actual call chain.
363
364    The ACTION and TTYPES tables remain unchanged, which allows to search them
365    during the propagation phase to determine whether or not the propagated
366    exception is handled somewhere. When it is, we only "jump" up once directly
367    to the context where the handler will be found. Besides, this allows "break
368    exception unhandled" to work also
369
370    The CALL-SITE table is setup differently, though: the pc attached to the
371    unwind context is a direct index into the table, so the entries in this
372    table do not hold region bounds any more.
373
374    A special index (-1) is used to indicate that no action is possibly
375    connected with the context at hand, so null landing pads cannot appear
376    in the table.
377
378    Additionally, landing pad values in the table do not represent code address
379    to jump at, but so called "dispatch" indices used by a common landing pad
380    for the function to switch to the appropriate post-landing-pad.
381
382    +-- Unwind_Context (pc, ...)
383    |
384    | pc = call-site index
385    |  0 => terminate (should not see this for Ada)
386    | -1 => no-action
387    |
388    |   CALL-SITE[]
389    |
390    |   +=====================================+
391    |   |  landing-pad   | first-action-index |
392    |   +=====================================+
393    +-> |                  0 => cleanups only |
394        | dispatch index             N        |
395        +=====================================+
396
397
398    ===================================
399    * Basic organization of this unit *
400    ===================================
401
402    The major point of this unit is to provide an exception propagation
403    personality routine for Ada. This is __gnat_eh_personality.
404
405    It is provided with a pointer to the propagated exception, an unwind
406    context describing a location the propagation is going through, and a
407    couple of other arguments including a description of the current
408    propagation phase.
409
410    It shall return to the generic propagation engine what is to be performed
411    next, after possible context adjustments, depending on what it finds in the
412    traversed context (a handler for the exception, a cleanup, nothing, ...),
413    and on the propagation phase.
414
415    A number of structures and subroutines are used for this purpose, as
416    sketched below:
417
418    o region_descriptor: General data associated with the context (base pc,
419      call-site table, action table, ttypes table, ...)
420
421    o action_descriptor: Data describing the action to be taken for the
422      propagated exception in the provided context (kind of action: nothing,
423      handler, cleanup; pointer to the action table entry, ...).
424
425    raise
426      |
427     ... (a-except.adb)
428      |
429    Propagate_Exception (a-exexpr.adb)
430      |
431      |
432    _Unwind_RaiseException (libgcc)
433      |
434      |   (Ada frame)
435      |
436      +--> __gnat_eh_personality (context, exception)
437            |
438            +--> get_region_descriptor_for (context)
439            |
440            +--> get_action_descriptor_for (context, exception, region)
441            |       |
442            |       +--> get_call_site_action_for (context, region)
443            |            (one version for each underlying scheme)
444            |
445            +--> setup_to_install (context)
446
447    This unit is inspired from the C++ version found in eh_personality.cc,
448    part of libstdc++-v3.
449
450 */
451
452
453 /* This is an incomplete "proxy" of the structure of exception objects as
454    built by the GNAT runtime library. Accesses to other fields than the common
455    header are performed through subprogram calls to alleviate the need of an
456    exact counterpart here and potential alignment/size issues for the common
457    header. See a-exexpr.adb.  */
458
459 typedef struct
460 {
461   _Unwind_Exception common;
462   /* ABI header, maximally aligned. */
463 } _GNAT_Exception;
464
465 /* The two constants below are specific ttype identifiers for special
466    exception ids.  Their type should match what a-exexpr exports.  */
467
468 extern const int __gnat_others_value;
469 #define GNAT_OTHERS      ((_Unwind_Ptr) &__gnat_others_value)
470
471 extern const int __gnat_all_others_value;
472 #define GNAT_ALL_OTHERS  ((_Unwind_Ptr) &__gnat_all_others_value)
473
474 /* Describe the useful region data associated with an unwind context.  */
475
476 typedef struct
477 {
478   /* The base pc of the region.  */
479   _Unwind_Ptr base;
480
481   /* Pointer to the Language Specific Data for the region.  */
482   _Unwind_Ptr lsda;
483
484   /* Call-Site data associated with this region.  */
485   unsigned char call_site_encoding;
486   const unsigned char *call_site_table;
487
488   /* The base to which are relative landing pad offsets inside the call-site
489      entries .  */
490   _Unwind_Ptr lp_base;
491
492   /* Action-Table associated with this region.  */
493   const unsigned char *action_table;
494
495   /* Ttype data associated with this region.  */
496   unsigned char ttype_encoding;
497   const unsigned char *ttype_table;
498   _Unwind_Ptr ttype_base;
499
500 } region_descriptor;
501
502 static void
503 db_region_for (region_descriptor *region, _Unwind_Context *uw_context)
504 {
505   _Unwind_Ptr ip = _Unwind_GetIP (uw_context) - 1;
506
507   if (! (db_accepted_codes () & DB_REGIONS))
508     return;
509
510   db (DB_REGIONS, "For ip @ 0x%08x => ", ip);
511
512   if (region->lsda)
513     db (DB_REGIONS, "lsda @ 0x%x", region->lsda);
514   else
515     db (DB_REGIONS, "no lsda");
516
517   db (DB_REGIONS, "\n");
518 }
519
520 /* Retrieve the ttype entry associated with FILTER in the REGION's
521    ttype table.  */
522
523 static const _Unwind_Ptr
524 get_ttype_entry_for (region_descriptor *region, long filter)
525 {
526   _Unwind_Ptr ttype_entry;
527
528   filter *= size_of_encoded_value (region->ttype_encoding);
529   read_encoded_value_with_base
530     (region->ttype_encoding, region->ttype_base,
531      region->ttype_table - filter, &ttype_entry);
532
533   return ttype_entry;
534 }
535
536 /* Fill out the REGION descriptor for the provided UW_CONTEXT.  */
537
538 static void
539 get_region_description_for (_Unwind_Context *uw_context,
540                             region_descriptor *region)
541 {
542   const unsigned char * p;
543   _uleb128_t tmp;
544   unsigned char lpbase_encoding;
545
546   /* Get the base address of the lsda information. If the provided context
547      is null or if there is no associated language specific data, there's
548      nothing we can/should do.  */
549   region->lsda
550     = (_Unwind_Ptr) (uw_context
551                      ? _Unwind_GetLanguageSpecificData (uw_context) : 0);
552
553   if (! region->lsda)
554     return;
555
556   /* Parse the lsda and fill the region descriptor.  */
557   p = (char *)region->lsda;
558
559   region->base = _Unwind_GetRegionStart (uw_context);
560
561   /* Find @LPStart, the base to which landing pad offsets are relative.  */
562   lpbase_encoding = *p++;
563   if (lpbase_encoding != DW_EH_PE_omit)
564     p = read_encoded_value
565       (uw_context, lpbase_encoding, p, &region->lp_base);
566   else
567     region->lp_base = region->base;
568
569   /* Find @TType, the base of the handler and exception spec type data.  */
570   region->ttype_encoding = *p++;
571   if (region->ttype_encoding != DW_EH_PE_omit)
572     {
573       p = read_uleb128 (p, &tmp);
574       region->ttype_table = p + tmp;
575     }
576    else
577      region->ttype_table = 0;
578
579   region->ttype_base
580     = base_of_encoded_value (region->ttype_encoding, uw_context);
581
582   /* Get the encoding and length of the call-site table; the action table
583      immediately follows.  */
584   region->call_site_encoding = *p++;
585   region->call_site_table = read_uleb128 (p, &tmp);
586
587   region->action_table = region->call_site_table + tmp;
588 }
589
590
591 /* Describe an action to be taken when propagating an exception up to
592    some context.  */
593
594 typedef enum
595 {
596   /* Found some call site base data, but need to analyze further
597      before being able to decide.  */
598   unknown,
599
600   /* There is nothing relevant in the context at hand. */
601   nothing,
602
603   /* There are only cleanups to run in this context.  */
604   cleanup,
605
606   /* There is a handler for the exception in this context.  */
607   handler
608 } action_kind;
609
610 /* filter value for cleanup actions.  */
611 const int cleanup_filter = 0;
612
613 typedef struct
614 {
615   /* The kind of action to be taken.  */
616   action_kind kind;
617
618   /* A pointer to the action record entry.  */
619   const unsigned char *table_entry;
620
621   /* Where we should jump to actually take an action (trigger a cleanup or an
622      exception handler).  */
623   _Unwind_Ptr landing_pad;
624
625   /* If we have a handler matching our exception, these are the filter to
626      trigger it and the corresponding id.  */
627   _Unwind_Sword ttype_filter;
628   _Unwind_Ptr   ttype_entry;
629
630 } action_descriptor;
631
632 static void
633 db_action_for (action_descriptor *action, _Unwind_Context *uw_context)
634 {
635   _Unwind_Ptr ip = _Unwind_GetIP (uw_context) - 1;
636
637   db (DB_ACTIONS, "For ip @ 0x%08x => ", ip);
638
639   switch (action->kind)
640      {
641      case unknown:
642        db (DB_ACTIONS, "lpad @ 0x%x, record @ 0x%x\n",
643            action->landing_pad, action->table_entry);
644        break;
645
646      case nothing:
647        db (DB_ACTIONS, "Nothing\n");
648        break;
649
650      case cleanup:
651        db (DB_ACTIONS, "Cleanup\n");
652        break;
653
654      case handler:
655        db (DB_ACTIONS, "Handler, filter = %d\n", action->ttype_filter);
656        break;
657
658      default:
659        db (DB_ACTIONS, "Err? Unexpected action kind !\n");
660        break;
661     }
662
663   return;
664 }
665
666 /* Search the call_site_table of REGION for an entry appropriate for the
667    UW_CONTEXT's IP.  If one is found, store the associated landing_pad
668    and action_table entry, and set the ACTION kind to unknown for further
669    analysis.  Otherwise, set the ACTION kind to nothing.
670
671    There are two variants of this routine, depending on the underlying
672    mechanism (DWARF/SJLJ), which account for differences in the tables.  */
673
674 #ifdef __USING_SJLJ_EXCEPTIONS__
675
676 #define __builtin_eh_return_data_regno(x) x
677
678 static void
679 get_call_site_action_for (_Unwind_Context *uw_context,
680                           region_descriptor *region,
681                           action_descriptor *action)
682 {
683   /* Subtract 1 because GetIP returns the actual call_site value + 1.  */
684   _Unwind_Ptr call_site = _Unwind_GetIP (uw_context) - 1;
685
686   /* call_site is a direct index into the call-site table, with two special
687      values : -1 for no-action and 0 for "terminate".  The latter should never
688      show up for Ada.  To test for the former, beware that _Unwind_Ptr might
689      be unsigned.  */
690
691   if ((int)call_site < 0)
692     {
693       action->kind = nothing;
694       return;
695     }
696   else if (call_site == 0)
697     {
698       db (DB_ERR, "========> Err, null call_site for Ada/sjlj\n");
699       action->kind = nothing;
700       return;
701     }
702   else
703     {
704       _uleb128_t cs_lp, cs_action;
705
706       /* Let the caller know there may be an action to take, but let it
707          determine the kind.  */
708       action->kind = unknown;
709
710       /* We have a direct index into the call-site table, but this table is
711          made of leb128 values, the encoding length of which is variable.  We
712          can't merely compute an offset from the index, then, but have to read
713          all the entries before the one of interest.  */
714
715       const unsigned char *p = region->call_site_table;
716
717       do {
718         p = read_uleb128 (p, &cs_lp);
719         p = read_uleb128 (p, &cs_action);
720       } while (--call_site);
721
722       action->landing_pad = cs_lp + 1;
723
724       if (cs_action)
725         action->table_entry = region->action_table + cs_action - 1;
726       else
727         action->table_entry = 0;
728
729       return;
730     }
731 }
732
733 #else /* !__USING_SJLJ_EXCEPTIONS__  */
734
735 static void
736 get_call_site_action_for (_Unwind_Context *uw_context,
737                           region_descriptor *region,
738                           action_descriptor *action)
739 {
740   /* Subtract 1 because GetIP yields a call return address while we are
741      interested in information for the call point.  This does not always
742      yield the exact call instruction address but always brings the IP back
743      within the corresponding region.
744
745      ??? When unwinding up from a signal handler triggered by a trap on some
746      instruction, we usually have the faulting instruction address here and
747      subtracting 1 might get us into the wrong region.  */
748   _Unwind_Ptr ip = _Unwind_GetIP (uw_context) - 1;
749
750   const unsigned char *p = region->call_site_table;
751
752   /* Unless we are able to determine otherwise...  */
753   action->kind = nothing;
754
755   db (DB_CSITE, "\n");
756
757   while (p < region->action_table)
758     {
759       _Unwind_Ptr cs_start, cs_len, cs_lp;
760       _uleb128_t cs_action;
761
762       /* Note that all call-site encodings are "absolute" displacements.  */
763       p = read_encoded_value (0, region->call_site_encoding, p, &cs_start);
764       p = read_encoded_value (0, region->call_site_encoding, p, &cs_len);
765       p = read_encoded_value (0, region->call_site_encoding, p, &cs_lp);
766       p = read_uleb128 (p, &cs_action);
767
768       db (DB_CSITE,
769           "c_site @ 0x%08x (+0x%03x), len = %3d, lpad @ 0x%08x (+0x%03x)\n",
770           region->base+cs_start, cs_start, cs_len,
771           region->lp_base+cs_lp, cs_lp);
772
773       /* The table is sorted, so if we've passed the IP, stop.  */
774       if (ip < region->base + cs_start)
775         break;
776
777       /* If we have a match, fill the ACTION fields accordingly.  */
778       else if (ip < region->base + cs_start + cs_len)
779         {
780           /* Let the caller know there may be an action to take, but let it
781              determine the kind.  */
782           action->kind = unknown;
783
784           if (cs_lp)
785             action->landing_pad = region->lp_base + cs_lp;
786           else
787             action->landing_pad = 0;
788
789           if (cs_action)
790             action->table_entry = region->action_table + cs_action - 1;
791           else
792             action->table_entry = 0;
793
794           db (DB_CSITE, "+++\n");
795           return;
796         }
797     }
798
799   db (DB_CSITE, "---\n");
800 }
801
802 #endif /* __USING_SJLJ_EXCEPTIONS__  */
803
804 /* With CHOICE an exception choice representing an "exception - when"
805    argument, and PROPAGATED_EXCEPTION a pointer to the currently propagated
806    occurrence, return true if the latter matches the former, that is, if
807    PROPAGATED_EXCEPTION is caught by the handling code controlled by CHOICE.
808    This takes care of the special Non_Ada_Error case on VMS.  */
809
810 #define Is_Handled_By_Others  __gnat_is_handled_by_others
811 #define Language_For          __gnat_language_for
812 #define Import_Code_For       __gnat_import_code_for
813 #define EID_For               __gnat_eid_for
814 #define Adjust_N_Cleanups_For __gnat_adjust_n_cleanups_for
815
816 extern bool Is_Handled_By_Others (_Unwind_Ptr eid);
817 extern char Language_For (_Unwind_Ptr eid);
818
819 extern Exception_Code Import_Code_For (_Unwind_Ptr eid);
820
821 extern Exception_Id EID_For (_GNAT_Exception * e);
822 extern void Adjust_N_Cleanups_For (_GNAT_Exception * e, int n);
823
824 static int
825 is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception)
826 {
827   /* Pointer to the GNAT exception data corresponding to the propagated
828      occurrence.  */
829   _Unwind_Ptr E = (_Unwind_Ptr) EID_For (propagated_exception);
830
831   /* Base matching rules: An exception data (id) matches itself, "when
832      all_others" matches anything and "when others" matches anything unless
833      explicitly stated otherwise in the propagated occurrence.  */
834
835   bool is_handled =
836     choice == E
837     || choice == GNAT_ALL_OTHERS
838     || (choice == GNAT_OTHERS && Is_Handled_By_Others (E));
839
840   /* In addition, on OpenVMS, Non_Ada_Error matches VMS exceptions, and we
841      may have different exception data pointers that should match for the
842      same condition code, if both an export and an import have been
843      registered.  The import code for both the choice and the propagated
844      occurrence are expected to have been masked off regarding severity
845      bits already (at registration time for the former and from within the
846      low level exception vector for the latter).  */
847 #ifdef VMS
848   #define Non_Ada_Error system__aux_dec__non_ada_error
849   extern struct Exception_Data Non_Ada_Error;
850
851   is_handled |=
852     (Language_For (E) == 'V'
853      && choice != GNAT_OTHERS && choice != GNAT_ALL_OTHERS
854      && ((Language_For (choice) == 'V' && Import_Code_For (choice) != 0
855           && Import_Code_For (choice) == Import_Code_For (E))
856          || choice == (_Unwind_Ptr)&Non_Ada_Error));
857 #endif
858
859   return is_handled;
860 }
861
862 /* Fill out the ACTION to be taken from propagating UW_EXCEPTION up to
863    UW_CONTEXT in REGION.  */
864
865 static void
866 get_action_description_for (_Unwind_Context *uw_context,
867                             _Unwind_Exception *uw_exception,
868                             region_descriptor *region,
869                             action_descriptor *action)
870 {
871   _GNAT_Exception * gnat_exception = (_GNAT_Exception *) uw_exception;
872
873   /* Search the call site table first, which may get us a landing pad as well
874      as the head of an action record list.  */
875   get_call_site_action_for (uw_context, region, action);
876   db_action_for (action, uw_context);
877
878   /* If there is not even a call_site entry, we are done.  */
879   if (action->kind == nothing)
880     return;
881
882   /* Otherwise, check what we have at the place of the call site.  */
883
884   /* No landing pad => no cleanups or handlers.  */
885   if (action->landing_pad == 0)
886     {
887       action->kind = nothing;
888       return;
889     }
890
891   /* Landing pad + null table entry => only cleanups.  */
892   else if (action->table_entry == 0)
893     {
894       action->kind = cleanup;
895       action->ttype_filter = cleanup_filter;
896       /* The filter initialization is not strictly necessary, as cleanup-only
897          landing pads don't look at the filter value.  It is there to ensure
898          we don't pass random values and so trigger potential confusion when
899          installing the context later on.  */
900       return;
901     }
902
903   /* Landing pad + Table entry => handlers + possible cleanups.  */
904   else
905     {
906       const unsigned char * p = action->table_entry;
907
908       _sleb128_t ar_filter, ar_disp;
909
910       action->kind = nothing;
911
912       while (1)
913         {
914           p = read_sleb128 (p, &ar_filter);
915           read_sleb128 (p, &ar_disp);
916           /* Don't assign p here, as it will be incremented by ar_disp
917              below.  */
918
919           /* Null filters are for cleanups. */
920           if (ar_filter == cleanup_filter)
921             {
922               action->kind = cleanup;
923               action->ttype_filter = cleanup_filter;
924               /* The filter initialization is required here, to ensure
925                  the target landing pad branches to the cleanup code if
926                  we happen not to find a matching handler.  */
927             }
928
929           /* Positive filters are for regular handlers.  */
930           else if (ar_filter > 0)
931             {
932               /* See if the filter we have is for an exception which matches
933                  the one we are propagating.  */
934               _Unwind_Ptr choice = get_ttype_entry_for (region, ar_filter);
935
936               if (is_handled_by (choice, gnat_exception))
937                 {
938                   action->kind = handler;
939                   action->ttype_filter = ar_filter;
940                   action->ttype_entry = choice;
941                   return;
942                 }
943             }
944
945           /* Negative filter values are for C++ exception specifications.
946              Should not be there for Ada :/  */
947           else
948             db (DB_ERR, "========> Err, filter < 0 for Ada/dwarf\n");
949
950           if (ar_disp == 0)
951             return;
952
953           p += ar_disp;
954         }
955     }
956 }
957
958 /* Setup in UW_CONTEXT the eh return target IP and data registers, which will
959    be restored with the others and retrieved by the landing pad once the jump
960    occurred.  */
961
962 static void
963 setup_to_install (_Unwind_Context *uw_context,
964                   _Unwind_Exception *uw_exception,
965                   _Unwind_Ptr uw_landing_pad,
966                   int uw_filter)
967 {
968 #ifndef EH_RETURN_DATA_REGNO
969   /* We should not be called if the appropriate underlying support is not
970      there.  */
971   abort ();
972 #else
973   /* 1/ exception object pointer, which might be provided back to
974      _Unwind_Resume (and thus to this personality routine) if we are jumping
975      to a cleanup.  */
976   _Unwind_SetGR (uw_context, __builtin_eh_return_data_regno (0),
977                  (_Unwind_Word)uw_exception);
978
979   /* 2/ handler switch value register, which will also be used by the target
980      landing pad to decide what action it shall take.  */
981   _Unwind_SetGR (uw_context, __builtin_eh_return_data_regno (1),
982                  (_Unwind_Word)uw_filter);
983
984   /* Setup the address we should jump at to reach the code where there is the
985      "something" we found.  */
986   _Unwind_SetIP (uw_context, uw_landing_pad);
987 #endif
988 }
989
990 /* The following is defined from a-except.adb. Its purpose is to enable
991    automatic backtraces upon exception raise, as provided through the
992    GNAT.Traceback facilities.  */
993 extern void __gnat_notify_handled_exception (void);
994 extern void __gnat_notify_unhandled_exception (void);
995
996 /* Below is the eh personality routine per se. We currently assume that only
997    GNU-Ada exceptions are met.  */
998
999 #ifdef __USING_SJLJ_EXCEPTIONS__
1000 #define PERSONALITY_FUNCTION    __gnat_eh_personality_sj
1001 #else
1002 #define PERSONALITY_FUNCTION    __gnat_eh_personality
1003 #endif
1004
1005 /* Major tweak for ia64-vms : the CHF propagation phase calls this personality
1006    routine with sigargs/mechargs arguments and has very specific expectations
1007    on possible return values.
1008
1009    We handle this with a number of specific tricks:
1010
1011    1. We tweak the personality routine prototype to have the "version" and
1012       "phases" two first arguments be void * instead of int and _Unwind_Action
1013       as nominally expected in the GCC context.
1014
1015       This allows us to access the full range of bits passed in every case and
1016       has no impact on the callers side since each argument remains assigned
1017       the same single 64bit slot.
1018
1019    2. We retrieve the corresponding int and _Unwind_Action values within the
1020       routine for regular use with truncating conversions. This is a noop when
1021       called from the libgcc unwinder.
1022
1023    3. We assume we're called by the VMS CHF when unexpected bits are set in
1024       both those values. The incoming arguments are then real sigargs and
1025       mechargs pointers, which we then redirect to __gnat_handle_vms_condition
1026       for proper processing.
1027 */
1028 #if defined (VMS) && defined (__IA64)
1029 typedef void * version_arg_t;
1030 typedef void * phases_arg_t;
1031 #else
1032 typedef int version_arg_t;
1033 typedef _Unwind_Action phases_arg_t;
1034 #endif
1035
1036 _Unwind_Reason_Code
1037 PERSONALITY_FUNCTION (version_arg_t version_arg,
1038                       phases_arg_t phases_arg,
1039                       _Unwind_Exception_Class uw_exception_class,
1040                       _Unwind_Exception *uw_exception,
1041                       _Unwind_Context *uw_context)
1042 {
1043   /* Fetch the version and phases args with their nominal ABI types for later
1044      use. This is a noop everywhere except on ia64-vms when called from the
1045      Condition Handling Facility.  */
1046   int uw_version = (int) version_arg;
1047   _Unwind_Action uw_phases = (_Unwind_Action) phases_arg;
1048
1049   _GNAT_Exception * gnat_exception = (_GNAT_Exception *) uw_exception;
1050
1051   region_descriptor region;
1052   action_descriptor action;
1053
1054   /* Check that we're called from the ABI context we expect, with a major
1055      possible variation on VMS for IA64.  */
1056   if (uw_version != 1)
1057     {
1058       #if defined (VMS) && defined (__IA64)
1059
1060       /* Assume we're called with sigargs/mechargs arguments if really
1061          unexpected bits are set in our first two formals.  Redirect to the
1062          GNAT condition handling code in this case.  */
1063
1064       extern long __gnat_handle_vms_condition (void *, void *);
1065
1066       unsigned int version_unexpected_bits_mask = 0xffffff00U;
1067       unsigned int phases_unexpected_bits_mask  = 0xffffff00U;
1068
1069       if ((unsigned int)uw_version & version_unexpected_bits_mask
1070           && (unsigned int)uw_phases & phases_unexpected_bits_mask)
1071         return __gnat_handle_vms_condition (version_arg, phases_arg);
1072       #endif
1073
1074       return _URC_FATAL_PHASE1_ERROR;
1075     }
1076
1077   db_indent (DB_INDENT_RESET);
1078   db_phases (uw_phases);
1079   db_indent (DB_INDENT_INCREASE);
1080
1081   /* Get the region description for the context we were provided with. This
1082      will tell us if there is some lsda, call_site, action and/or ttype data
1083      for the associated ip.  */
1084   get_region_description_for (uw_context, &region);
1085   db_region_for (&region, uw_context);
1086
1087   /* No LSDA => no handlers or cleanups => we shall unwind further up.  */
1088   if (! region.lsda)
1089     return _URC_CONTINUE_UNWIND;
1090
1091   /* Search the call-site and action-record tables for the action associated
1092      with this IP.  */
1093   get_action_description_for (uw_context, uw_exception, &region, &action);
1094   db_action_for (&action, uw_context);
1095
1096   /* Whatever the phase, if there is nothing relevant in this frame,
1097      unwinding should just go on.  */
1098   if (action.kind == nothing)
1099     return _URC_CONTINUE_UNWIND;
1100
1101   /* If we found something in search phase, we should return a code indicating
1102      what to do next depending on what we found. If we only have cleanups
1103      around, we shall try to unwind further up to find a handler, otherwise,
1104      tell we have a handler, which will trigger the second phase.  */
1105   if (uw_phases & _UA_SEARCH_PHASE)
1106     {
1107       if (action.kind == cleanup)
1108         {
1109           Adjust_N_Cleanups_For (gnat_exception, 1);
1110           return _URC_CONTINUE_UNWIND;
1111         }
1112       else
1113         {
1114           /* Trigger the appropriate notification routines before the second
1115              phase starts, which ensures the stack is still intact. */
1116           __gnat_notify_handled_exception ();
1117
1118           return _URC_HANDLER_FOUND;
1119         }
1120     }
1121
1122   /* We found something in cleanup/handler phase, which might be the handler
1123      or a cleanup for a handled occurrence, or a cleanup for an unhandled
1124      occurrence (we are in a FORCED_UNWIND phase in this case). Install the
1125      context to get there.  */
1126
1127   /* If we are going to install a cleanup context, decrement the cleanup
1128      count.  This is required in a FORCED_UNWINDing phase (for an unhandled
1129      exception), as this is used from the forced unwinding handler in
1130      Ada.Exceptions.Exception_Propagation to decide whether unwinding should
1131      proceed further or Unhandled_Exception_Terminate should be called.  */
1132   if (action.kind == cleanup)
1133     Adjust_N_Cleanups_For (gnat_exception, -1);
1134
1135   setup_to_install
1136     (uw_context, uw_exception, action.landing_pad, action.ttype_filter);
1137
1138   return _URC_INSTALL_CONTEXT;
1139 }
1140
1141 /* Define the consistently named wrappers imported by Propagate_Exception.  */
1142
1143 #ifdef __USING_SJLJ_EXCEPTIONS__
1144
1145 #undef _Unwind_RaiseException
1146
1147 _Unwind_Reason_Code
1148 __gnat_Unwind_RaiseException (_Unwind_Exception *e)
1149 {
1150   return _Unwind_SjLj_RaiseException (e);
1151 }
1152
1153
1154 #undef _Unwind_ForcedUnwind
1155
1156 _Unwind_Reason_Code
1157 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
1158                             void * handler,
1159                             void * argument)
1160 {
1161   return _Unwind_SjLj_ForcedUnwind (e, handler, argument);
1162 }
1163
1164
1165 #else /* __USING_SJLJ_EXCEPTIONS__ */
1166
1167 _Unwind_Reason_Code
1168 __gnat_Unwind_RaiseException (_Unwind_Exception *e)
1169 {
1170   return _Unwind_RaiseException (e);
1171 }
1172
1173 _Unwind_Reason_Code
1174 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
1175                             void * handler,
1176                             void * argument)
1177 {
1178   return _Unwind_ForcedUnwind (e, handler, argument);
1179 }
1180
1181 #endif /* __USING_SJLJ_EXCEPTIONS__ */
1182
1183 #else
1184 /* ! IN_RTS  */
1185
1186 /* Define the corresponding stubs for the compiler.  */
1187
1188 /* We don't want fancy_abort here.  */
1189 #undef abort
1190
1191 _Unwind_Reason_Code
1192 __gnat_Unwind_RaiseException (_Unwind_Exception *e ATTRIBUTE_UNUSED)
1193 {
1194   abort ();
1195 }
1196
1197
1198 _Unwind_Reason_Code
1199 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e ATTRIBUTE_UNUSED,
1200                             void * handler ATTRIBUTE_UNUSED,
1201                             void * argument ATTRIBUTE_UNUSED)
1202 {
1203   abort ();
1204 }
1205
1206 #endif /* IN_RTS */