ObjFW  Check-in [65a0124f8d]

Overview
Comment:Don't use __builtin_eh_return_data_regno for SjLj

This also gets rid of RAISE_EXCEPTION and instead defines
_Unwind_RaiseException to _Unwind_SjLj_RaiseException for SjLj.

Additionally, it moves the defines to the top of the file.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 65a0124f8d6965e6fa694d82ac985fcbbf673b376cb3cfce55a0590185331d86
User & Date: js on 2014-02-20 22:29:02
Other Links: manifest | tags
Context
2014-02-20
22:30
Only use LIBOBJFW_DEP after including buildsys.mk check-in: 314d4930d3 user: js tags: trunk
22:29
Don't use __builtin_eh_return_data_regno for SjLj check-in: 65a0124f8d user: js tags: trunk
15:40
Restore _POSIX_C_SOURCE check-in: e30269f87e user: js tags: trunk
Changes

Modified src/runtime/exception.m from [02a3674deb] to [c587b3ed95].

20
21
22
23
24
25
26












27
28
29
30
31
32
33
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45







+
+
+
+
+
+
+
+
+
+
+
+







#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)
#elif defined(HAVE_SEH_EXCEPTIONS)
# define PERSONALITY gnu_objc_personality
#else
# error Unknown exception type!
#endif

static const uint64_t objc_exception_class = 0x474E55434F424A43; /* GNUCOBJC */

#define _UA_SEARCH_PHASE  0x01
#define _UA_CLEANUP_PHASE 0x02
#define _UA_HANDLER_FRAME 0x04
#define _UA_FORCE_UNWIND  0x08
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
131
132
133
134
135
136
137

138




139
140
141
142
143
144
145







-

-
-
-
-







	uint8_t typestable_enc;
	const uint8_t *typestable;
	uintptr_t typestable_base;
	uint8_t callsites_enc;
	const uint8_t *callsites, *actiontable;
};

#ifndef HAVE_SJLJ_EXCEPTIONS
extern _Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception*);
#else
extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException(
    struct _Unwind_Exception*);
#endif
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__)
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
192
193
194
195
196
197
198













199
200
201
202
203
204
205







-
-
-
-
-
-
-
-
-
-
-
-
-








#ifdef HAVE_SEH_EXCEPTIONS
extern EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, void*,
    PCONTEXT, PDISPATCHER_CONTEXT, _Unwind_Reason_Code(*)(int, int, uint64_t,
    struct _Unwind_Exception*, struct _Unwind_Context*));
#endif

#if defined(HAVE_DWARF_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_v0
# define RAISE_EXCEPTION _Unwind_RaiseException
#elif defined(HAVE_SJLJ_EXCEPTIONS)
# define PERSONALITY __gnu_objc_personality_sj0
# define RAISE_EXCEPTION _Unwind_SjLj_RaiseException
#elif defined(HAVE_SEH_EXCEPTIONS)
# define PERSONALITY gnu_objc_personality
# define RAISE_EXCEPTION _Unwind_RaiseException
#else
# error Unknown exception type!
#endif

static objc_uncaught_exception_handler uncaught_exception_handler;

static uint64_t
read_uleb128(const uint8_t **ptr)
{
	uint64_t value = 0;
	uint8_t shift = 0;
641
642
643
644
645
646
647
648

649
650
651
652
653
654
655
635
636
637
638
639
640
641

642
643
644
645
646
647
648
649







-
+







		abort();

	memset(e, 0, sizeof(*e));
	e->exception.class = objc_exception_class;
	e->exception.cleanup = cleanup;
	e->object = object;

	if (RAISE_EXCEPTION(&e->exception) == _URC_END_OF_STACK &&
	if (_Unwind_RaiseException(&e->exception) == _URC_END_OF_STACK &&
	    uncaught_exception_handler != NULL)
		uncaught_exception_handler(object);

	abort();
}

objc_uncaught_exception_handler