Index: src/amiga-library.h ================================================================== --- src/amiga-library.h +++ src/amiga-library.h @@ -16,11 +16,11 @@ */ #import "macros.h" #if defined(OF_COMPILING_AMIGA_LIBRARY) || defined(OF_COMPILING_AMIGA_LINKLIB) -# if defined(__MORPHOS__) +# ifdef OF_MORPHOS # include # define OF_M68K_ARG(type, name, reg) type name = (type)REG_##reg; # else # define OF_M68K_ARG(type, name, reg) \ register type reg_##name __asm__(#reg); \ @@ -58,14 +58,16 @@ # 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 *_Nullable (*_Nonnull __deregister_frame_info)( const void *_Nonnull); +# endif /* Needed only by ObjFW. */ int (*_Nonnull vsnprintf)(const char *_Nonnull restrict, size_t, const char *_Nonnull restrict, va_list); void (*_Nonnull exit)(int); Index: src/amiga-library.m ================================================================== --- src/amiga-library.m +++ src/amiga-library.m @@ -58,10 +58,12 @@ #ifdef OF_AMIGAOS_M68K extern uintptr_t __CTOR_LIST__[]; extern const void *_EH_FRAME_BEGINS__; extern void *_EH_FRAME_OBJECTS__; +extern void __register_frame_info(const void *, void *); +extern void *__deregister_frame_info(const void *); #endif extern bool glue_of_init(void); #ifdef OF_AMIGAOS_M68K @@ -287,11 +289,11 @@ struct ObjFWBase *parent; #ifdef OF_AMIGAOS_M68K if (base->initialized) for (size_t i = 1; i <= (size_t)_EH_FRAME_BEGINS__; i++) - libc.__deregister_frame_info( + __deregister_frame_info( (&_EH_FRAME_BEGINS__)[i]); #endif parent = base->parent; @@ -338,11 +340,11 @@ #ifdef OF_AMIGAOS_M68K if ((size_t)_EH_FRAME_BEGINS__ != (size_t)_EH_FRAME_OBJECTS__) return false; for (size_t i = 1; i <= (size_t)_EH_FRAME_BEGINS__; i++) - libc.__register_frame_info((&_EH_FRAME_BEGINS__)[i], + __register_frame_info((&_EH_FRAME_BEGINS__)[i], (&_EH_FRAME_OBJECTS__)[i]); iter0 = &__CTOR_LIST__[1]; #elif defined(OF_MORPHOS) __asm__ ( @@ -398,10 +400,16 @@ ret = libc.vfprintf(stream, fmt, args); va_end(args); return ret; } + +int +vfprintf(FILE *restrict stream, const char *restrict fmt, va_list args) +{ + return libc.vfprintf(stream, fmt, args); +} int fflush(FILE *restrict stream) { return libc.fflush(stream); @@ -494,10 +502,24 @@ _Unwind_Resume(void *ex) { libc._Unwind_Resume(ex); } #endif + +#ifdef OF_AMIGAOS_M68K +void +__register_frame_info(const void *begin, void *object) +{ + libc.__register_frame_info(begin, object); +} + +void +*__deregister_frame_info(const void *begin) +{ + return libc.__deregister_frame_info(begin); +} +#endif int vsnprintf(char *restrict str, size_t size, const char *restrict fmt, va_list args) { Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -55,12 +55,14 @@ #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 struct Library *ObjFWRTBase; void *__objc_class_name_Protocol; static void __attribute__((__used__)) @@ -93,25 +95,28 @@ #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 }; if (initialized) return; if ((ObjFWRTBase = OpenLibrary(OBJFWRT_AMIGA_LIB, OBJFWRT_LIB_MINOR)) == NULL) { - fputs("Failed to open " OBJFWRT_AMIGA_LIB "!\n", stderr); + fprintf(stderr, "Failed to open %s!\n", OBJFWRT_AMIGA_LIB); abort(); } if (!glue_objc_init(1, &libc, __sF)) { - fputs("Failed to initialize " OBJFWRT_AMIGA_LIB "!\n", stderr); + fprintf(stderr, "Failed to initialize %s!\n", + OBJFWRT_AMIGA_LIB); abort(); } initialized = true; } Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -247,19 +247,21 @@ # ifdef HAVE_SJLJ_EXCEPTIONS void (*_Nonnull _Unwind_SjLj_Resume)(void *_Nonnull); # else void (*_Nonnull _Unwind_Resume)(void *_Nonnull); # endif +# if defined(__amigaos__) && !defined(__MORPHOS__) void (*_Nonnull __register_frame_info)(const void *_Nonnull, void *_Nonnull); void *_Nullable (*_Nonnull __deregister_frame_info)( const void *_Nonnull); +# endif }; #endif #ifdef OBJC_COMPILING_AMIGA_LIBRARY -# if defined(__MORPHOS__) +# ifdef __MORPHOS__ # include # define OBJC_M68K_ARG(type, name, reg) type name = (type)REG_##reg; # else # define OBJC_M68K_ARG(type, name, reg) \ register type reg_##name __asm__(#reg); \