Index: src/runtime/amiga-library.m ================================================================== --- src/runtime/amiga-library.m +++ src/runtime/amiga-library.m @@ -415,10 +415,13 @@ #ifdef OF_AMIGAOS_M68K OBJC_M68K_ARG(struct ObjFWRTBase *, base, a6) #else register struct ObjFWRTBase *r12 __asm__("r12"); struct ObjFWRTBase *base = r12; +#endif +#ifdef OF_MORPHOS + void *frame; #endif uintptr_t *iter, *iter0; if (version > 1) return false; @@ -436,14 +439,18 @@ (&_EH_FRAME_OBJECTS__)[i]); iter0 = &__CTOR_LIST__[1]; #elif defined(OF_MORPHOS) __asm__ ( - "lis %0, ctors+4@ha\n\t" - "la %0, ctors+4@l(%0)\n\t" - : "=r"(iter0) + "lis %0, __EH_FRAME_BEGIN__@ha\n\t" + "la %0, __EH_FRAME_BEGIN__@l(%0)\n\t" + "lis %1, __CTOR_LIST__@ha\n\t" + "la %1, __CTOR_LIST__@l(%1)\n\t" + : "=r"(frame), "=r"(iter0) ); + + libc.__register_frame(frame); #endif for (iter = iter0; *iter != 0; iter++); while (iter > iter0) { @@ -743,11 +750,16 @@ #endif }; #ifdef OF_MORPHOS __asm__ ( + ".section .eh_frame, \"aw\", @progbits\n" + ".globl __EH_FRAME_BEGIN__\n" + ".type __EH_FRAME_BEGIN__, @object\n" + "__EH_FRAME_BEGIN__:\n" ".section .ctors, \"aw\", @progbits\n" - "ctors:\n" - " .long -1\n" + ".globl __CTOR_LIST__\n" + ".type __CTOR_LIST__, @object\n" + "__CTOR_LIST__:\n" ".section .text" ); #endif Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -56,12 +56,18 @@ #ifdef HAVE_SJLJ_EXCEPTIONS extern void _Unwind_SjLj_Resume(void *); #else extern void _Unwind_Resume(void *); #endif +#ifdef OF_AMIGAOS_M68K extern void __register_frame_info(const void *, void *); extern void *__deregister_frame_info(const void *); +#endif +#ifdef OF_MORPHOS +extern void __register_frame(void *); +extern void __deregister_frame(void *); +#endif struct Library *ObjFWRTBase; void *__objc_class_name_Protocol; static int * @@ -100,12 +106,18 @@ #ifdef HAVE_SJLJ_EXCEPTIONS ._Unwind_SjLj_Resume = _Unwind_SjLj_Resume, #else ._Unwind_Resume = _Unwind_Resume, #endif +#ifdef OF_AMIGAOS_M68K .__register_frame_info = __register_frame_info, .__deregister_frame_info = __deregister_frame_info, +#endif +#ifdef OF_MORPHOS + .__register_frame = __register_frame, + .__deregister_frame = __deregister_frame, +#endif .get_errno = get_errno, }; if (initialized) return; Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -246,13 +246,19 @@ # ifdef HAVE_SJLJ_EXCEPTIONS void (*_Nonnull _Unwind_SjLj_Resume)(void *_Nonnull); # else void (*_Nonnull _Unwind_Resume)(void *_Nonnull); # endif +# ifdef OF_AMIGAOS_M68K void (*_Nonnull __register_frame_info)(const void *_Nonnull, void *_Nonnull); void *(*_Nonnull __deregister_frame_info)(const void *_Nonnull); +# endif +# ifdef OF_MORPHOS + void (*_Nonnull __register_frame)(void *_Nonnull); + void (*_Nonnull __deregister_frame)(void *_Nonnull); +# endif int *_Nonnull (*_Nonnull get_errno)(void); }; #endif #ifdef OBJC_COMPILING_AMIGA_LIBRARY