︙ | | | ︙ | |
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <string.h>
#ifdef HAVE_SEH_EXCEPTIONS
# include <windows.h>
#endif
#import "runtime.h"
#if defined(HAVE_DWARF_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_v0
#elif defined(HAVE_SJLJ_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_sj0
# define _Unwind_RaiseException _Unwind_SjLj_RaiseException
# define __builtin_eh_return_data_regno(i) (i)
|
>
>
|
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <string.h>
#ifdef HAVE_SEH_EXCEPTIONS
# include <windows.h>
#endif
#import "runtime.h"
#import "macros.h"
#if defined(HAVE_DWARF_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_v0
#elif defined(HAVE_SJLJ_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_sj0
# define _Unwind_RaiseException _Unwind_SjLj_RaiseException
# define __builtin_eh_return_data_regno(i) (i)
|
︙ | | | ︙ | |
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
_URC_FAILURE = 9
} _Unwind_Reason_Code;
struct objc_exception {
struct _Unwind_Exception {
uint64_t class;
void (*cleanup)(_Unwind_Reason_Code, struct _Unwind_Exception*);
#if defined(__arm__) || defined(__ARM__)
/* From "Exception Handling ABI for the ARM(R) Architecture" */
struct {
uint32_t reserved1, reserved2, reserved3, reserved4;
uint32_t reserved;
} unwinder_cache;
struct {
uint32_t sp;
|
|
|
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
_URC_FAILURE = 9
} _Unwind_Reason_Code;
struct objc_exception {
struct _Unwind_Exception {
uint64_t class;
void (*cleanup)(_Unwind_Reason_Code, struct _Unwind_Exception*);
#ifdef OF_ARM
/* From "Exception Handling ABI for the ARM(R) Architecture" */
struct {
uint32_t reserved1, reserved2, reserved3, reserved4;
uint32_t reserved;
} unwinder_cache;
struct {
uint32_t sp;
|
︙ | | | ︙ | |
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
* them.
*/
uint64_t private1, private2;
# endif
#endif
} exception;
id object;
#if !defined(__arm__) && !defined(__ARM__)
uintptr_t landingpad;
intptr_t filter;
#endif
};
struct lsda {
uintptr_t region_start, landingpads_start;
|
|
|
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
* them.
*/
uint64_t private1, private2;
# endif
#endif
} exception;
id object;
#ifndef OF_ARM
uintptr_t landingpad;
intptr_t filter;
#endif
};
struct lsda {
uintptr_t region_start, landingpads_start;
|
︙ | | | ︙ | |
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
extern _Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception*);
extern void _Unwind_DeleteException(struct _Unwind_Exception*);
extern void* _Unwind_GetLanguageSpecificData(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetDataRelBase(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetTextRelBase(struct _Unwind_Context*);
#if defined(__arm__) || defined(__ARM__)
extern _Unwind_Reason_Code __gnu_unwind_frame(struct _Unwind_Exception*,
struct _Unwind_Context*);
extern int _Unwind_VRS_Get(struct _Unwind_Context*, int, uint32_t, int, void*);
extern int _Unwind_VRS_Set(struct _Unwind_Context*, int, uint32_t, int, void*);
# define CONTINUE_UNWIND \
{ \
|
|
|
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
extern _Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception*);
extern void _Unwind_DeleteException(struct _Unwind_Exception*);
extern void* _Unwind_GetLanguageSpecificData(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetDataRelBase(struct _Unwind_Context*);
extern uintptr_t _Unwind_GetTextRelBase(struct _Unwind_Context*);
#ifdef OF_ARM
extern _Unwind_Reason_Code __gnu_unwind_frame(struct _Unwind_Exception*,
struct _Unwind_Context*);
extern int _Unwind_VRS_Get(struct _Unwind_Context*, int, uint32_t, int, void*);
extern int _Unwind_VRS_Set(struct _Unwind_Context*, int, uint32_t, int, void*);
# define CONTINUE_UNWIND \
{ \
|
︙ | | | ︙ | |
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
abort();
}
#undef READ
return value;
}
#if !defined(__arm__) && !defined(__ARM__)
static uint64_t
resolve_value(uint64_t value, uint8_t enc, const uint8_t *start, uint64_t base)
{
if (value == 0)
return 0;
value += ((enc & 0x70) == DW_EH_PE_pcrel ? (uintptr_t)start : base);
|
|
|
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
|
abort();
}
#undef READ
return value;
}
#ifndef OF_ARM
static uint64_t
resolve_value(uint64_t value, uint8_t enc, const uint8_t *start, uint64_t base)
{
if (value == 0)
return 0;
value += ((enc & 0x70) == DW_EH_PE_pcrel ? (uintptr_t)start : base);
|
︙ | | | ︙ | |
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
|
if (filter > 0 && !(actions & _UA_FORCE_UNWIND) && !foreign) {
Class class;
const char *className;
uintptr_t c;
const uint8_t *tmp;
#if defined(__arm__) || defined(__ARM__)
tmp = lsda->typestable - (filter * 4);
c = *(uintptr_t*)(void*)tmp;
if (c != 0) {
c += (uintptr_t)tmp;
# if defined(__linux__) || defined(__NetBSD__)
c = *(uintptr_t*)c;
# endif
}
#else
uintptr_t i;
i = filter * size_for_encoding(lsda->typestable_enc);
|
|
|
|
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
|
if (filter > 0 && !(actions & _UA_FORCE_UNWIND) && !foreign) {
Class class;
const char *className;
uintptr_t c;
const uint8_t *tmp;
#ifdef OF_ARM
tmp = lsda->typestable - (filter * 4);
c = *(uintptr_t*)(void*)tmp;
if (c != 0) {
c += (uintptr_t)tmp;
# if defined(OF_LINUX) || defined(OF_NETBSD)
c = *(uintptr_t*)c;
# endif
}
#else
uintptr_t i;
i = filter * size_for_encoding(lsda->typestable_enc);
|
︙ | | | ︙ | |
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
|
else
abort();
} while (displacement != 0);
return 0;
}
#if defined(__arm__) || defined(__ARM__)
_Unwind_Reason_Code
PERSONALITY(uint32_t state, struct _Unwind_Exception *ex,
struct _Unwind_Context *ctx)
{
int version = 1;
uint64_t ex_class = ex->class;
int actions;
|
|
|
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
else
abort();
} while (displacement != 0);
return 0;
}
#ifdef OF_ARM
_Unwind_Reason_Code
PERSONALITY(uint32_t state, struct _Unwind_Exception *ex,
struct _Unwind_Context *ctx)
{
int version = 1;
uint64_t ex_class = ex->class;
int actions;
|
︙ | | | ︙ | |
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
|
if (actions & _UA_HANDLER_FRAME && !foreign) {
/*
* For handlers, reg #0 must be the exception's object and reg
* #1 the filter.
*/
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(0),
(uintptr_t)e->object);
#if defined(__arm__) || defined(__ARM__)
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(1),
ex->barrier_cache.bitpattern[1]);
_Unwind_SetIP(ctx, ex->barrier_cache.bitpattern[3]);
#else
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(1),
e->filter);
_Unwind_SetIP(ctx, e->landingpad);
|
|
|
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
|
if (actions & _UA_HANDLER_FRAME && !foreign) {
/*
* For handlers, reg #0 must be the exception's object and reg
* #1 the filter.
*/
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(0),
(uintptr_t)e->object);
#ifdef OF_ARM
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(1),
ex->barrier_cache.bitpattern[1]);
_Unwind_SetIP(ctx, ex->barrier_cache.bitpattern[3]);
#else
_Unwind_SetGR(ctx, __builtin_eh_return_data_regno(1),
e->filter);
_Unwind_SetIP(ctx, e->landingpad);
|
︙ | | | ︙ | |
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
|
CONTINUE_UNWIND;
if (actions & _UA_SEARCH_PHASE) {
if (!(found & HANDLER_FOUND) || foreign)
CONTINUE_UNWIND;
/* Cache it so we don't have to search it again in phase 2 */
#if defined(__arm__) || defined(__ARM__)
ex->barrier_cache.sp = _Unwind_GetGR(ctx, 13);
ex->barrier_cache.bitpattern[1] = filter;
ex->barrier_cache.bitpattern[3] = landingpad;
#else
e->landingpad = landingpad;
e->filter = filter;
#endif
|
|
|
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
|
CONTINUE_UNWIND;
if (actions & _UA_SEARCH_PHASE) {
if (!(found & HANDLER_FOUND) || foreign)
CONTINUE_UNWIND;
/* Cache it so we don't have to search it again in phase 2 */
#ifdef OF_ARM
ex->barrier_cache.sp = _Unwind_GetGR(ctx, 13);
ex->barrier_cache.bitpattern[1] = filter;
ex->barrier_cache.bitpattern[3] = landingpad;
#else
e->landingpad = landingpad;
e->filter = filter;
#endif
|
︙ | | | ︙ | |