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