Home | History | Annotate | Line # | Download | only in libgcc
unwind-dw2.c revision 1.1
      1  1.1  mrg /* DWARF2 exception handling and frame unwind runtime interface routines.
      2  1.1  mrg    Copyright (C) 1997-2013 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg    This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      7  1.1  mrg    under the terms of the GNU General Public License as published by
      8  1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
      9  1.1  mrg    any later version.
     10  1.1  mrg 
     11  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     12  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     13  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     14  1.1  mrg    License for more details.
     15  1.1  mrg 
     16  1.1  mrg    Under Section 7 of GPL version 3, you are granted additional
     17  1.1  mrg    permissions described in the GCC Runtime Library Exception, version
     18  1.1  mrg    3.1, as published by the Free Software Foundation.
     19  1.1  mrg 
     20  1.1  mrg    You should have received a copy of the GNU General Public License and
     21  1.1  mrg    a copy of the GCC Runtime Library Exception along with this program;
     22  1.1  mrg    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     24  1.1  mrg 
     25  1.1  mrg #include "tconfig.h"
     26  1.1  mrg #include "tsystem.h"
     27  1.1  mrg #include "coretypes.h"
     28  1.1  mrg #include "tm.h"
     29  1.1  mrg #include "libgcc_tm.h"
     30  1.1  mrg #include "dwarf2.h"
     31  1.1  mrg #include "unwind.h"
     32  1.1  mrg #ifdef __USING_SJLJ_EXCEPTIONS__
     33  1.1  mrg # define NO_SIZE_OF_ENCODED_VALUE
     34  1.1  mrg #endif
     35  1.1  mrg #include "unwind-pe.h"
     36  1.1  mrg #include "unwind-dw2-fde.h"
     37  1.1  mrg #include "gthr.h"
     38  1.1  mrg #include "unwind-dw2.h"
     39  1.1  mrg 
     40  1.1  mrg #ifdef HAVE_SYS_SDT_H
     41  1.1  mrg #include <sys/sdt.h>
     42  1.1  mrg #endif
     43  1.1  mrg 
     44  1.1  mrg #ifndef __USING_SJLJ_EXCEPTIONS__
     45  1.1  mrg 
     46  1.1  mrg #ifndef STACK_GROWS_DOWNWARD
     47  1.1  mrg #define STACK_GROWS_DOWNWARD 0
     48  1.1  mrg #else
     49  1.1  mrg #undef STACK_GROWS_DOWNWARD
     50  1.1  mrg #define STACK_GROWS_DOWNWARD 1
     51  1.1  mrg #endif
     52  1.1  mrg 
     53  1.1  mrg /* Dwarf frame registers used for pre gcc 3.0 compiled glibc.  */
     54  1.1  mrg #ifndef PRE_GCC3_DWARF_FRAME_REGISTERS
     55  1.1  mrg #define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS
     56  1.1  mrg #endif
     57  1.1  mrg 
     58  1.1  mrg #ifndef DWARF_REG_TO_UNWIND_COLUMN
     59  1.1  mrg #define DWARF_REG_TO_UNWIND_COLUMN(REGNO) (REGNO)
     60  1.1  mrg #endif
     61  1.1  mrg 
     62  1.1  mrg /* ??? For the public function interfaces, we tend to gcc_assert that the
     63  1.1  mrg    column numbers are in range.  For the dwarf2 unwind info this does happen,
     64  1.1  mrg    although so far in a case that doesn't actually matter.
     65  1.1  mrg 
     66  1.1  mrg    See PR49146, in which a call from x86_64 ms abi to x86_64 unix abi stores
     67  1.1  mrg    the call-saved xmm registers and annotates them.  We havn't bothered
     68  1.1  mrg    providing support for the xmm registers for the x86_64 port primarily
     69  1.1  mrg    because the 64-bit windows targets don't use dwarf2 unwind, using sjlj or
     70  1.1  mrg    SEH instead.  Adding the support for unix targets would generally be a
     71  1.1  mrg    waste.  However, some runtime libraries supplied with ICC do contain such
     72  1.1  mrg    an unorthodox transition, as well as the unwind info to match.  This loss
     73  1.1  mrg    of register restoration doesn't matter in practice, because the exception
     74  1.1  mrg    is caught in the native unix abi, where all of the xmm registers are
     75  1.1  mrg    call clobbered.
     76  1.1  mrg 
     77  1.1  mrg    Ideally, we'd record some bit to notice when we're failing to restore some
     78  1.1  mrg    register recorded in the unwind info, but to do that we need annotation on
     79  1.1  mrg    the unix->ms abi edge, so that we know when the register data may be
     80  1.1  mrg    discarded.  And since this edge is also within the ICC library, we're
     81  1.1  mrg    unlikely to be able to get the new annotation.
     82  1.1  mrg 
     83  1.1  mrg    Barring a magic solution to restore the ms abi defined 128-bit xmm registers
     84  1.1  mrg    (as distictly opposed to the full runtime width) without causing extra
     85  1.1  mrg    overhead for normal unix abis, the best solution seems to be to simply
     86  1.1  mrg    ignore unwind data for unknown columns.  */
     87  1.1  mrg 
     88  1.1  mrg #define UNWIND_COLUMN_IN_RANGE(x) \
     89  1.1  mrg     __builtin_expect((x) <= DWARF_FRAME_REGISTERS, 1)
     90  1.1  mrg 
     91  1.1  mrg #ifdef REG_VALUE_IN_UNWIND_CONTEXT
     92  1.1  mrg typedef _Unwind_Word _Unwind_Context_Reg_Val;
     93  1.1  mrg 
     94  1.1  mrg #ifndef ASSUME_EXTENDED_UNWIND_CONTEXT
     95  1.1  mrg #define ASSUME_EXTENDED_UNWIND_CONTEXT 1
     96  1.1  mrg #endif
     97  1.1  mrg 
     98  1.1  mrg static inline _Unwind_Word
     99  1.1  mrg _Unwind_Get_Unwind_Word (_Unwind_Context_Reg_Val val)
    100  1.1  mrg {
    101  1.1  mrg   return val;
    102  1.1  mrg }
    103  1.1  mrg 
    104  1.1  mrg static inline _Unwind_Context_Reg_Val
    105  1.1  mrg _Unwind_Get_Unwind_Context_Reg_Val (_Unwind_Word val)
    106  1.1  mrg {
    107  1.1  mrg   return val;
    108  1.1  mrg }
    109  1.1  mrg #else
    110  1.1  mrg typedef void *_Unwind_Context_Reg_Val;
    111  1.1  mrg 
    112  1.1  mrg static inline _Unwind_Word
    113  1.1  mrg _Unwind_Get_Unwind_Word (_Unwind_Context_Reg_Val val)
    114  1.1  mrg {
    115  1.1  mrg   return (_Unwind_Word) (_Unwind_Internal_Ptr) val;
    116  1.1  mrg }
    117  1.1  mrg 
    118  1.1  mrg static inline _Unwind_Context_Reg_Val
    119  1.1  mrg _Unwind_Get_Unwind_Context_Reg_Val (_Unwind_Word val)
    120  1.1  mrg {
    121  1.1  mrg   return (_Unwind_Context_Reg_Val) (_Unwind_Internal_Ptr) val;
    122  1.1  mrg }
    123  1.1  mrg #endif
    124  1.1  mrg 
    125  1.1  mrg #ifndef ASSUME_EXTENDED_UNWIND_CONTEXT
    126  1.1  mrg #define ASSUME_EXTENDED_UNWIND_CONTEXT 0
    127  1.1  mrg #endif
    128  1.1  mrg 
    129  1.1  mrg /* This is the register and unwind state for a particular frame.  This
    130  1.1  mrg    provides the information necessary to unwind up past a frame and return
    131  1.1  mrg    to its caller.  */
    132  1.1  mrg struct _Unwind_Context
    133  1.1  mrg {
    134  1.1  mrg   _Unwind_Context_Reg_Val reg[DWARF_FRAME_REGISTERS+1];
    135  1.1  mrg   void *cfa;
    136  1.1  mrg   void *ra;
    137  1.1  mrg   void *lsda;
    138  1.1  mrg   struct dwarf_eh_bases bases;
    139  1.1  mrg   /* Signal frame context.  */
    140  1.1  mrg #define SIGNAL_FRAME_BIT ((~(_Unwind_Word) 0 >> 1) + 1)
    141  1.1  mrg   /* Context which has version/args_size/by_value fields.  */
    142  1.1  mrg #define EXTENDED_CONTEXT_BIT ((~(_Unwind_Word) 0 >> 2) + 1)
    143  1.1  mrg   _Unwind_Word flags;
    144  1.1  mrg   /* 0 for now, can be increased when further fields are added to
    145  1.1  mrg      struct _Unwind_Context.  */
    146  1.1  mrg   _Unwind_Word version;
    147  1.1  mrg   _Unwind_Word args_size;
    148  1.1  mrg   char by_value[DWARF_FRAME_REGISTERS+1];
    149  1.1  mrg };
    150  1.1  mrg 
    151  1.1  mrg /* Byte size of every register managed by these routines.  */
    152  1.1  mrg static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1];
    153  1.1  mrg 
    154  1.1  mrg 
    155  1.1  mrg /* Read unaligned data from the instruction buffer.  */
    157  1.1  mrg 
    158  1.1  mrg union unaligned
    159  1.1  mrg {
    160  1.1  mrg   void *p;
    161  1.1  mrg   unsigned u2 __attribute__ ((mode (HI)));
    162  1.1  mrg   unsigned u4 __attribute__ ((mode (SI)));
    163  1.1  mrg   unsigned u8 __attribute__ ((mode (DI)));
    164  1.1  mrg   signed s2 __attribute__ ((mode (HI)));
    165  1.1  mrg   signed s4 __attribute__ ((mode (SI)));
    166  1.1  mrg   signed s8 __attribute__ ((mode (DI)));
    167  1.1  mrg } __attribute__ ((packed));
    168  1.1  mrg 
    169  1.1  mrg static void uw_update_context (struct _Unwind_Context *, _Unwind_FrameState *);
    170  1.1  mrg static _Unwind_Reason_Code uw_frame_state_for (struct _Unwind_Context *,
    171  1.1  mrg 					       _Unwind_FrameState *);
    172  1.1  mrg 
    173  1.1  mrg static inline void *
    174  1.1  mrg read_pointer (const void *p) { const union unaligned *up = p; return up->p; }
    175  1.1  mrg 
    176  1.1  mrg static inline int
    177  1.1  mrg read_1u (const void *p) { return *(const unsigned char *) p; }
    178  1.1  mrg 
    179  1.1  mrg static inline int
    180  1.1  mrg read_1s (const void *p) { return *(const signed char *) p; }
    181  1.1  mrg 
    182  1.1  mrg static inline int
    183  1.1  mrg read_2u (const void *p) { const union unaligned *up = p; return up->u2; }
    184  1.1  mrg 
    185  1.1  mrg static inline int
    186  1.1  mrg read_2s (const void *p) { const union unaligned *up = p; return up->s2; }
    187  1.1  mrg 
    188  1.1  mrg static inline unsigned int
    189  1.1  mrg read_4u (const void *p) { const union unaligned *up = p; return up->u4; }
    190  1.1  mrg 
    191  1.1  mrg static inline int
    192  1.1  mrg read_4s (const void *p) { const union unaligned *up = p; return up->s4; }
    193  1.1  mrg 
    194  1.1  mrg static inline unsigned long
    195  1.1  mrg read_8u (const void *p) { const union unaligned *up = p; return up->u8; }
    196  1.1  mrg 
    197  1.1  mrg static inline unsigned long
    198  1.1  mrg read_8s (const void *p) { const union unaligned *up = p; return up->s8; }
    199  1.1  mrg 
    200  1.1  mrg static inline _Unwind_Word
    202  1.1  mrg _Unwind_IsSignalFrame (struct _Unwind_Context *context)
    203  1.1  mrg {
    204  1.1  mrg   return (context->flags & SIGNAL_FRAME_BIT) ? 1 : 0;
    205  1.1  mrg }
    206  1.1  mrg 
    207  1.1  mrg static inline void
    208  1.1  mrg _Unwind_SetSignalFrame (struct _Unwind_Context *context, int val)
    209  1.1  mrg {
    210  1.1  mrg   if (val)
    211  1.1  mrg     context->flags |= SIGNAL_FRAME_BIT;
    212  1.1  mrg   else
    213  1.1  mrg     context->flags &= ~SIGNAL_FRAME_BIT;
    214  1.1  mrg }
    215  1.1  mrg 
    216  1.1  mrg static inline _Unwind_Word
    217  1.1  mrg _Unwind_IsExtendedContext (struct _Unwind_Context *context)
    218  1.1  mrg {
    219  1.1  mrg   return (ASSUME_EXTENDED_UNWIND_CONTEXT
    220  1.1  mrg 	  || (context->flags & EXTENDED_CONTEXT_BIT));
    221  1.1  mrg }
    222  1.1  mrg 
    223  1.1  mrg /* Get the value of register INDEX as saved in CONTEXT.  */
    225  1.1  mrg 
    226  1.1  mrg inline _Unwind_Word
    227  1.1  mrg _Unwind_GetGR (struct _Unwind_Context *context, int index)
    228  1.1  mrg {
    229  1.1  mrg   int size;
    230  1.1  mrg   _Unwind_Context_Reg_Val val;
    231  1.1  mrg 
    232  1.1  mrg #ifdef DWARF_ZERO_REG
    233  1.1  mrg   if (index == DWARF_ZERO_REG)
    234  1.1  mrg     return 0;
    235  1.1  mrg #endif
    236  1.1  mrg 
    237  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    238  1.1  mrg   gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
    239  1.1  mrg   size = dwarf_reg_size_table[index];
    240  1.1  mrg   val = context->reg[index];
    241  1.1  mrg 
    242  1.1  mrg   if (_Unwind_IsExtendedContext (context) && context->by_value[index])
    243  1.1  mrg     return _Unwind_Get_Unwind_Word (val);
    244  1.1  mrg 
    245  1.1  mrg   /* This will segfault if the register hasn't been saved.  */
    246  1.1  mrg   if (size == sizeof(_Unwind_Ptr))
    247  1.1  mrg     return * (_Unwind_Ptr *) (_Unwind_Internal_Ptr) val;
    248  1.1  mrg   else
    249  1.1  mrg     {
    250  1.1  mrg       gcc_assert (size == sizeof(_Unwind_Word));
    251  1.1  mrg       return * (_Unwind_Word *) (_Unwind_Internal_Ptr) val;
    252  1.1  mrg     }
    253  1.1  mrg }
    254  1.1  mrg 
    255  1.1  mrg static inline void *
    256  1.1  mrg _Unwind_GetPtr (struct _Unwind_Context *context, int index)
    257  1.1  mrg {
    258  1.1  mrg   return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index);
    259  1.1  mrg }
    260  1.1  mrg 
    261  1.1  mrg /* Get the value of the CFA as saved in CONTEXT.  */
    262  1.1  mrg 
    263  1.1  mrg _Unwind_Word
    264  1.1  mrg _Unwind_GetCFA (struct _Unwind_Context *context)
    265  1.1  mrg {
    266  1.1  mrg   return (_Unwind_Ptr) context->cfa;
    267  1.1  mrg }
    268  1.1  mrg 
    269  1.1  mrg /* Overwrite the saved value for register INDEX in CONTEXT with VAL.  */
    270  1.1  mrg 
    271  1.1  mrg inline void
    272  1.1  mrg _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
    273  1.1  mrg {
    274  1.1  mrg   int size;
    275  1.1  mrg   void *ptr;
    276  1.1  mrg 
    277  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    278  1.1  mrg   gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
    279  1.1  mrg   size = dwarf_reg_size_table[index];
    280  1.1  mrg 
    281  1.1  mrg   if (_Unwind_IsExtendedContext (context) && context->by_value[index])
    282  1.1  mrg     {
    283  1.1  mrg       context->reg[index] = _Unwind_Get_Unwind_Context_Reg_Val (val);
    284  1.1  mrg       return;
    285  1.1  mrg     }
    286  1.1  mrg 
    287  1.1  mrg   ptr = (void *) (_Unwind_Internal_Ptr) context->reg[index];
    288  1.1  mrg 
    289  1.1  mrg   if (size == sizeof(_Unwind_Ptr))
    290  1.1  mrg     * (_Unwind_Ptr *) ptr = val;
    291  1.1  mrg   else
    292  1.1  mrg     {
    293  1.1  mrg       gcc_assert (size == sizeof(_Unwind_Word));
    294  1.1  mrg       * (_Unwind_Word *) ptr = val;
    295  1.1  mrg     }
    296  1.1  mrg }
    297  1.1  mrg 
    298  1.1  mrg /* Get the pointer to a register INDEX as saved in CONTEXT.  */
    299  1.1  mrg 
    300  1.1  mrg static inline void *
    301  1.1  mrg _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
    302  1.1  mrg {
    303  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    304  1.1  mrg   if (_Unwind_IsExtendedContext (context) && context->by_value[index])
    305  1.1  mrg     return &context->reg[index];
    306  1.1  mrg   return (void *) (_Unwind_Internal_Ptr) context->reg[index];
    307  1.1  mrg }
    308  1.1  mrg 
    309  1.1  mrg /* Set the pointer to a register INDEX as saved in CONTEXT.  */
    310  1.1  mrg 
    311  1.1  mrg static inline void
    312  1.1  mrg _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
    313  1.1  mrg {
    314  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    315  1.1  mrg   if (_Unwind_IsExtendedContext (context))
    316  1.1  mrg     context->by_value[index] = 0;
    317  1.1  mrg   context->reg[index] = (_Unwind_Context_Reg_Val) (_Unwind_Internal_Ptr) p;
    318  1.1  mrg }
    319  1.1  mrg 
    320  1.1  mrg /* Overwrite the saved value for register INDEX in CONTEXT with VAL.  */
    321  1.1  mrg 
    322  1.1  mrg static inline void
    323  1.1  mrg _Unwind_SetGRValue (struct _Unwind_Context *context, int index,
    324  1.1  mrg 		    _Unwind_Word val)
    325  1.1  mrg {
    326  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    327  1.1  mrg   gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
    328  1.1  mrg   /* Return column size may be smaller than _Unwind_Context_Reg_Val.  */
    329  1.1  mrg   gcc_assert (dwarf_reg_size_table[index] <= sizeof (_Unwind_Context_Reg_Val));
    330  1.1  mrg 
    331  1.1  mrg   context->by_value[index] = 1;
    332  1.1  mrg   context->reg[index] = _Unwind_Get_Unwind_Context_Reg_Val (val);
    333  1.1  mrg }
    334  1.1  mrg 
    335  1.1  mrg /* Return nonzero if register INDEX is stored by value rather than
    336  1.1  mrg    by reference.  */
    337  1.1  mrg 
    338  1.1  mrg static inline int
    339  1.1  mrg _Unwind_GRByValue (struct _Unwind_Context *context, int index)
    340  1.1  mrg {
    341  1.1  mrg   index = DWARF_REG_TO_UNWIND_COLUMN (index);
    342  1.1  mrg   return context->by_value[index];
    343  1.1  mrg }
    344  1.1  mrg 
    345  1.1  mrg /* Retrieve the return address for CONTEXT.  */
    346  1.1  mrg 
    347  1.1  mrg inline _Unwind_Ptr
    348  1.1  mrg _Unwind_GetIP (struct _Unwind_Context *context)
    349  1.1  mrg {
    350  1.1  mrg   return (_Unwind_Ptr) context->ra;
    351  1.1  mrg }
    352  1.1  mrg 
    353  1.1  mrg /* Retrieve the return address and flag whether that IP is before
    354  1.1  mrg    or after first not yet fully executed instruction.  */
    355  1.1  mrg 
    356  1.1  mrg inline _Unwind_Ptr
    357  1.1  mrg _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
    358  1.1  mrg {
    359  1.1  mrg   *ip_before_insn = _Unwind_IsSignalFrame (context);
    360  1.1  mrg   return (_Unwind_Ptr) context->ra;
    361  1.1  mrg }
    362  1.1  mrg 
    363  1.1  mrg /* Overwrite the return address for CONTEXT with VAL.  */
    364  1.1  mrg 
    365  1.1  mrg inline void
    366  1.1  mrg _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
    367  1.1  mrg {
    368  1.1  mrg   context->ra = (void *) val;
    369  1.1  mrg }
    370  1.1  mrg 
    371  1.1  mrg void *
    372  1.1  mrg _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
    373  1.1  mrg {
    374  1.1  mrg   return context->lsda;
    375  1.1  mrg }
    376  1.1  mrg 
    377  1.1  mrg _Unwind_Ptr
    378  1.1  mrg _Unwind_GetRegionStart (struct _Unwind_Context *context)
    379  1.1  mrg {
    380  1.1  mrg   return (_Unwind_Ptr) context->bases.func;
    381  1.1  mrg }
    382  1.1  mrg 
    383  1.1  mrg void *
    384  1.1  mrg _Unwind_FindEnclosingFunction (void *pc)
    385  1.1  mrg {
    386  1.1  mrg   struct dwarf_eh_bases bases;
    387  1.1  mrg   const struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases);
    388  1.1  mrg   if (fde)
    389  1.1  mrg     return bases.func;
    390  1.1  mrg   else
    391  1.1  mrg     return NULL;
    392  1.1  mrg }
    393  1.1  mrg 
    394  1.1  mrg #ifndef __ia64__
    395  1.1  mrg _Unwind_Ptr
    396  1.1  mrg _Unwind_GetDataRelBase (struct _Unwind_Context *context)
    397  1.1  mrg {
    398  1.1  mrg   return (_Unwind_Ptr) context->bases.dbase;
    399  1.1  mrg }
    400  1.1  mrg 
    401  1.1  mrg _Unwind_Ptr
    402  1.1  mrg _Unwind_GetTextRelBase (struct _Unwind_Context *context)
    403  1.1  mrg {
    404  1.1  mrg   return (_Unwind_Ptr) context->bases.tbase;
    405  1.1  mrg }
    406  1.1  mrg #endif
    407  1.1  mrg 
    408  1.1  mrg #include "md-unwind-support.h"
    409  1.1  mrg 
    410  1.1  mrg /* Extract any interesting information from the CIE for the translation
    412  1.1  mrg    unit F belongs to.  Return a pointer to the byte after the augmentation,
    413  1.1  mrg    or NULL if we encountered an undecipherable augmentation.  */
    414  1.1  mrg 
    415  1.1  mrg static const unsigned char *
    416  1.1  mrg extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context,
    417  1.1  mrg 		  _Unwind_FrameState *fs)
    418  1.1  mrg {
    419  1.1  mrg   const unsigned char *aug = cie->augmentation;
    420  1.1  mrg   const unsigned char *p = aug + strlen ((const char *)aug) + 1;
    421  1.1  mrg   const unsigned char *ret = NULL;
    422  1.1  mrg   _uleb128_t utmp;
    423  1.1  mrg   _sleb128_t stmp;
    424  1.1  mrg 
    425  1.1  mrg   /* g++ v2 "eh" has pointer immediately following augmentation string,
    426  1.1  mrg      so it must be handled first.  */
    427  1.1  mrg   if (aug[0] == 'e' && aug[1] == 'h')
    428  1.1  mrg     {
    429  1.1  mrg       fs->eh_ptr = read_pointer (p);
    430  1.1  mrg       p += sizeof (void *);
    431  1.1  mrg       aug += 2;
    432  1.1  mrg     }
    433  1.1  mrg 
    434  1.1  mrg   /* After the augmentation resp. pointer for "eh" augmentation
    435  1.1  mrg      follows for CIE version >= 4 address size byte and
    436  1.1  mrg      segment size byte.  */
    437  1.1  mrg   if (__builtin_expect (cie->version >= 4, 0))
    438  1.1  mrg     {
    439  1.1  mrg       if (p[0] != sizeof (void *) || p[1] != 0)
    440  1.1  mrg 	return NULL;
    441  1.1  mrg       p += 2;
    442  1.1  mrg     }
    443  1.1  mrg   /* Immediately following this are the code and
    444  1.1  mrg      data alignment and return address column.  */
    445  1.1  mrg   p = read_uleb128 (p, &utmp);
    446  1.1  mrg   fs->code_align = (_Unwind_Word)utmp;
    447  1.1  mrg   p = read_sleb128 (p, &stmp);
    448  1.1  mrg   fs->data_align = (_Unwind_Sword)stmp;
    449  1.1  mrg   if (cie->version == 1)
    450  1.1  mrg     fs->retaddr_column = *p++;
    451  1.1  mrg   else
    452  1.1  mrg     {
    453  1.1  mrg       p = read_uleb128 (p, &utmp);
    454  1.1  mrg       fs->retaddr_column = (_Unwind_Word)utmp;
    455  1.1  mrg     }
    456  1.1  mrg   fs->lsda_encoding = DW_EH_PE_omit;
    457  1.1  mrg 
    458  1.1  mrg   /* If the augmentation starts with 'z', then a uleb128 immediately
    459  1.1  mrg      follows containing the length of the augmentation field following
    460  1.1  mrg      the size.  */
    461  1.1  mrg   if (*aug == 'z')
    462  1.1  mrg     {
    463  1.1  mrg       p = read_uleb128 (p, &utmp);
    464  1.1  mrg       ret = p + utmp;
    465  1.1  mrg 
    466  1.1  mrg       fs->saw_z = 1;
    467  1.1  mrg       ++aug;
    468  1.1  mrg     }
    469  1.1  mrg 
    470  1.1  mrg   /* Iterate over recognized augmentation subsequences.  */
    471  1.1  mrg   while (*aug != '\0')
    472  1.1  mrg     {
    473  1.1  mrg       /* "L" indicates a byte showing how the LSDA pointer is encoded.  */
    474  1.1  mrg       if (aug[0] == 'L')
    475  1.1  mrg 	{
    476  1.1  mrg 	  fs->lsda_encoding = *p++;
    477  1.1  mrg 	  aug += 1;
    478  1.1  mrg 	}
    479  1.1  mrg 
    480  1.1  mrg       /* "R" indicates a byte indicating how FDE addresses are encoded.  */
    481  1.1  mrg       else if (aug[0] == 'R')
    482  1.1  mrg 	{
    483  1.1  mrg 	  fs->fde_encoding = *p++;
    484  1.1  mrg 	  aug += 1;
    485  1.1  mrg 	}
    486  1.1  mrg 
    487  1.1  mrg       /* "P" indicates a personality routine in the CIE augmentation.  */
    488  1.1  mrg       else if (aug[0] == 'P')
    489  1.1  mrg 	{
    490  1.1  mrg 	  _Unwind_Ptr personality;
    491  1.1  mrg 
    492  1.1  mrg 	  p = read_encoded_value (context, *p, p + 1, &personality);
    493  1.1  mrg 	  fs->personality = (_Unwind_Personality_Fn) personality;
    494  1.1  mrg 	  aug += 1;
    495  1.1  mrg 	}
    496  1.1  mrg 
    497  1.1  mrg       /* "S" indicates a signal frame.  */
    498  1.1  mrg       else if (aug[0] == 'S')
    499  1.1  mrg 	{
    500  1.1  mrg 	  fs->signal_frame = 1;
    501  1.1  mrg 	  aug += 1;
    502  1.1  mrg 	}
    503  1.1  mrg 
    504  1.1  mrg       /* Otherwise we have an unknown augmentation string.
    505  1.1  mrg 	 Bail unless we saw a 'z' prefix.  */
    506  1.1  mrg       else
    507  1.1  mrg 	return ret;
    508  1.1  mrg     }
    509  1.1  mrg 
    510  1.1  mrg   return ret ? ret : p;
    511  1.1  mrg }
    512  1.1  mrg 
    513  1.1  mrg 
    514  1.1  mrg /* Decode a DW_OP stack program.  Return the top of stack.  Push INITIAL
    515  1.1  mrg    onto the stack to start.  */
    516  1.1  mrg 
    517  1.1  mrg static _Unwind_Word
    518  1.1  mrg execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
    519  1.1  mrg 		  struct _Unwind_Context *context, _Unwind_Word initial)
    520  1.1  mrg {
    521  1.1  mrg   _Unwind_Word stack[64];	/* ??? Assume this is enough.  */
    522  1.1  mrg   int stack_elt;
    523  1.1  mrg 
    524  1.1  mrg   stack[0] = initial;
    525  1.1  mrg   stack_elt = 1;
    526  1.1  mrg 
    527  1.1  mrg   while (op_ptr < op_end)
    528  1.1  mrg     {
    529  1.1  mrg       enum dwarf_location_atom op = *op_ptr++;
    530  1.1  mrg       _Unwind_Word result;
    531  1.1  mrg       _uleb128_t reg, utmp;
    532  1.1  mrg       _sleb128_t offset, stmp;
    533  1.1  mrg 
    534  1.1  mrg       switch (op)
    535  1.1  mrg 	{
    536  1.1  mrg 	case DW_OP_lit0:
    537  1.1  mrg 	case DW_OP_lit1:
    538  1.1  mrg 	case DW_OP_lit2:
    539  1.1  mrg 	case DW_OP_lit3:
    540  1.1  mrg 	case DW_OP_lit4:
    541  1.1  mrg 	case DW_OP_lit5:
    542  1.1  mrg 	case DW_OP_lit6:
    543  1.1  mrg 	case DW_OP_lit7:
    544  1.1  mrg 	case DW_OP_lit8:
    545  1.1  mrg 	case DW_OP_lit9:
    546  1.1  mrg 	case DW_OP_lit10:
    547  1.1  mrg 	case DW_OP_lit11:
    548  1.1  mrg 	case DW_OP_lit12:
    549  1.1  mrg 	case DW_OP_lit13:
    550  1.1  mrg 	case DW_OP_lit14:
    551  1.1  mrg 	case DW_OP_lit15:
    552  1.1  mrg 	case DW_OP_lit16:
    553  1.1  mrg 	case DW_OP_lit17:
    554  1.1  mrg 	case DW_OP_lit18:
    555  1.1  mrg 	case DW_OP_lit19:
    556  1.1  mrg 	case DW_OP_lit20:
    557  1.1  mrg 	case DW_OP_lit21:
    558  1.1  mrg 	case DW_OP_lit22:
    559  1.1  mrg 	case DW_OP_lit23:
    560  1.1  mrg 	case DW_OP_lit24:
    561  1.1  mrg 	case DW_OP_lit25:
    562  1.1  mrg 	case DW_OP_lit26:
    563  1.1  mrg 	case DW_OP_lit27:
    564  1.1  mrg 	case DW_OP_lit28:
    565  1.1  mrg 	case DW_OP_lit29:
    566  1.1  mrg 	case DW_OP_lit30:
    567  1.1  mrg 	case DW_OP_lit31:
    568  1.1  mrg 	  result = op - DW_OP_lit0;
    569  1.1  mrg 	  break;
    570  1.1  mrg 
    571  1.1  mrg 	case DW_OP_addr:
    572  1.1  mrg 	  result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr);
    573  1.1  mrg 	  op_ptr += sizeof (void *);
    574  1.1  mrg 	  break;
    575  1.1  mrg 
    576  1.1  mrg 	case DW_OP_GNU_encoded_addr:
    577  1.1  mrg 	  {
    578  1.1  mrg 	    _Unwind_Ptr presult;
    579  1.1  mrg 	    op_ptr = read_encoded_value (context, *op_ptr, op_ptr+1, &presult);
    580  1.1  mrg 	    result = presult;
    581  1.1  mrg 	  }
    582  1.1  mrg 	  break;
    583  1.1  mrg 
    584  1.1  mrg 	case DW_OP_const1u:
    585  1.1  mrg 	  result = read_1u (op_ptr);
    586  1.1  mrg 	  op_ptr += 1;
    587  1.1  mrg 	  break;
    588  1.1  mrg 	case DW_OP_const1s:
    589  1.1  mrg 	  result = read_1s (op_ptr);
    590  1.1  mrg 	  op_ptr += 1;
    591  1.1  mrg 	  break;
    592  1.1  mrg 	case DW_OP_const2u:
    593  1.1  mrg 	  result = read_2u (op_ptr);
    594  1.1  mrg 	  op_ptr += 2;
    595  1.1  mrg 	  break;
    596  1.1  mrg 	case DW_OP_const2s:
    597  1.1  mrg 	  result = read_2s (op_ptr);
    598  1.1  mrg 	  op_ptr += 2;
    599  1.1  mrg 	  break;
    600  1.1  mrg 	case DW_OP_const4u:
    601  1.1  mrg 	  result = read_4u (op_ptr);
    602  1.1  mrg 	  op_ptr += 4;
    603  1.1  mrg 	  break;
    604  1.1  mrg 	case DW_OP_const4s:
    605  1.1  mrg 	  result = read_4s (op_ptr);
    606  1.1  mrg 	  op_ptr += 4;
    607  1.1  mrg 	  break;
    608  1.1  mrg 	case DW_OP_const8u:
    609  1.1  mrg 	  result = read_8u (op_ptr);
    610  1.1  mrg 	  op_ptr += 8;
    611  1.1  mrg 	  break;
    612  1.1  mrg 	case DW_OP_const8s:
    613  1.1  mrg 	  result = read_8s (op_ptr);
    614  1.1  mrg 	  op_ptr += 8;
    615  1.1  mrg 	  break;
    616  1.1  mrg 	case DW_OP_constu:
    617  1.1  mrg 	  op_ptr = read_uleb128 (op_ptr, &utmp);
    618  1.1  mrg 	  result = (_Unwind_Word)utmp;
    619  1.1  mrg 	  break;
    620  1.1  mrg 	case DW_OP_consts:
    621  1.1  mrg 	  op_ptr = read_sleb128 (op_ptr, &stmp);
    622  1.1  mrg 	  result = (_Unwind_Sword)stmp;
    623  1.1  mrg 	  break;
    624  1.1  mrg 
    625  1.1  mrg 	case DW_OP_reg0:
    626  1.1  mrg 	case DW_OP_reg1:
    627  1.1  mrg 	case DW_OP_reg2:
    628  1.1  mrg 	case DW_OP_reg3:
    629  1.1  mrg 	case DW_OP_reg4:
    630  1.1  mrg 	case DW_OP_reg5:
    631  1.1  mrg 	case DW_OP_reg6:
    632  1.1  mrg 	case DW_OP_reg7:
    633  1.1  mrg 	case DW_OP_reg8:
    634  1.1  mrg 	case DW_OP_reg9:
    635  1.1  mrg 	case DW_OP_reg10:
    636  1.1  mrg 	case DW_OP_reg11:
    637  1.1  mrg 	case DW_OP_reg12:
    638  1.1  mrg 	case DW_OP_reg13:
    639  1.1  mrg 	case DW_OP_reg14:
    640  1.1  mrg 	case DW_OP_reg15:
    641  1.1  mrg 	case DW_OP_reg16:
    642  1.1  mrg 	case DW_OP_reg17:
    643  1.1  mrg 	case DW_OP_reg18:
    644  1.1  mrg 	case DW_OP_reg19:
    645  1.1  mrg 	case DW_OP_reg20:
    646  1.1  mrg 	case DW_OP_reg21:
    647  1.1  mrg 	case DW_OP_reg22:
    648  1.1  mrg 	case DW_OP_reg23:
    649  1.1  mrg 	case DW_OP_reg24:
    650  1.1  mrg 	case DW_OP_reg25:
    651  1.1  mrg 	case DW_OP_reg26:
    652  1.1  mrg 	case DW_OP_reg27:
    653  1.1  mrg 	case DW_OP_reg28:
    654  1.1  mrg 	case DW_OP_reg29:
    655  1.1  mrg 	case DW_OP_reg30:
    656  1.1  mrg 	case DW_OP_reg31:
    657  1.1  mrg 	  result = _Unwind_GetGR (context, op - DW_OP_reg0);
    658  1.1  mrg 	  break;
    659  1.1  mrg 	case DW_OP_regx:
    660  1.1  mrg 	  op_ptr = read_uleb128 (op_ptr, &reg);
    661  1.1  mrg 	  result = _Unwind_GetGR (context, reg);
    662  1.1  mrg 	  break;
    663  1.1  mrg 
    664  1.1  mrg 	case DW_OP_breg0:
    665  1.1  mrg 	case DW_OP_breg1:
    666  1.1  mrg 	case DW_OP_breg2:
    667  1.1  mrg 	case DW_OP_breg3:
    668  1.1  mrg 	case DW_OP_breg4:
    669  1.1  mrg 	case DW_OP_breg5:
    670  1.1  mrg 	case DW_OP_breg6:
    671  1.1  mrg 	case DW_OP_breg7:
    672  1.1  mrg 	case DW_OP_breg8:
    673  1.1  mrg 	case DW_OP_breg9:
    674  1.1  mrg 	case DW_OP_breg10:
    675  1.1  mrg 	case DW_OP_breg11:
    676  1.1  mrg 	case DW_OP_breg12:
    677  1.1  mrg 	case DW_OP_breg13:
    678  1.1  mrg 	case DW_OP_breg14:
    679  1.1  mrg 	case DW_OP_breg15:
    680  1.1  mrg 	case DW_OP_breg16:
    681  1.1  mrg 	case DW_OP_breg17:
    682  1.1  mrg 	case DW_OP_breg18:
    683  1.1  mrg 	case DW_OP_breg19:
    684  1.1  mrg 	case DW_OP_breg20:
    685  1.1  mrg 	case DW_OP_breg21:
    686  1.1  mrg 	case DW_OP_breg22:
    687  1.1  mrg 	case DW_OP_breg23:
    688  1.1  mrg 	case DW_OP_breg24:
    689  1.1  mrg 	case DW_OP_breg25:
    690  1.1  mrg 	case DW_OP_breg26:
    691  1.1  mrg 	case DW_OP_breg27:
    692  1.1  mrg 	case DW_OP_breg28:
    693  1.1  mrg 	case DW_OP_breg29:
    694  1.1  mrg 	case DW_OP_breg30:
    695  1.1  mrg 	case DW_OP_breg31:
    696  1.1  mrg 	  op_ptr = read_sleb128 (op_ptr, &offset);
    697  1.1  mrg 	  result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset;
    698  1.1  mrg 	  break;
    699  1.1  mrg 	case DW_OP_bregx:
    700  1.1  mrg 	  op_ptr = read_uleb128 (op_ptr, &reg);
    701  1.1  mrg 	  op_ptr = read_sleb128 (op_ptr, &offset);
    702  1.1  mrg 	  result = _Unwind_GetGR (context, reg) + (_Unwind_Word)offset;
    703  1.1  mrg 	  break;
    704  1.1  mrg 
    705  1.1  mrg 	case DW_OP_dup:
    706  1.1  mrg 	  gcc_assert (stack_elt);
    707  1.1  mrg 	  result = stack[stack_elt - 1];
    708  1.1  mrg 	  break;
    709  1.1  mrg 
    710  1.1  mrg 	case DW_OP_drop:
    711  1.1  mrg 	  gcc_assert (stack_elt);
    712  1.1  mrg 	  stack_elt -= 1;
    713  1.1  mrg 	  goto no_push;
    714  1.1  mrg 
    715  1.1  mrg 	case DW_OP_pick:
    716  1.1  mrg 	  offset = *op_ptr++;
    717  1.1  mrg 	  gcc_assert (offset < stack_elt - 1);
    718  1.1  mrg 	  result = stack[stack_elt - 1 - offset];
    719  1.1  mrg 	  break;
    720  1.1  mrg 
    721  1.1  mrg 	case DW_OP_over:
    722  1.1  mrg 	  gcc_assert (stack_elt >= 2);
    723  1.1  mrg 	  result = stack[stack_elt - 2];
    724  1.1  mrg 	  break;
    725  1.1  mrg 
    726  1.1  mrg 	case DW_OP_swap:
    727  1.1  mrg 	  {
    728  1.1  mrg 	    _Unwind_Word t;
    729  1.1  mrg 	    gcc_assert (stack_elt >= 2);
    730  1.1  mrg 	    t = stack[stack_elt - 1];
    731  1.1  mrg 	    stack[stack_elt - 1] = stack[stack_elt - 2];
    732  1.1  mrg 	    stack[stack_elt - 2] = t;
    733  1.1  mrg 	    goto no_push;
    734  1.1  mrg 	  }
    735  1.1  mrg 
    736  1.1  mrg 	case DW_OP_rot:
    737  1.1  mrg 	  {
    738  1.1  mrg 	    _Unwind_Word t1, t2, t3;
    739  1.1  mrg 
    740  1.1  mrg 	    gcc_assert (stack_elt >= 3);
    741  1.1  mrg 	    t1 = stack[stack_elt - 1];
    742  1.1  mrg 	    t2 = stack[stack_elt - 2];
    743  1.1  mrg 	    t3 = stack[stack_elt - 3];
    744  1.1  mrg 	    stack[stack_elt - 1] = t2;
    745  1.1  mrg 	    stack[stack_elt - 2] = t3;
    746  1.1  mrg 	    stack[stack_elt - 3] = t1;
    747  1.1  mrg 	    goto no_push;
    748  1.1  mrg 	  }
    749  1.1  mrg 
    750  1.1  mrg 	case DW_OP_deref:
    751  1.1  mrg 	case DW_OP_deref_size:
    752  1.1  mrg 	case DW_OP_abs:
    753  1.1  mrg 	case DW_OP_neg:
    754  1.1  mrg 	case DW_OP_not:
    755  1.1  mrg 	case DW_OP_plus_uconst:
    756  1.1  mrg 	  /* Unary operations.  */
    757  1.1  mrg 	  gcc_assert (stack_elt);
    758  1.1  mrg 	  stack_elt -= 1;
    759  1.1  mrg 
    760  1.1  mrg 	  result = stack[stack_elt];
    761  1.1  mrg 
    762  1.1  mrg 	  switch (op)
    763  1.1  mrg 	    {
    764  1.1  mrg 	    case DW_OP_deref:
    765  1.1  mrg 	      {
    766  1.1  mrg 		void *ptr = (void *) (_Unwind_Ptr) result;
    767  1.1  mrg 		result = (_Unwind_Ptr) read_pointer (ptr);
    768  1.1  mrg 	      }
    769  1.1  mrg 	      break;
    770  1.1  mrg 
    771  1.1  mrg 	    case DW_OP_deref_size:
    772  1.1  mrg 	      {
    773  1.1  mrg 		void *ptr = (void *) (_Unwind_Ptr) result;
    774  1.1  mrg 		switch (*op_ptr++)
    775  1.1  mrg 		  {
    776  1.1  mrg 		  case 1:
    777  1.1  mrg 		    result = read_1u (ptr);
    778  1.1  mrg 		    break;
    779  1.1  mrg 		  case 2:
    780  1.1  mrg 		    result = read_2u (ptr);
    781  1.1  mrg 		    break;
    782  1.1  mrg 		  case 4:
    783  1.1  mrg 		    result = read_4u (ptr);
    784  1.1  mrg 		    break;
    785  1.1  mrg 		  case 8:
    786  1.1  mrg 		    result = read_8u (ptr);
    787  1.1  mrg 		    break;
    788  1.1  mrg 		  default:
    789  1.1  mrg 		    gcc_unreachable ();
    790  1.1  mrg 		  }
    791  1.1  mrg 	      }
    792  1.1  mrg 	      break;
    793  1.1  mrg 
    794  1.1  mrg 	    case DW_OP_abs:
    795  1.1  mrg 	      if ((_Unwind_Sword) result < 0)
    796  1.1  mrg 		result = -result;
    797  1.1  mrg 	      break;
    798  1.1  mrg 	    case DW_OP_neg:
    799  1.1  mrg 	      result = -result;
    800  1.1  mrg 	      break;
    801  1.1  mrg 	    case DW_OP_not:
    802  1.1  mrg 	      result = ~result;
    803  1.1  mrg 	      break;
    804  1.1  mrg 	    case DW_OP_plus_uconst:
    805  1.1  mrg 	      op_ptr = read_uleb128 (op_ptr, &utmp);
    806  1.1  mrg 	      result += (_Unwind_Word)utmp;
    807  1.1  mrg 	      break;
    808  1.1  mrg 
    809  1.1  mrg 	    default:
    810  1.1  mrg 	      gcc_unreachable ();
    811  1.1  mrg 	    }
    812  1.1  mrg 	  break;
    813  1.1  mrg 
    814  1.1  mrg 	case DW_OP_and:
    815  1.1  mrg 	case DW_OP_div:
    816  1.1  mrg 	case DW_OP_minus:
    817  1.1  mrg 	case DW_OP_mod:
    818  1.1  mrg 	case DW_OP_mul:
    819  1.1  mrg 	case DW_OP_or:
    820  1.1  mrg 	case DW_OP_plus:
    821  1.1  mrg 	case DW_OP_shl:
    822  1.1  mrg 	case DW_OP_shr:
    823  1.1  mrg 	case DW_OP_shra:
    824  1.1  mrg 	case DW_OP_xor:
    825  1.1  mrg 	case DW_OP_le:
    826  1.1  mrg 	case DW_OP_ge:
    827  1.1  mrg 	case DW_OP_eq:
    828  1.1  mrg 	case DW_OP_lt:
    829  1.1  mrg 	case DW_OP_gt:
    830  1.1  mrg 	case DW_OP_ne:
    831  1.1  mrg 	  {
    832  1.1  mrg 	    /* Binary operations.  */
    833  1.1  mrg 	    _Unwind_Word first, second;
    834  1.1  mrg 	    gcc_assert (stack_elt >= 2);
    835  1.1  mrg 	    stack_elt -= 2;
    836  1.1  mrg 
    837  1.1  mrg 	    second = stack[stack_elt];
    838  1.1  mrg 	    first = stack[stack_elt + 1];
    839  1.1  mrg 
    840  1.1  mrg 	    switch (op)
    841  1.1  mrg 	      {
    842  1.1  mrg 	      case DW_OP_and:
    843  1.1  mrg 		result = second & first;
    844  1.1  mrg 		break;
    845  1.1  mrg 	      case DW_OP_div:
    846  1.1  mrg 		result = (_Unwind_Sword) second / (_Unwind_Sword) first;
    847  1.1  mrg 		break;
    848  1.1  mrg 	      case DW_OP_minus:
    849  1.1  mrg 		result = second - first;
    850  1.1  mrg 		break;
    851  1.1  mrg 	      case DW_OP_mod:
    852  1.1  mrg 		result = second % first;
    853  1.1  mrg 		break;
    854  1.1  mrg 	      case DW_OP_mul:
    855  1.1  mrg 		result = second * first;
    856  1.1  mrg 		break;
    857  1.1  mrg 	      case DW_OP_or:
    858  1.1  mrg 		result = second | first;
    859  1.1  mrg 		break;
    860  1.1  mrg 	      case DW_OP_plus:
    861  1.1  mrg 		result = second + first;
    862  1.1  mrg 		break;
    863  1.1  mrg 	      case DW_OP_shl:
    864  1.1  mrg 		result = second << first;
    865  1.1  mrg 		break;
    866  1.1  mrg 	      case DW_OP_shr:
    867  1.1  mrg 		result = second >> first;
    868  1.1  mrg 		break;
    869  1.1  mrg 	      case DW_OP_shra:
    870  1.1  mrg 		result = (_Unwind_Sword) second >> first;
    871  1.1  mrg 		break;
    872  1.1  mrg 	      case DW_OP_xor:
    873  1.1  mrg 		result = second ^ first;
    874  1.1  mrg 		break;
    875  1.1  mrg 	      case DW_OP_le:
    876  1.1  mrg 		result = (_Unwind_Sword) second <= (_Unwind_Sword) first;
    877  1.1  mrg 		break;
    878  1.1  mrg 	      case DW_OP_ge:
    879  1.1  mrg 		result = (_Unwind_Sword) second >= (_Unwind_Sword) first;
    880  1.1  mrg 		break;
    881  1.1  mrg 	      case DW_OP_eq:
    882  1.1  mrg 		result = (_Unwind_Sword) second == (_Unwind_Sword) first;
    883  1.1  mrg 		break;
    884  1.1  mrg 	      case DW_OP_lt:
    885  1.1  mrg 		result = (_Unwind_Sword) second < (_Unwind_Sword) first;
    886  1.1  mrg 		break;
    887  1.1  mrg 	      case DW_OP_gt:
    888  1.1  mrg 		result = (_Unwind_Sword) second > (_Unwind_Sword) first;
    889  1.1  mrg 		break;
    890  1.1  mrg 	      case DW_OP_ne:
    891  1.1  mrg 		result = (_Unwind_Sword) second != (_Unwind_Sword) first;
    892  1.1  mrg 		break;
    893  1.1  mrg 
    894  1.1  mrg 	      default:
    895  1.1  mrg 		gcc_unreachable ();
    896  1.1  mrg 	      }
    897  1.1  mrg 	  }
    898  1.1  mrg 	  break;
    899  1.1  mrg 
    900  1.1  mrg 	case DW_OP_skip:
    901  1.1  mrg 	  offset = read_2s (op_ptr);
    902  1.1  mrg 	  op_ptr += 2;
    903  1.1  mrg 	  op_ptr += offset;
    904  1.1  mrg 	  goto no_push;
    905  1.1  mrg 
    906  1.1  mrg 	case DW_OP_bra:
    907  1.1  mrg 	  gcc_assert (stack_elt);
    908  1.1  mrg 	  stack_elt -= 1;
    909  1.1  mrg 
    910  1.1  mrg 	  offset = read_2s (op_ptr);
    911  1.1  mrg 	  op_ptr += 2;
    912  1.1  mrg 	  if (stack[stack_elt] != 0)
    913  1.1  mrg 	    op_ptr += offset;
    914  1.1  mrg 	  goto no_push;
    915  1.1  mrg 
    916  1.1  mrg 	case DW_OP_nop:
    917  1.1  mrg 	  goto no_push;
    918  1.1  mrg 
    919  1.1  mrg 	default:
    920  1.1  mrg 	  gcc_unreachable ();
    921  1.1  mrg 	}
    922  1.1  mrg 
    923  1.1  mrg       /* Most things push a result value.  */
    924  1.1  mrg       gcc_assert ((size_t) stack_elt < sizeof(stack)/sizeof(*stack));
    925  1.1  mrg       stack[stack_elt++] = result;
    926  1.1  mrg     no_push:;
    927  1.1  mrg     }
    928  1.1  mrg 
    929  1.1  mrg   /* We were executing this program to get a value.  It should be
    930  1.1  mrg      at top of stack.  */
    931  1.1  mrg   gcc_assert (stack_elt);
    932  1.1  mrg   stack_elt -= 1;
    933  1.1  mrg   return stack[stack_elt];
    934  1.1  mrg }
    935  1.1  mrg 
    936  1.1  mrg 
    937  1.1  mrg /* Decode DWARF 2 call frame information. Takes pointers the
    938  1.1  mrg    instruction sequence to decode, current register information and
    939  1.1  mrg    CIE info, and the PC range to evaluate.  */
    940  1.1  mrg 
    941  1.1  mrg static void
    942  1.1  mrg execute_cfa_program (const unsigned char *insn_ptr,
    943  1.1  mrg 		     const unsigned char *insn_end,
    944  1.1  mrg 		     struct _Unwind_Context *context,
    945  1.1  mrg 		     _Unwind_FrameState *fs)
    946  1.1  mrg {
    947  1.1  mrg   struct frame_state_reg_info *unused_rs = NULL;
    948  1.1  mrg 
    949  1.1  mrg   /* Don't allow remember/restore between CIE and FDE programs.  */
    950  1.1  mrg   fs->regs.prev = NULL;
    951  1.1  mrg 
    952  1.1  mrg   /* The comparison with the return address uses < rather than <= because
    953  1.1  mrg      we are only interested in the effects of code before the call; for a
    954  1.1  mrg      noreturn function, the return address may point to unrelated code with
    955  1.1  mrg      a different stack configuration that we are not interested in.  We
    956  1.1  mrg      assume that the call itself is unwind info-neutral; if not, or if
    957  1.1  mrg      there are delay instructions that adjust the stack, these must be
    958  1.1  mrg      reflected at the point immediately before the call insn.
    959  1.1  mrg      In signal frames, return address is after last completed instruction,
    960  1.1  mrg      so we add 1 to return address to make the comparison <=.  */
    961  1.1  mrg   while (insn_ptr < insn_end
    962  1.1  mrg 	 && fs->pc < context->ra + _Unwind_IsSignalFrame (context))
    963  1.1  mrg     {
    964  1.1  mrg       unsigned char insn = *insn_ptr++;
    965  1.1  mrg       _uleb128_t reg, utmp;
    966  1.1  mrg       _sleb128_t offset, stmp;
    967  1.1  mrg 
    968  1.1  mrg       if ((insn & 0xc0) == DW_CFA_advance_loc)
    969  1.1  mrg 	fs->pc += (insn & 0x3f) * fs->code_align;
    970  1.1  mrg       else if ((insn & 0xc0) == DW_CFA_offset)
    971  1.1  mrg 	{
    972  1.1  mrg 	  reg = insn & 0x3f;
    973  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
    974  1.1  mrg 	  offset = (_Unwind_Sword) utmp * fs->data_align;
    975  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
    976  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
    977  1.1  mrg 	    {
    978  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_OFFSET;
    979  1.1  mrg 	      fs->regs.reg[reg].loc.offset = offset;
    980  1.1  mrg 	    }
    981  1.1  mrg 	}
    982  1.1  mrg       else if ((insn & 0xc0) == DW_CFA_restore)
    983  1.1  mrg 	{
    984  1.1  mrg 	  reg = insn & 0x3f;
    985  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
    986  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
    987  1.1  mrg 	    fs->regs.reg[reg].how = REG_UNSAVED;
    988  1.1  mrg 	}
    989  1.1  mrg       else switch (insn)
    990  1.1  mrg 	{
    991  1.1  mrg 	case DW_CFA_set_loc:
    992  1.1  mrg 	  {
    993  1.1  mrg 	    _Unwind_Ptr pc;
    994  1.1  mrg 
    995  1.1  mrg 	    insn_ptr = read_encoded_value (context, fs->fde_encoding,
    996  1.1  mrg 					   insn_ptr, &pc);
    997  1.1  mrg 	    fs->pc = (void *) pc;
    998  1.1  mrg 	  }
    999  1.1  mrg 	  break;
   1000  1.1  mrg 
   1001  1.1  mrg 	case DW_CFA_advance_loc1:
   1002  1.1  mrg 	  fs->pc += read_1u (insn_ptr) * fs->code_align;
   1003  1.1  mrg 	  insn_ptr += 1;
   1004  1.1  mrg 	  break;
   1005  1.1  mrg 	case DW_CFA_advance_loc2:
   1006  1.1  mrg 	  fs->pc += read_2u (insn_ptr) * fs->code_align;
   1007  1.1  mrg 	  insn_ptr += 2;
   1008  1.1  mrg 	  break;
   1009  1.1  mrg 	case DW_CFA_advance_loc4:
   1010  1.1  mrg 	  fs->pc += read_4u (insn_ptr) * fs->code_align;
   1011  1.1  mrg 	  insn_ptr += 4;
   1012  1.1  mrg 	  break;
   1013  1.1  mrg 
   1014  1.1  mrg 	case DW_CFA_offset_extended:
   1015  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1016  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1017  1.1  mrg 	  offset = (_Unwind_Sword) utmp * fs->data_align;
   1018  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1019  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1020  1.1  mrg 	    {
   1021  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_OFFSET;
   1022  1.1  mrg 	      fs->regs.reg[reg].loc.offset = offset;
   1023  1.1  mrg 	    }
   1024  1.1  mrg 	  break;
   1025  1.1  mrg 
   1026  1.1  mrg 	case DW_CFA_restore_extended:
   1027  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1028  1.1  mrg 	  /* FIXME, this is wrong; the CIE might have said that the
   1029  1.1  mrg 	     register was saved somewhere.  */
   1030  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1031  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1032  1.1  mrg 	    fs->regs.reg[reg].how = REG_UNSAVED;
   1033  1.1  mrg 	  break;
   1034  1.1  mrg 
   1035  1.1  mrg 	case DW_CFA_same_value:
   1036  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1037  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1038  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1039  1.1  mrg 	    fs->regs.reg[reg].how = REG_UNSAVED;
   1040  1.1  mrg 	  break;
   1041  1.1  mrg 
   1042  1.1  mrg 	case DW_CFA_undefined:
   1043  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1044  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1045  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1046  1.1  mrg 	    fs->regs.reg[reg].how = REG_UNDEFINED;
   1047  1.1  mrg 	  break;
   1048  1.1  mrg 
   1049  1.1  mrg 	case DW_CFA_nop:
   1050  1.1  mrg 	  break;
   1051  1.1  mrg 
   1052  1.1  mrg 	case DW_CFA_register:
   1053  1.1  mrg 	  {
   1054  1.1  mrg 	    _uleb128_t reg2;
   1055  1.1  mrg 	    insn_ptr = read_uleb128 (insn_ptr, &reg);
   1056  1.1  mrg 	    insn_ptr = read_uleb128 (insn_ptr, &reg2);
   1057  1.1  mrg 	    reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1058  1.1  mrg 	    if (UNWIND_COLUMN_IN_RANGE (reg))
   1059  1.1  mrg 	      {
   1060  1.1  mrg 	        fs->regs.reg[reg].how = REG_SAVED_REG;
   1061  1.1  mrg 	        fs->regs.reg[reg].loc.reg = (_Unwind_Word)reg2;
   1062  1.1  mrg 	      }
   1063  1.1  mrg 	  }
   1064  1.1  mrg 	  break;
   1065  1.1  mrg 
   1066  1.1  mrg 	case DW_CFA_remember_state:
   1067  1.1  mrg 	  {
   1068  1.1  mrg 	    struct frame_state_reg_info *new_rs;
   1069  1.1  mrg 	    if (unused_rs)
   1070  1.1  mrg 	      {
   1071  1.1  mrg 		new_rs = unused_rs;
   1072  1.1  mrg 		unused_rs = unused_rs->prev;
   1073  1.1  mrg 	      }
   1074  1.1  mrg 	    else
   1075  1.1  mrg 	      new_rs = alloca (sizeof (struct frame_state_reg_info));
   1076  1.1  mrg 
   1077  1.1  mrg 	    *new_rs = fs->regs;
   1078  1.1  mrg 	    fs->regs.prev = new_rs;
   1079  1.1  mrg 	  }
   1080  1.1  mrg 	  break;
   1081  1.1  mrg 
   1082  1.1  mrg 	case DW_CFA_restore_state:
   1083  1.1  mrg 	  {
   1084  1.1  mrg 	    struct frame_state_reg_info *old_rs = fs->regs.prev;
   1085  1.1  mrg 	    fs->regs = *old_rs;
   1086  1.1  mrg 	    old_rs->prev = unused_rs;
   1087  1.1  mrg 	    unused_rs = old_rs;
   1088  1.1  mrg 	  }
   1089  1.1  mrg 	  break;
   1090  1.1  mrg 
   1091  1.1  mrg 	case DW_CFA_def_cfa:
   1092  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1093  1.1  mrg 	  fs->regs.cfa_reg = (_Unwind_Word)utmp;
   1094  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1095  1.1  mrg 	  fs->regs.cfa_offset = (_Unwind_Word)utmp;
   1096  1.1  mrg 	  fs->regs.cfa_how = CFA_REG_OFFSET;
   1097  1.1  mrg 	  break;
   1098  1.1  mrg 
   1099  1.1  mrg 	case DW_CFA_def_cfa_register:
   1100  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1101  1.1  mrg 	  fs->regs.cfa_reg = (_Unwind_Word)utmp;
   1102  1.1  mrg 	  fs->regs.cfa_how = CFA_REG_OFFSET;
   1103  1.1  mrg 	  break;
   1104  1.1  mrg 
   1105  1.1  mrg 	case DW_CFA_def_cfa_offset:
   1106  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1107  1.1  mrg 	  fs->regs.cfa_offset = utmp;
   1108  1.1  mrg 	  /* cfa_how deliberately not set.  */
   1109  1.1  mrg 	  break;
   1110  1.1  mrg 
   1111  1.1  mrg 	case DW_CFA_def_cfa_expression:
   1112  1.1  mrg 	  fs->regs.cfa_exp = insn_ptr;
   1113  1.1  mrg 	  fs->regs.cfa_how = CFA_EXP;
   1114  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1115  1.1  mrg 	  insn_ptr += utmp;
   1116  1.1  mrg 	  break;
   1117  1.1  mrg 
   1118  1.1  mrg 	case DW_CFA_expression:
   1119  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1120  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1121  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1122  1.1  mrg 	    {
   1123  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_EXP;
   1124  1.1  mrg 	      fs->regs.reg[reg].loc.exp = insn_ptr;
   1125  1.1  mrg 	    }
   1126  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1127  1.1  mrg 	  insn_ptr += utmp;
   1128  1.1  mrg 	  break;
   1129  1.1  mrg 
   1130  1.1  mrg 	  /* Dwarf3.  */
   1131  1.1  mrg 	case DW_CFA_offset_extended_sf:
   1132  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1133  1.1  mrg 	  insn_ptr = read_sleb128 (insn_ptr, &stmp);
   1134  1.1  mrg 	  offset = stmp * fs->data_align;
   1135  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1136  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1137  1.1  mrg 	    {
   1138  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_OFFSET;
   1139  1.1  mrg 	      fs->regs.reg[reg].loc.offset = offset;
   1140  1.1  mrg 	    }
   1141  1.1  mrg 	  break;
   1142  1.1  mrg 
   1143  1.1  mrg 	case DW_CFA_def_cfa_sf:
   1144  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1145  1.1  mrg 	  fs->regs.cfa_reg = (_Unwind_Word)utmp;
   1146  1.1  mrg 	  insn_ptr = read_sleb128 (insn_ptr, &stmp);
   1147  1.1  mrg 	  fs->regs.cfa_offset = (_Unwind_Sword)stmp;
   1148  1.1  mrg 	  fs->regs.cfa_how = CFA_REG_OFFSET;
   1149  1.1  mrg 	  fs->regs.cfa_offset *= fs->data_align;
   1150  1.1  mrg 	  break;
   1151  1.1  mrg 
   1152  1.1  mrg 	case DW_CFA_def_cfa_offset_sf:
   1153  1.1  mrg 	  insn_ptr = read_sleb128 (insn_ptr, &stmp);
   1154  1.1  mrg 	  fs->regs.cfa_offset = (_Unwind_Sword)stmp;
   1155  1.1  mrg 	  fs->regs.cfa_offset *= fs->data_align;
   1156  1.1  mrg 	  /* cfa_how deliberately not set.  */
   1157  1.1  mrg 	  break;
   1158  1.1  mrg 
   1159  1.1  mrg 	case DW_CFA_val_offset:
   1160  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1161  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1162  1.1  mrg 	  offset = (_Unwind_Sword) utmp * fs->data_align;
   1163  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1164  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1165  1.1  mrg 	    {
   1166  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_VAL_OFFSET;
   1167  1.1  mrg 	      fs->regs.reg[reg].loc.offset = offset;
   1168  1.1  mrg 	    }
   1169  1.1  mrg 	  break;
   1170  1.1  mrg 
   1171  1.1  mrg 	case DW_CFA_val_offset_sf:
   1172  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1173  1.1  mrg 	  insn_ptr = read_sleb128 (insn_ptr, &stmp);
   1174  1.1  mrg 	  offset = stmp * fs->data_align;
   1175  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1176  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1177  1.1  mrg 	    {
   1178  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_VAL_OFFSET;
   1179  1.1  mrg 	      fs->regs.reg[reg].loc.offset = offset;
   1180  1.1  mrg 	    }
   1181  1.1  mrg 	  break;
   1182  1.1  mrg 
   1183  1.1  mrg 	case DW_CFA_val_expression:
   1184  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1185  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1186  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1187  1.1  mrg 	    {
   1188  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_VAL_EXP;
   1189  1.1  mrg 	      fs->regs.reg[reg].loc.exp = insn_ptr;
   1190  1.1  mrg 	    }
   1191  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1192  1.1  mrg 	  insn_ptr += utmp;
   1193  1.1  mrg 	  break;
   1194  1.1  mrg 
   1195  1.1  mrg 	case DW_CFA_GNU_window_save:
   1196  1.1  mrg 	  /* ??? Hardcoded for SPARC register window configuration.  */
   1197  1.1  mrg 	  if (DWARF_FRAME_REGISTERS >= 32)
   1198  1.1  mrg 	    for (reg = 16; reg < 32; ++reg)
   1199  1.1  mrg 	      {
   1200  1.1  mrg 		fs->regs.reg[reg].how = REG_SAVED_OFFSET;
   1201  1.1  mrg 		fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
   1202  1.1  mrg 	      }
   1203  1.1  mrg 	  break;
   1204  1.1  mrg 
   1205  1.1  mrg 	case DW_CFA_GNU_args_size:
   1206  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1207  1.1  mrg 	  context->args_size = (_Unwind_Word)utmp;
   1208  1.1  mrg 	  break;
   1209  1.1  mrg 
   1210  1.1  mrg 	case DW_CFA_GNU_negative_offset_extended:
   1211  1.1  mrg 	  /* Obsoleted by DW_CFA_offset_extended_sf, but used by
   1212  1.1  mrg 	     older PowerPC code.  */
   1213  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &reg);
   1214  1.1  mrg 	  insn_ptr = read_uleb128 (insn_ptr, &utmp);
   1215  1.1  mrg 	  offset = (_Unwind_Word) utmp * fs->data_align;
   1216  1.1  mrg 	  reg = DWARF_REG_TO_UNWIND_COLUMN (reg);
   1217  1.1  mrg 	  if (UNWIND_COLUMN_IN_RANGE (reg))
   1218  1.1  mrg 	    {
   1219  1.1  mrg 	      fs->regs.reg[reg].how = REG_SAVED_OFFSET;
   1220  1.1  mrg 	      fs->regs.reg[reg].loc.offset = -offset;
   1221  1.1  mrg 	    }
   1222  1.1  mrg 	  break;
   1223  1.1  mrg 
   1224  1.1  mrg 	default:
   1225  1.1  mrg 	  gcc_unreachable ();
   1226  1.1  mrg 	}
   1227  1.1  mrg     }
   1228  1.1  mrg }
   1229  1.1  mrg 
   1230  1.1  mrg /* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
   1232  1.1  mrg    its caller and decode it into FS.  This function also sets the
   1233  1.1  mrg    args_size and lsda members of CONTEXT, as they are really information
   1234  1.1  mrg    about the caller's frame.  */
   1235  1.1  mrg 
   1236  1.1  mrg static _Unwind_Reason_Code
   1237  1.1  mrg uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
   1238  1.1  mrg {
   1239  1.1  mrg   const struct dwarf_fde *fde;
   1240  1.1  mrg   const struct dwarf_cie *cie;
   1241  1.1  mrg   const unsigned char *aug, *insn, *end;
   1242  1.1  mrg 
   1243  1.1  mrg   memset (fs, 0, sizeof (*fs));
   1244  1.1  mrg   context->args_size = 0;
   1245  1.1  mrg   context->lsda = 0;
   1246  1.1  mrg 
   1247  1.1  mrg   if (context->ra == 0)
   1248  1.1  mrg     return _URC_END_OF_STACK;
   1249  1.1  mrg 
   1250  1.1  mrg   fde = _Unwind_Find_FDE (context->ra + _Unwind_IsSignalFrame (context) - 1,
   1251  1.1  mrg 			  &context->bases);
   1252  1.1  mrg   if (fde == NULL)
   1253  1.1  mrg     {
   1254  1.1  mrg #ifdef MD_FALLBACK_FRAME_STATE_FOR
   1255  1.1  mrg       /* Couldn't find frame unwind info for this function.  Try a
   1256  1.1  mrg 	 target-specific fallback mechanism.  This will necessarily
   1257  1.1  mrg 	 not provide a personality routine or LSDA.  */
   1258  1.1  mrg       return MD_FALLBACK_FRAME_STATE_FOR (context, fs);
   1259  1.1  mrg #else
   1260  1.1  mrg       return _URC_END_OF_STACK;
   1261  1.1  mrg #endif
   1262  1.1  mrg     }
   1263  1.1  mrg 
   1264  1.1  mrg   fs->pc = context->bases.func;
   1265  1.1  mrg 
   1266  1.1  mrg   cie = get_cie (fde);
   1267  1.1  mrg   insn = extract_cie_info (cie, context, fs);
   1268  1.1  mrg   if (insn == NULL)
   1269  1.1  mrg     /* CIE contained unknown augmentation.  */
   1270  1.1  mrg     return _URC_FATAL_PHASE1_ERROR;
   1271  1.1  mrg 
   1272  1.1  mrg   /* First decode all the insns in the CIE.  */
   1273  1.1  mrg   end = (const unsigned char *) next_fde ((const struct dwarf_fde *) cie);
   1274  1.1  mrg   execute_cfa_program (insn, end, context, fs);
   1275  1.1  mrg 
   1276  1.1  mrg   /* Locate augmentation for the fde.  */
   1277  1.1  mrg   aug = (const unsigned char *) fde + sizeof (*fde);
   1278  1.1  mrg   aug += 2 * size_of_encoded_value (fs->fde_encoding);
   1279  1.1  mrg   insn = NULL;
   1280  1.1  mrg   if (fs->saw_z)
   1281  1.1  mrg     {
   1282  1.1  mrg       _uleb128_t i;
   1283  1.1  mrg       aug = read_uleb128 (aug, &i);
   1284  1.1  mrg       insn = aug + i;
   1285  1.1  mrg     }
   1286  1.1  mrg   if (fs->lsda_encoding != DW_EH_PE_omit)
   1287  1.1  mrg     {
   1288  1.1  mrg       _Unwind_Ptr lsda;
   1289  1.1  mrg 
   1290  1.1  mrg       aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda);
   1291  1.1  mrg       context->lsda = (void *) lsda;
   1292  1.1  mrg     }
   1293  1.1  mrg 
   1294  1.1  mrg   /* Then the insns in the FDE up to our target PC.  */
   1295  1.1  mrg   if (insn == NULL)
   1296  1.1  mrg     insn = aug;
   1297  1.1  mrg   end = (const unsigned char *) next_fde (fde);
   1298  1.1  mrg   execute_cfa_program (insn, end, context, fs);
   1299  1.1  mrg 
   1300  1.1  mrg   return _URC_NO_REASON;
   1301  1.1  mrg }
   1302  1.1  mrg 
   1303  1.1  mrg typedef struct frame_state
   1305  1.1  mrg {
   1306  1.1  mrg   void *cfa;
   1307  1.1  mrg   void *eh_ptr;
   1308  1.1  mrg   long cfa_offset;
   1309  1.1  mrg   long args_size;
   1310  1.1  mrg   long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
   1311  1.1  mrg   unsigned short cfa_reg;
   1312  1.1  mrg   unsigned short retaddr_column;
   1313  1.1  mrg   char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
   1314  1.1  mrg } frame_state;
   1315  1.1  mrg 
   1316  1.1  mrg struct frame_state * __frame_state_for (void *, struct frame_state *);
   1317  1.1  mrg 
   1318  1.1  mrg /* Called from pre-G++ 3.0 __throw to find the registers to restore for
   1319  1.1  mrg    a given PC_TARGET.  The caller should allocate a local variable of
   1320  1.1  mrg    `struct frame_state' and pass its address to STATE_IN.  */
   1321  1.1  mrg 
   1322  1.1  mrg struct frame_state *
   1323  1.1  mrg __frame_state_for (void *pc_target, struct frame_state *state_in)
   1324  1.1  mrg {
   1325  1.1  mrg   struct _Unwind_Context context;
   1326  1.1  mrg   _Unwind_FrameState fs;
   1327  1.1  mrg   int reg;
   1328  1.1  mrg 
   1329  1.1  mrg   memset (&context, 0, sizeof (struct _Unwind_Context));
   1330  1.1  mrg   if (!ASSUME_EXTENDED_UNWIND_CONTEXT)
   1331  1.1  mrg     context.flags = EXTENDED_CONTEXT_BIT;
   1332  1.1  mrg   context.ra = pc_target + 1;
   1333  1.1  mrg 
   1334  1.1  mrg   if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON)
   1335  1.1  mrg     return 0;
   1336  1.1  mrg 
   1337  1.1  mrg   /* We have no way to pass a location expression for the CFA to our
   1338  1.1  mrg      caller.  It wouldn't understand it anyway.  */
   1339  1.1  mrg   if (fs.regs.cfa_how == CFA_EXP)
   1340  1.1  mrg     return 0;
   1341  1.1  mrg 
   1342  1.1  mrg   for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
   1343  1.1  mrg     {
   1344  1.1  mrg       state_in->saved[reg] = fs.regs.reg[reg].how;
   1345  1.1  mrg       switch (state_in->saved[reg])
   1346  1.1  mrg 	{
   1347  1.1  mrg 	case REG_SAVED_REG:
   1348  1.1  mrg 	  state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg;
   1349  1.1  mrg 	  break;
   1350  1.1  mrg 	case REG_SAVED_OFFSET:
   1351  1.1  mrg 	  state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset;
   1352  1.1  mrg 	  break;
   1353  1.1  mrg 	default:
   1354  1.1  mrg 	  state_in->reg_or_offset[reg] = 0;
   1355  1.1  mrg 	  break;
   1356  1.1  mrg 	}
   1357  1.1  mrg     }
   1358  1.1  mrg 
   1359  1.1  mrg   state_in->cfa_offset = fs.regs.cfa_offset;
   1360  1.1  mrg   state_in->cfa_reg = fs.regs.cfa_reg;
   1361  1.1  mrg   state_in->retaddr_column = fs.retaddr_column;
   1362  1.1  mrg   state_in->args_size = context.args_size;
   1363  1.1  mrg   state_in->eh_ptr = fs.eh_ptr;
   1364  1.1  mrg 
   1365  1.1  mrg   return state_in;
   1366  1.1  mrg }
   1367  1.1  mrg 
   1368  1.1  mrg typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp;
   1370  1.1  mrg 
   1371  1.1  mrg static inline void
   1372  1.1  mrg _Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa,
   1373  1.1  mrg 		     _Unwind_SpTmp *tmp_sp)
   1374  1.1  mrg {
   1375  1.1  mrg   int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()];
   1376  1.1  mrg 
   1377  1.1  mrg   if (size == sizeof(_Unwind_Ptr))
   1378  1.1  mrg     tmp_sp->ptr = (_Unwind_Ptr) cfa;
   1379  1.1  mrg   else
   1380  1.1  mrg     {
   1381  1.1  mrg       gcc_assert (size == sizeof(_Unwind_Word));
   1382  1.1  mrg       tmp_sp->word = (_Unwind_Ptr) cfa;
   1383  1.1  mrg     }
   1384  1.1  mrg   _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp);
   1385  1.1  mrg }
   1386  1.1  mrg 
   1387  1.1  mrg static void
   1388  1.1  mrg uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
   1389  1.1  mrg {
   1390  1.1  mrg   struct _Unwind_Context orig_context = *context;
   1391  1.1  mrg   void *cfa;
   1392  1.1  mrg   long i;
   1393  1.1  mrg 
   1394  1.1  mrg #ifdef EH_RETURN_STACKADJ_RTX
   1395  1.1  mrg   /* Special handling here: Many machines do not use a frame pointer,
   1396  1.1  mrg      and track the CFA only through offsets from the stack pointer from
   1397  1.1  mrg      one frame to the next.  In this case, the stack pointer is never
   1398  1.1  mrg      stored, so it has no saved address in the context.  What we do
   1399  1.1  mrg      have is the CFA from the previous stack frame.
   1400  1.1  mrg 
   1401  1.1  mrg      In very special situations (such as unwind info for signal return),
   1402  1.1  mrg      there may be location expressions that use the stack pointer as well.
   1403  1.1  mrg 
   1404  1.1  mrg      Do this conditionally for one frame.  This allows the unwind info
   1405  1.1  mrg      for one frame to save a copy of the stack pointer from the previous
   1406  1.1  mrg      frame, and be able to use much easier CFA mechanisms to do it.
   1407  1.1  mrg      Always zap the saved stack pointer value for the next frame; carrying
   1408  1.1  mrg      the value over from one frame to another doesn't make sense.  */
   1409  1.1  mrg 
   1410  1.1  mrg   _Unwind_SpTmp tmp_sp;
   1411  1.1  mrg 
   1412  1.1  mrg   if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ()))
   1413  1.1  mrg     _Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp);
   1414  1.1  mrg   _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL);
   1415  1.1  mrg #endif
   1416  1.1  mrg 
   1417  1.1  mrg   /* Compute this frame's CFA.  */
   1418  1.1  mrg   switch (fs->regs.cfa_how)
   1419  1.1  mrg     {
   1420  1.1  mrg     case CFA_REG_OFFSET:
   1421  1.1  mrg       cfa = _Unwind_GetPtr (&orig_context, fs->regs.cfa_reg);
   1422  1.1  mrg       cfa += fs->regs.cfa_offset;
   1423  1.1  mrg       break;
   1424  1.1  mrg 
   1425  1.1  mrg     case CFA_EXP:
   1426  1.1  mrg       {
   1427  1.1  mrg 	const unsigned char *exp = fs->regs.cfa_exp;
   1428  1.1  mrg 	_uleb128_t len;
   1429  1.1  mrg 
   1430  1.1  mrg 	exp = read_uleb128 (exp, &len);
   1431  1.1  mrg 	cfa = (void *) (_Unwind_Ptr)
   1432  1.1  mrg 	  execute_stack_op (exp, exp + len, &orig_context, 0);
   1433  1.1  mrg 	break;
   1434  1.1  mrg       }
   1435  1.1  mrg 
   1436  1.1  mrg     default:
   1437  1.1  mrg       gcc_unreachable ();
   1438  1.1  mrg     }
   1439  1.1  mrg   context->cfa = cfa;
   1440  1.1  mrg 
   1441  1.1  mrg   /* Compute the addresses of all registers saved in this frame.  */
   1442  1.1  mrg   for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i)
   1443  1.1  mrg     switch (fs->regs.reg[i].how)
   1444  1.1  mrg       {
   1445  1.1  mrg       case REG_UNSAVED:
   1446  1.1  mrg       case REG_UNDEFINED:
   1447  1.1  mrg 	break;
   1448  1.1  mrg 
   1449  1.1  mrg       case REG_SAVED_OFFSET:
   1450  1.1  mrg 	_Unwind_SetGRPtr (context, i,
   1451  1.1  mrg 			  (void *) (cfa + fs->regs.reg[i].loc.offset));
   1452  1.1  mrg 	break;
   1453  1.1  mrg 
   1454  1.1  mrg       case REG_SAVED_REG:
   1455  1.1  mrg 	if (_Unwind_GRByValue (&orig_context, fs->regs.reg[i].loc.reg))
   1456  1.1  mrg 	  _Unwind_SetGRValue (context, i,
   1457  1.1  mrg 			      _Unwind_GetGR (&orig_context,
   1458  1.1  mrg 					     fs->regs.reg[i].loc.reg));
   1459  1.1  mrg 	else
   1460  1.1  mrg 	  _Unwind_SetGRPtr (context, i,
   1461  1.1  mrg 			    _Unwind_GetGRPtr (&orig_context,
   1462  1.1  mrg 					      fs->regs.reg[i].loc.reg));
   1463  1.1  mrg 	break;
   1464  1.1  mrg 
   1465  1.1  mrg       case REG_SAVED_EXP:
   1466  1.1  mrg 	{
   1467  1.1  mrg 	  const unsigned char *exp = fs->regs.reg[i].loc.exp;
   1468  1.1  mrg 	  _uleb128_t len;
   1469  1.1  mrg 	  _Unwind_Ptr val;
   1470  1.1  mrg 
   1471  1.1  mrg 	  exp = read_uleb128 (exp, &len);
   1472  1.1  mrg 	  val = execute_stack_op (exp, exp + len, &orig_context,
   1473  1.1  mrg 				  (_Unwind_Ptr) cfa);
   1474  1.1  mrg 	  _Unwind_SetGRPtr (context, i, (void *) val);
   1475  1.1  mrg 	}
   1476  1.1  mrg 	break;
   1477  1.1  mrg 
   1478  1.1  mrg       case REG_SAVED_VAL_OFFSET:
   1479  1.1  mrg 	_Unwind_SetGRValue (context, i,
   1480  1.1  mrg 			    (_Unwind_Internal_Ptr)
   1481  1.1  mrg 			    (cfa + fs->regs.reg[i].loc.offset));
   1482  1.1  mrg 	break;
   1483  1.1  mrg 
   1484  1.1  mrg       case REG_SAVED_VAL_EXP:
   1485  1.1  mrg 	{
   1486  1.1  mrg 	  const unsigned char *exp = fs->regs.reg[i].loc.exp;
   1487  1.1  mrg 	  _uleb128_t len;
   1488  1.1  mrg 	  _Unwind_Ptr val;
   1489  1.1  mrg 
   1490  1.1  mrg 	  exp = read_uleb128 (exp, &len);
   1491  1.1  mrg 	  val = execute_stack_op (exp, exp + len, &orig_context,
   1492  1.1  mrg 				  (_Unwind_Ptr) cfa);
   1493  1.1  mrg 	  _Unwind_SetGRValue (context, i, val);
   1494  1.1  mrg 	}
   1495  1.1  mrg 	break;
   1496  1.1  mrg       }
   1497  1.1  mrg 
   1498  1.1  mrg   _Unwind_SetSignalFrame (context, fs->signal_frame);
   1499  1.1  mrg 
   1500  1.1  mrg #ifdef MD_FROB_UPDATE_CONTEXT
   1501  1.1  mrg   MD_FROB_UPDATE_CONTEXT (context, fs);
   1502  1.1  mrg #endif
   1503  1.1  mrg }
   1504  1.1  mrg 
   1505  1.1  mrg /* CONTEXT describes the unwind state for a frame, and FS describes the FDE
   1506  1.1  mrg    of its caller.  Update CONTEXT to refer to the caller as well.  Note
   1507  1.1  mrg    that the args_size and lsda members are not updated here, but later in
   1508  1.1  mrg    uw_frame_state_for.  */
   1509  1.1  mrg 
   1510  1.1  mrg static void
   1511  1.1  mrg uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
   1512  1.1  mrg {
   1513  1.1  mrg   uw_update_context_1 (context, fs);
   1514  1.1  mrg 
   1515  1.1  mrg   /* In general this unwinder doesn't make any distinction between
   1516  1.1  mrg      undefined and same_value rule.  Call-saved registers are assumed
   1517  1.1  mrg      to have same_value rule by default and explicit undefined
   1518  1.1  mrg      rule is handled like same_value.  The only exception is
   1519  1.1  mrg      DW_CFA_undefined on retaddr_column which is supposed to
   1520  1.1  mrg      mark outermost frame in DWARF 3.  */
   1521  1.1  mrg   if (fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (fs->retaddr_column)].how
   1522  1.1  mrg       == REG_UNDEFINED)
   1523  1.1  mrg     /* uw_frame_state_for uses context->ra == 0 check to find outermost
   1524  1.1  mrg        stack frame.  */
   1525  1.1  mrg     context->ra = 0;
   1526  1.1  mrg   else
   1527  1.1  mrg     /* Compute the return address now, since the return address column
   1528  1.1  mrg        can change from frame to frame.  */
   1529  1.1  mrg     context->ra = __builtin_extract_return_addr
   1530  1.1  mrg       (_Unwind_GetPtr (context, fs->retaddr_column));
   1531  1.1  mrg }
   1532  1.1  mrg 
   1533  1.1  mrg static void
   1534  1.1  mrg uw_advance_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
   1535  1.1  mrg {
   1536  1.1  mrg   uw_update_context (context, fs);
   1537  1.1  mrg }
   1538  1.1  mrg 
   1539  1.1  mrg /* Fill in CONTEXT for top-of-stack.  The only valid registers at this
   1541  1.1  mrg    level will be the return address and the CFA.  */
   1542  1.1  mrg 
   1543  1.1  mrg #define uw_init_context(CONTEXT)					   \
   1544  1.1  mrg   do									   \
   1545  1.1  mrg     {									   \
   1546  1.1  mrg       /* Do any necessary initialization to access arbitrary stack frames. \
   1547  1.1  mrg 	 On the SPARC, this means flushing the register windows.  */	   \
   1548  1.1  mrg       __builtin_unwind_init ();						   \
   1549  1.1  mrg       uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (),		   \
   1550  1.1  mrg 			 __builtin_return_address (0));			   \
   1551  1.1  mrg     }									   \
   1552  1.1  mrg   while (0)
   1553  1.1  mrg 
   1554  1.1  mrg static inline void
   1555  1.1  mrg init_dwarf_reg_size_table (void)
   1556  1.1  mrg {
   1557  1.1  mrg   __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
   1558  1.1  mrg }
   1559  1.1  mrg 
   1560  1.1  mrg static void __attribute__((noinline))
   1561  1.1  mrg uw_init_context_1 (struct _Unwind_Context *context,
   1562  1.1  mrg 		   void *outer_cfa, void *outer_ra)
   1563  1.1  mrg {
   1564  1.1  mrg   void *ra = __builtin_extract_return_addr (__builtin_return_address (0));
   1565  1.1  mrg   _Unwind_FrameState fs;
   1566  1.1  mrg   _Unwind_SpTmp sp_slot;
   1567  1.1  mrg   _Unwind_Reason_Code code;
   1568  1.1  mrg 
   1569  1.1  mrg   memset (context, 0, sizeof (struct _Unwind_Context));
   1570  1.1  mrg   context->ra = ra;
   1571  1.1  mrg   if (!ASSUME_EXTENDED_UNWIND_CONTEXT)
   1572  1.1  mrg     context->flags = EXTENDED_CONTEXT_BIT;
   1573  1.1  mrg 
   1574  1.1  mrg   code = uw_frame_state_for (context, &fs);
   1575  1.1  mrg   gcc_assert (code == _URC_NO_REASON);
   1576  1.1  mrg 
   1577  1.1  mrg #if __GTHREADS
   1578  1.1  mrg   {
   1579  1.1  mrg     static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT;
   1580  1.1  mrg     if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0
   1581  1.1  mrg 	&& dwarf_reg_size_table[0] == 0)
   1582  1.1  mrg       init_dwarf_reg_size_table ();
   1583  1.1  mrg   }
   1584  1.1  mrg #else
   1585  1.1  mrg   if (dwarf_reg_size_table[0] == 0)
   1586  1.1  mrg     init_dwarf_reg_size_table ();
   1587  1.1  mrg #endif
   1588  1.1  mrg 
   1589  1.1  mrg   /* Force the frame state to use the known cfa value.  */
   1590  1.1  mrg   _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
   1591  1.1  mrg   fs.regs.cfa_how = CFA_REG_OFFSET;
   1592  1.1  mrg   fs.regs.cfa_reg = __builtin_dwarf_sp_column ();
   1593  1.1  mrg   fs.regs.cfa_offset = 0;
   1594  1.1  mrg 
   1595  1.1  mrg   uw_update_context_1 (context, &fs);
   1596  1.1  mrg 
   1597  1.1  mrg   /* If the return address column was saved in a register in the
   1598  1.1  mrg      initialization context, then we can't see it in the given
   1599  1.1  mrg      call frame data.  So have the initialization context tell us.  */
   1600  1.1  mrg   context->ra = __builtin_extract_return_addr (outer_ra);
   1601  1.1  mrg }
   1602  1.1  mrg 
   1603  1.1  mrg static void _Unwind_DebugHook (void *, void *)
   1604  1.1  mrg   __attribute__ ((__noinline__, __used__, __noclone__));
   1605  1.1  mrg 
   1606  1.1  mrg /* This function is called during unwinding.  It is intended as a hook
   1607  1.1  mrg    for a debugger to intercept exceptions.  CFA is the CFA of the
   1608  1.1  mrg    target frame.  HANDLER is the PC to which control will be
   1609  1.1  mrg    transferred.  */
   1610  1.1  mrg static void
   1611  1.1  mrg _Unwind_DebugHook (void *cfa __attribute__ ((__unused__)),
   1612  1.1  mrg 		   void *handler __attribute__ ((__unused__)))
   1613  1.1  mrg {
   1614  1.1  mrg   /* We only want to use stap probes starting with v3.  Earlier
   1615  1.1  mrg      versions added too much startup cost.  */
   1616  1.1  mrg #if defined (HAVE_SYS_SDT_H) && defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3
   1617  1.1  mrg   STAP_PROBE2 (libgcc, unwind, cfa, handler);
   1618  1.1  mrg #else
   1619  1.1  mrg   asm ("");
   1620  1.1  mrg #endif
   1621  1.1  mrg }
   1622  1.1  mrg 
   1623  1.1  mrg /* Install TARGET into CURRENT so that we can return to it.  This is a
   1624  1.1  mrg    macro because __builtin_eh_return must be invoked in the context of
   1625  1.1  mrg    our caller.  */
   1626  1.1  mrg 
   1627  1.1  mrg #define uw_install_context(CURRENT, TARGET)				\
   1628  1.1  mrg   do									\
   1629  1.1  mrg     {									\
   1630  1.1  mrg       long offset = uw_install_context_1 ((CURRENT), (TARGET));		\
   1631  1.1  mrg       void *handler = __builtin_frob_return_addr ((TARGET)->ra);	\
   1632  1.1  mrg       _Unwind_DebugHook ((TARGET)->cfa, handler);			\
   1633  1.1  mrg       __builtin_eh_return (offset, handler);				\
   1634  1.1  mrg     }									\
   1635  1.1  mrg   while (0)
   1636  1.1  mrg 
   1637  1.1  mrg static long
   1638  1.1  mrg uw_install_context_1 (struct _Unwind_Context *current,
   1639  1.1  mrg 		      struct _Unwind_Context *target)
   1640  1.1  mrg {
   1641  1.1  mrg   long i;
   1642  1.1  mrg   _Unwind_SpTmp sp_slot;
   1643  1.1  mrg 
   1644  1.1  mrg   /* If the target frame does not have a saved stack pointer,
   1645  1.1  mrg      then set up the target's CFA.  */
   1646  1.1  mrg   if (!_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ()))
   1647  1.1  mrg     _Unwind_SetSpColumn (target, target->cfa, &sp_slot);
   1648  1.1  mrg 
   1649  1.1  mrg   for (i = 0; i < DWARF_FRAME_REGISTERS; ++i)
   1650  1.1  mrg     {
   1651  1.1  mrg       void *c = (void *) (_Unwind_Internal_Ptr) current->reg[i];
   1652  1.1  mrg       void *t = (void *) (_Unwind_Internal_Ptr)target->reg[i];
   1653  1.1  mrg 
   1654  1.1  mrg       gcc_assert (current->by_value[i] == 0);
   1655  1.1  mrg       if (target->by_value[i] && c)
   1656  1.1  mrg 	{
   1657  1.1  mrg 	  _Unwind_Word w;
   1658  1.1  mrg 	  _Unwind_Ptr p;
   1659  1.1  mrg 	  if (dwarf_reg_size_table[i] == sizeof (_Unwind_Word))
   1660  1.1  mrg 	    {
   1661  1.1  mrg 	      w = (_Unwind_Internal_Ptr) t;
   1662  1.1  mrg 	      memcpy (c, &w, sizeof (_Unwind_Word));
   1663  1.1  mrg 	    }
   1664  1.1  mrg 	  else
   1665  1.1  mrg 	    {
   1666  1.1  mrg 	      gcc_assert (dwarf_reg_size_table[i] == sizeof (_Unwind_Ptr));
   1667  1.1  mrg 	      p = (_Unwind_Internal_Ptr) t;
   1668  1.1  mrg 	      memcpy (c, &p, sizeof (_Unwind_Ptr));
   1669  1.1  mrg 	    }
   1670  1.1  mrg 	}
   1671  1.1  mrg       else if (t && c && t != c)
   1672  1.1  mrg 	memcpy (c, t, dwarf_reg_size_table[i]);
   1673  1.1  mrg     }
   1674  1.1  mrg 
   1675  1.1  mrg   /* If the current frame doesn't have a saved stack pointer, then we
   1676  1.1  mrg      need to rely on EH_RETURN_STACKADJ_RTX to get our target stack
   1677  1.1  mrg      pointer value reloaded.  */
   1678  1.1  mrg   if (!_Unwind_GetGRPtr (current, __builtin_dwarf_sp_column ()))
   1679  1.1  mrg     {
   1680  1.1  mrg       void *target_cfa;
   1681  1.1  mrg 
   1682  1.1  mrg       target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ());
   1683  1.1  mrg 
   1684  1.1  mrg       /* We adjust SP by the difference between CURRENT and TARGET's CFA.  */
   1685  1.1  mrg       if (STACK_GROWS_DOWNWARD)
   1686  1.1  mrg 	return target_cfa - current->cfa + target->args_size;
   1687  1.1  mrg       else
   1688  1.1  mrg 	return current->cfa - target_cfa - target->args_size;
   1689  1.1  mrg     }
   1690  1.1  mrg   return 0;
   1691  1.1  mrg }
   1692  1.1  mrg 
   1693  1.1  mrg static inline _Unwind_Ptr
   1694  1.1  mrg uw_identify_context (struct _Unwind_Context *context)
   1695  1.1  mrg {
   1696  1.1  mrg   /* The CFA is not sufficient to disambiguate the context of a function
   1697  1.1  mrg      interrupted by a signal before establishing its frame and the context
   1698  1.1  mrg      of the signal itself.  */
   1699  1.1  mrg   if (STACK_GROWS_DOWNWARD)
   1700  1.1  mrg     return _Unwind_GetCFA (context) - _Unwind_IsSignalFrame (context);
   1701  1.1  mrg   else
   1702  1.1  mrg     return _Unwind_GetCFA (context) + _Unwind_IsSignalFrame (context);
   1703  1.1  mrg }
   1704  1.1  mrg 
   1705  1.1  mrg 
   1706  1.1  mrg #include "unwind.inc"
   1707  1.1  mrg 
   1708  1.1  mrg #if defined (USE_GAS_SYMVER) && defined (SHARED) && defined (USE_LIBUNWIND_EXCEPTIONS)
   1709  1.1  mrg alias (_Unwind_Backtrace);
   1710  1.1  mrg alias (_Unwind_DeleteException);
   1711  1.1  mrg alias (_Unwind_FindEnclosingFunction);
   1712  1.1  mrg alias (_Unwind_ForcedUnwind);
   1713  1.1  mrg alias (_Unwind_GetDataRelBase);
   1714  1.1  mrg alias (_Unwind_GetTextRelBase);
   1715  1.1  mrg alias (_Unwind_GetCFA);
   1716  1.1  mrg alias (_Unwind_GetGR);
   1717  1.1  mrg alias (_Unwind_GetIP);
   1718  1.1  mrg alias (_Unwind_GetLanguageSpecificData);
   1719  1.1  mrg alias (_Unwind_GetRegionStart);
   1720           alias (_Unwind_RaiseException);
   1721           alias (_Unwind_Resume);
   1722           alias (_Unwind_Resume_or_Rethrow);
   1723           alias (_Unwind_SetGR);
   1724           alias (_Unwind_SetIP);
   1725           #endif
   1726           
   1727           #endif /* !USING_SJLJ_EXCEPTIONS */
   1728