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