OSDN Git Service

gcc/ada/
[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-2007, 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 /* In the top-of-tree GCC, tconfig does not include tm.h, but in GCC 3.2
39    it does.  To avoid branching raise.c just for that purpose, we kludge by
40    looking for a symbol always defined by tm.h and if it's not defined,
41    we include it.  */
42 #ifndef FIRST_PSEUDO_REGISTER
43 #include "coretypes.h"
44 #include "tm.h"
45 #endif
46 #include "tsystem.h"
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 wether 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
667 /* Search the call_site_table of REGION for an entry appropriate for the
668    UW_CONTEXT's ip. If one is found, store the associated landing_pad and
669    action_table entry, and set the ACTION kind to unknown for further
670    analysis. Otherwise, set the ACTION kind to nothing.
671
672    There are two variants of this routine, depending on the underlying
673    mechanism (dwarf/sjlj), which account for differences in the tables
674    organization.
675 */
676
677 #ifdef __USING_SJLJ_EXCEPTIONS__
678
679 #define __builtin_eh_return_data_regno(x) x
680
681 static void
682 get_call_site_action_for (_Unwind_Context *uw_context,
683                           region_descriptor *region,
684                           action_descriptor *action)
685 {
686   _Unwind_Ptr call_site
687     = _Unwind_GetIP (uw_context) - 1;
688   /* Subtract 1 because GetIP returns the actual call_site value + 1.  */
689
690   /* call_site is a direct index into the call-site table, with two special
691      values : -1 for no-action and 0 for "terminate". The latter should never
692      show up for Ada. To test for the former, beware that _Unwind_Ptr might be
693      unsigned.  */
694
695   if ((int)call_site < 0)
696     {
697       action->kind = nothing;
698       return;
699     }
700   else if (call_site == 0)
701     {
702       db (DB_ERR, "========> Err, null call_site for Ada/sjlj\n");
703       action->kind = nothing;
704       return;
705     }
706   else
707     {
708       _uleb128_t cs_lp, cs_action;
709
710       /* Let the caller know there may be an action to take, but let it
711          determine the kind.  */
712       action->kind = unknown;
713
714       /* We have a direct index into the call-site table, but this table is
715          made of leb128 values, the encoding length of which is variable. We
716          can't merely compute an offset from the index, then, but have to read
717          all the entries before the one of interest.  */
718
719       const unsigned char * p = region->call_site_table;
720
721       do {
722         p = read_uleb128 (p, &cs_lp);
723         p = read_uleb128 (p, &cs_action);
724       } while (--call_site);
725
726
727       action->landing_pad = cs_lp + 1;
728
729       if (cs_action)
730         action->table_entry = region->action_table + cs_action - 1;
731       else
732         action->table_entry = 0;
733
734       return;
735     }
736 }
737
738 #else
739 /* ! __USING_SJLJ_EXCEPTIONS__ */
740
741 static void
742 get_call_site_action_for (_Unwind_Context *uw_context,
743                           region_descriptor *region,
744                           action_descriptor *action)
745 {
746   _Unwind_Ptr ip
747     = _Unwind_GetIP (uw_context) - 1;
748   /* Subtract 1 because GetIP yields a call return address while we are
749      interested in information for the call point. This does not always yield
750      the exact call instruction address but always brings the ip back within
751      the corresponding region.
752
753      ??? When unwinding up from a signal handler triggered by a trap on some
754      instruction, we usually have the faulting instruction address here and
755      subtracting 1 might get us into the wrong region.  */
756
757   const unsigned char * p
758     = region->call_site_table;
759
760   /* Unless we are able to determine otherwise ... */
761   action->kind = nothing;
762
763   db (DB_CSITE, "\n");
764
765   while (p < region->action_table)
766     {
767       _Unwind_Ptr cs_start, cs_len, cs_lp;
768       _uleb128_t cs_action;
769
770       /* Note that all call-site encodings are "absolute" displacements.  */
771       p = read_encoded_value (0, region->call_site_encoding, p, &cs_start);
772       p = read_encoded_value (0, region->call_site_encoding, p, &cs_len);
773       p = read_encoded_value (0, region->call_site_encoding, p, &cs_lp);
774       p = read_uleb128 (p, &cs_action);
775
776       db (DB_CSITE,
777           "c_site @ 0x%08x (+0x%03x), len = %3d, lpad @ 0x%08x (+0x%03x)\n",
778           region->base+cs_start, cs_start, cs_len,
779           region->lp_base+cs_lp, cs_lp);
780
781       /* The table is sorted, so if we've passed the ip, stop.  */
782       if (ip < region->base + cs_start)
783         break;
784
785       /* If we have a match, fill the ACTION fields accordingly.  */
786       else if (ip < region->base + cs_start + cs_len)
787         {
788           /* Let the caller know there may be an action to take, but let it
789              determine the kind.  */
790           action->kind = unknown;
791
792           if (cs_lp)
793             action->landing_pad = region->lp_base + cs_lp;
794           else
795             action->landing_pad = 0;
796
797           if (cs_action)
798             action->table_entry = region->action_table + cs_action - 1;
799           else
800             action->table_entry = 0;
801
802           db (DB_CSITE, "+++\n");
803           return;
804         }
805     }
806
807   db (DB_CSITE, "---\n");
808 }
809
810 #endif
811
812 /* With CHOICE an exception choice representing an "exception - when"
813    argument, and PROPAGATED_EXCEPTION a pointer to the currently propagated
814    occurrence, return true iif the latter matches the former, that is, if
815    PROPAGATED_EXCEPTION is caught by the handling code controlled by CHOICE.
816    This takes care of the special Non_Ada_Error case on VMS.  */
817
818 #define Is_Handled_By_Others  __gnat_is_handled_by_others
819 #define Language_For          __gnat_language_for
820 #define Import_Code_For       __gnat_import_code_for
821 #define EID_For               __gnat_eid_for
822 #define Adjust_N_Cleanups_For __gnat_adjust_n_cleanups_for
823
824 extern bool Is_Handled_By_Others (_Unwind_Ptr eid);
825 extern char Language_For (_Unwind_Ptr eid);
826
827 extern Exception_Code Import_Code_For (_Unwind_Ptr eid);
828
829 extern Exception_Id EID_For (_GNAT_Exception * e);
830 extern void Adjust_N_Cleanups_For (_GNAT_Exception * e, int n);
831
832 static int
833 is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception)
834 {
835   /* Pointer to the GNAT exception data corresponding to the propagated
836      occurrence.  */
837   _Unwind_Ptr E = (_Unwind_Ptr) EID_For (propagated_exception);
838
839   /* Base matching rules: An exception data (id) matches itself, "when
840      all_others" matches anything and "when others" matches anything unless
841      explicitly stated otherwise in the propagated occurrence.  */
842
843   bool is_handled =
844     choice == E
845     || choice == GNAT_ALL_OTHERS
846     || (choice == GNAT_OTHERS && Is_Handled_By_Others (E));
847
848   /* In addition, on OpenVMS, Non_Ada_Error matches VMS exceptions, and we
849      may have different exception data pointers that should match for the
850      same condition code, if both an export and an import have been
851      registered.  The import code for both the choice and the propagated
852      occurrence are expected to have been masked off regarding severity
853      bits already (at registration time for the former and from within the
854      low level exception vector for the latter).  */
855 #ifdef VMS
856   #define Non_Ada_Error system__aux_dec__non_ada_error
857   extern struct Exception_Data Non_Ada_Error;
858
859   is_handled |=
860     (Language_For (E) == 'V'
861      && choice != GNAT_OTHERS && choice != GNAT_ALL_OTHERS
862      && ((Language_For (choice) == 'V' && Import_Code_For (choice) != 0
863           && Import_Code_For (choice) == Import_Code_For (E))
864          || choice == (_Unwind_Ptr)&Non_Ada_Error));
865 #endif
866
867   return is_handled;
868 }
869
870 /* Fill out the ACTION to be taken from propagating UW_EXCEPTION up to
871    UW_CONTEXT in REGION.  */
872
873 static void
874 get_action_description_for (_Unwind_Context *uw_context,
875                             _Unwind_Exception *uw_exception,
876                             region_descriptor *region,
877                             action_descriptor *action)
878 {
879   _GNAT_Exception * gnat_exception = (_GNAT_Exception *) uw_exception;
880
881   /* Search the call site table first, which may get us a landing pad as well
882      as the head of an action record list.  */
883   get_call_site_action_for (uw_context, region, action);
884   db_action_for (action, uw_context);
885
886   /* If there is not even a call_site entry, we are done.  */
887   if (action->kind == nothing)
888     return;
889
890   /* Otherwise, check what we have at the place of the call site.  */
891
892   /* No landing pad => no cleanups or handlers.  */
893   if (action->landing_pad == 0)
894     {
895       action->kind = nothing;
896       return;
897     }
898
899   /* Landing pad + null table entry => only cleanups.  */
900   else if (action->table_entry == 0)
901     {
902       action->kind = cleanup;
903       action->ttype_filter = cleanup_filter;
904       /* The filter initialization is not strictly necessary, as cleanup-only
905          landing pads don't look at the filter value.  It is there to ensure
906          we don't pass random values and so trigger potential confusion when
907          installing the context later on.  */
908       return;
909     }
910
911   /* Landing pad + Table entry => handlers + possible cleanups.  */
912   else
913     {
914       const unsigned char * p = action->table_entry;
915
916       _sleb128_t ar_filter, ar_disp;
917
918       action->kind = nothing;
919
920       while (1)
921         {
922           p = read_sleb128 (p, &ar_filter);
923           read_sleb128 (p, &ar_disp);
924           /* Don't assign p here, as it will be incremented by ar_disp
925              below.  */
926
927           /* Null filters are for cleanups. */
928           if (ar_filter == cleanup_filter)
929             {
930               action->kind = cleanup;
931               action->ttype_filter = cleanup_filter;
932               /* The filter initialization is required here, to ensure
933                  the target landing pad branches to the cleanup code if
934                  we happen not to find a matching handler.  */
935             }
936
937           /* Positive filters are for regular handlers.  */
938           else if (ar_filter > 0)
939             {
940               /* See if the filter we have is for an exception which matches
941                  the one we are propagating.  */
942               _Unwind_Ptr choice = get_ttype_entry_for (region, ar_filter);
943
944               if (is_handled_by (choice, gnat_exception))
945                 {
946                   action->kind = handler;
947                   action->ttype_filter = ar_filter;
948                   action->ttype_entry = choice;
949                   return;
950                 }
951             }
952
953           /* Negative filter values are for C++ exception specifications.
954              Should not be there for Ada :/  */
955           else
956             db (DB_ERR, "========> Err, filter < 0 for Ada/dwarf\n");
957
958           if (ar_disp == 0)
959             return;
960
961           p += ar_disp;
962         }
963     }
964 }
965
966 /* Setup in UW_CONTEXT the eh return target IP and data registers, which will
967    be restored with the others and retrieved by the landing pad once the jump
968    occurred.  */
969
970 static void
971 setup_to_install (_Unwind_Context *uw_context,
972                   _Unwind_Exception *uw_exception,
973                   _Unwind_Ptr uw_landing_pad,
974                   int uw_filter)
975 {
976 #ifndef EH_RETURN_DATA_REGNO
977   /* We should not be called if the appropriate underlying support is not
978      there.  */
979   abort ();
980 #else
981   /* 1/ exception object pointer, which might be provided back to
982      _Unwind_Resume (and thus to this personality routine) if we are jumping
983      to a cleanup.  */
984   _Unwind_SetGR (uw_context, __builtin_eh_return_data_regno (0),
985                  (_Unwind_Word)uw_exception);
986
987   /* 2/ handler switch value register, which will also be used by the target
988      landing pad to decide what action it shall take.  */
989   _Unwind_SetGR (uw_context, __builtin_eh_return_data_regno (1),
990                  (_Unwind_Word)uw_filter);
991
992   /* Setup the address we should jump at to reach the code where there is the
993      "something" we found.  */
994   _Unwind_SetIP (uw_context, uw_landing_pad);
995 #endif
996 }
997
998 /* The following is defined from a-except.adb. Its purpose is to enable
999    automatic backtraces upon exception raise, as provided through the
1000    GNAT.Traceback facilities.  */
1001 extern void __gnat_notify_handled_exception (void);
1002 extern void __gnat_notify_unhandled_exception (void);
1003
1004 /* Below is the eh personality routine per se. We currently assume that only
1005    GNU-Ada exceptions are met.  */
1006
1007 #ifdef __USING_SJLJ_EXCEPTIONS__
1008 #define PERSONALITY_FUNCTION    __gnat_eh_personality_sj
1009 #else
1010 #define PERSONALITY_FUNCTION    __gnat_eh_personality
1011 #endif
1012
1013 /* Major tweak for ia64-vms : the CHF propagation phase calls this personality
1014    routine with sigargs/mechargs arguments and has very specific expectations
1015    on possible return values.
1016
1017    We handle this with a number of specific tricks:
1018
1019    1. We tweak the personality routine prototype to have the "version" and
1020       "phases" two first arguments be void * instead of int and _Unwind_Action
1021       as nominally expected in the GCC context.
1022
1023       This allows us to access the full range of bits passed in every case and
1024       has no impact on the callers side since each argument remains assigned
1025       the same single 64bit slot.
1026
1027    2. We retrieve the corresponding int and _Unwind_Action values within the
1028       routine for regular use with truncating conversions. This is a noop when
1029       called from the libgcc unwinder.
1030
1031    3. We assume we're called by the VMS CHF when unexpected bits are set in
1032       both those values. The incoming arguments are then real sigargs and
1033       mechargs pointers, which we then redirect to __gnat_handle_vms_condition
1034       for proper processing.
1035 */
1036 #if defined (VMS) && defined (__IA64)
1037 typedef void * version_arg_t;
1038 typedef void * phases_arg_t;
1039 #else
1040 typedef int version_arg_t;
1041 typedef _Unwind_Action phases_arg_t;
1042 #endif
1043
1044 _Unwind_Reason_Code
1045 PERSONALITY_FUNCTION (version_arg_t version_arg,
1046                       phases_arg_t phases_arg,
1047                       _Unwind_Exception_Class uw_exception_class,
1048                       _Unwind_Exception *uw_exception,
1049                       _Unwind_Context *uw_context)
1050 {
1051   /* Fetch the version and phases args with their nominal ABI types for later
1052      use. This is a noop everywhere except on ia64-vms when called from the
1053      Condition Handling Facility.  */
1054   int uw_version = (int) version_arg;
1055   _Unwind_Action uw_phases = (_Unwind_Action) phases_arg;
1056
1057   _GNAT_Exception * gnat_exception = (_GNAT_Exception *) uw_exception;
1058
1059   region_descriptor region;
1060   action_descriptor action;
1061
1062   /* Check that we're called from the ABI context we expect, with a major
1063      possible variation on VMS for IA64.  */
1064   if (uw_version != 1)
1065     {
1066       #if defined (VMS) && defined (__IA64)
1067
1068       /* Assume we're called with sigargs/mechargs arguments if really
1069          unexpected bits are set in our first two formals.  Redirect to the
1070          GNAT condition handling code in this case.  */
1071
1072       extern long __gnat_handle_vms_condition (void *, void *);
1073
1074       unsigned int version_unexpected_bits_mask = 0xffffff00U;
1075       unsigned int phases_unexpected_bits_mask  = 0xffffff00U;
1076
1077       if ((unsigned int)uw_version & version_unexpected_bits_mask
1078           && (unsigned int)uw_phases & phases_unexpected_bits_mask)
1079         return __gnat_handle_vms_condition (version_arg, phases_arg);
1080       #endif
1081
1082       return _URC_FATAL_PHASE1_ERROR;
1083     }
1084
1085   db_indent (DB_INDENT_RESET);
1086   db_phases (uw_phases);
1087   db_indent (DB_INDENT_INCREASE);
1088
1089   /* Get the region description for the context we were provided with. This
1090      will tell us if there is some lsda, call_site, action and/or ttype data
1091      for the associated ip.  */
1092   get_region_description_for (uw_context, &region);
1093   db_region_for (&region, uw_context);
1094
1095   /* No LSDA => no handlers or cleanups => we shall unwind further up.  */
1096   if (! region.lsda)
1097     return _URC_CONTINUE_UNWIND;
1098
1099   /* Search the call-site and action-record tables for the action associated
1100      with this IP.  */
1101   get_action_description_for (uw_context, uw_exception, &region, &action);
1102   db_action_for (&action, uw_context);
1103
1104   /* Whatever the phase, if there is nothing relevant in this frame,
1105      unwinding should just go on.  */
1106   if (action.kind == nothing)
1107     return _URC_CONTINUE_UNWIND;
1108
1109   /* If we found something in search phase, we should return a code indicating
1110      what to do next depending on what we found. If we only have cleanups
1111      around, we shall try to unwind further up to find a handler, otherwise,
1112      tell we have a handler, which will trigger the second phase.  */
1113   if (uw_phases & _UA_SEARCH_PHASE)
1114     {
1115       if (action.kind == cleanup)
1116         {
1117           Adjust_N_Cleanups_For (gnat_exception, 1);
1118           return _URC_CONTINUE_UNWIND;
1119         }
1120       else
1121         {
1122           /* Trigger the appropriate notification routines before the second
1123              phase starts, which ensures the stack is still intact. */
1124           __gnat_notify_handled_exception ();
1125
1126           return _URC_HANDLER_FOUND;
1127         }
1128     }
1129
1130   /* We found something in cleanup/handler phase, which might be the handler
1131      or a cleanup for a handled occurrence, or a cleanup for an unhandled
1132      occurrence (we are in a FORCED_UNWIND phase in this case). Install the
1133      context to get there.  */
1134
1135   /* If we are going to install a cleanup context, decrement the cleanup
1136      count.  This is required in a FORCED_UNWINDing phase (for an unhandled
1137      exception), as this is used from the forced unwinding handler in
1138      Ada.Exceptions.Exception_Propagation to decide wether unwinding should
1139      proceed further or Unhandled_Exception_Terminate should be called.  */
1140   if (action.kind == cleanup)
1141     Adjust_N_Cleanups_For (gnat_exception, -1);
1142
1143   setup_to_install
1144     (uw_context, uw_exception, action.landing_pad, action.ttype_filter);
1145
1146   return _URC_INSTALL_CONTEXT;
1147 }
1148
1149 /* Define the consistently named wrappers imported by Propagate_Exception.  */
1150
1151 #ifdef __USING_SJLJ_EXCEPTIONS__
1152
1153 #undef _Unwind_RaiseException
1154
1155 _Unwind_Reason_Code
1156 __gnat_Unwind_RaiseException (_Unwind_Exception *e)
1157 {
1158   return _Unwind_SjLj_RaiseException (e);
1159 }
1160
1161
1162 #undef _Unwind_ForcedUnwind
1163
1164 _Unwind_Reason_Code
1165 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
1166                             void * handler,
1167                             void * argument)
1168 {
1169   return _Unwind_SjLj_ForcedUnwind (e, handler, argument);
1170 }
1171
1172
1173 #else /* __USING_SJLJ_EXCEPTIONS__ */
1174
1175 _Unwind_Reason_Code
1176 __gnat_Unwind_RaiseException (_Unwind_Exception *e)
1177 {
1178   return _Unwind_RaiseException (e);
1179 }
1180
1181 _Unwind_Reason_Code
1182 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
1183                             void * handler,
1184                             void * argument)
1185 {
1186   return _Unwind_ForcedUnwind (e, handler, argument);
1187 }
1188
1189 #endif /* __USING_SJLJ_EXCEPTIONS__ */
1190
1191 #else
1192 /* ! IN_RTS  */
1193
1194 /* Define the corresponding stubs for the compiler.  */
1195
1196 /* We don't want fancy_abort here.  */
1197 #undef abort
1198
1199 _Unwind_Reason_Code
1200 __gnat_Unwind_RaiseException (_Unwind_Exception *e ATTRIBUTE_UNUSED)
1201 {
1202   abort ();
1203 }
1204
1205
1206 _Unwind_Reason_Code
1207 __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e ATTRIBUTE_UNUSED,
1208                             void * handler ATTRIBUTE_UNUSED,
1209                             void * argument ATTRIBUTE_UNUSED)
1210 {
1211   abort ();
1212 }
1213
1214 #endif /* IN_RTS */