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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 1068 1.1 mrg insn_ptr = read_uleb128 (insn_ptr, ®2); 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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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