Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -1,16 +1,17 @@ include ../extra.mk SUBDIRS = ${RUNTIME} exceptions ${ENCODINGS} forwarding invocation -SUBDIRS_AFTER = ${BRIDGE} +SUBDIRS_AFTER = ${LINKLIB} ${BRIDGE} CLEAN = amiga-end.amigalib.dep \ amiga-end.amigalib.o \ amiga-glue.amigalib.dep \ amiga-glue.amigalib.o \ amiga-library-functable.inc \ amiga-library.amigalib.dep \ - amiga-library.amigalib.o + amiga-library.amigalib.o \ + inline.h DISTCLEAN = Info.plist objfw-defs.h SHARED_LIB = ${OBJFW_SHARED_LIB} STATIC_LIB = ${OBJFW_STATIC_LIB} FRAMEWORK = ${OBJFW_FRAMEWORK} Index: src/amiga-library.h ================================================================== --- src/amiga-library.h +++ src/amiga-library.h @@ -67,11 +67,11 @@ void *_Nullable (*_Nonnull __deregister_frame_info)( const void *_Nonnull); #endif /* Needed only by ObjFW. */ - int (*_Nonnull vsnprintf)(const char *_Nonnull restrict, size_t, + int (*_Nonnull vsnprintf)(char *_Nonnull restrict, size_t, const char *_Nonnull restrict, va_list); #ifdef OF_AMIGAOS_M68K /* strtod() uses sscanf() internally */ int (*_Nonnull vsscanf)(const char *_Nonnull restrict, const char *_Nonnull restrict, va_list); Index: src/amigaos3.sfd ================================================================== --- src/amigaos3.sfd +++ src/amigaos3.sfd @@ -9,13 +9,13 @@ const char *_Nullable glue_of_http_request_method_to_string(of_http_request_method_t method)(d0) of_http_request_method_t glue_of_http_request_method_from_string(OFString *string)(a0) OFString *_Nonnull glue_of_http_status_code_to_string(short code)(d0) size_t glue_of_sizeof_type_encoding(const char *type)(a0) size_t glue_of_alignof_type_encoding(const char *type)(a0) -void glue_of_log(OFConstantString *format, ...)(a0,printfcall) -OFString *glue_of_zip_archive_entry_version_to_string(uint16_t version)(d0) -OFString *glue_of_zip_archive_entry_compression_method_to_string(uint16_t compressionMethod)(d0) +void glue_of_logv(OFConstantString *format, va_list args)(a0,a1) +OFString *_Nonnull glue_of_zip_archive_entry_version_to_string(uint16_t version)(d0) +OFString *_Nonnull glue_of_zip_archive_entry_compression_method_to_string(uint16_t compressionMethod)(d0) size_t glue_of_zip_archive_entry_extra_field_find(OFData *extraField, uint16_t tag, uint16_t *size)(a0,d0,a1) void glue_of_pbkdf2(OFHMAC *HMAC, size_t iterations, const unsigned char *salt, size_t saltLength, const char *password, size_t passwordLength, unsigned char *key, size_t keyLength, bool allowsSwappableMemory)(a0,d0,a1,d1,a2,d2,a3,d3,d4) void glue_of_scrypt(size_t blockSize, size_t costFactor, size_t parallelization, const unsigned char *salt, size_t saltLength, const char *password, size_t passwordLength, unsigned char *key, size_t keyLength, bool allowsSwappableMemory)(d0,d1,d2,a0,d3,a1,d4,a2,d5,d6) of_socket_address_t glue_of_socket_address_parse_ip(OFString *IP, uint16_t port)(a0,d0) of_socket_address_t glue_of_socket_address_parse_ipv4(OFString *IP, uint16_t port)(a0,d0) ADDED src/linklib/Makefile Index: src/linklib/Makefile ================================================================== --- src/linklib/Makefile +++ src/linklib/Makefile @@ -0,0 +1,10 @@ +include ../../extra.mk + +STATIC_LIB = libobjfw.library.a +SRCS = linklib.m + +include ../../buildsys.mk + +CPPFLAGS += -I.. -I../.. -I../exceptions -I../runtime \ + -DOBJFW_AMIGA_LIB=\"${OBJFW_AMIGA_LIB}\" \ + -DOBJFW_LIB_MINOR=${OBJFW_LIB_MINOR} ADDED src/linklib/linklib.m Index: src/linklib/linklib.m ================================================================== --- src/linklib/linklib.m +++ src/linklib/linklib.m @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "ObjFW.h" +#import "amiga-library.h" +#import "macros.h" + +#include + +struct ObjFWBase; + +#import "inline.h" + +#include +#include +#include + +#if defined(OF_AMIGAOS_M68K) +# include +# define SYM(name) __asm__("_" name) +#elif defined(OF_MORPHOS) +# include +# define SYM(name) __asm__(name) +#endif + +#ifdef HAVE_SJLJ_EXCEPTIONS +extern int _Unwind_SjLj_RaiseException(void *); +#else +extern int _Unwind_RaiseException(void *); +#endif +extern void _Unwind_DeleteException(void *); +extern void *_Unwind_GetLanguageSpecificData(void *); +extern uintptr_t _Unwind_GetRegionStart(void *); +extern uintptr_t _Unwind_GetDataRelBase(void *); +extern uintptr_t _Unwind_GetTextRelBase(void *); +extern uintptr_t _Unwind_GetIP(void *); +extern uintptr_t _Unwind_GetGR(void *, int); +extern void _Unwind_SetIP(void *, uintptr_t); +extern void _Unwind_SetGR(void *, int, uintptr_t); +#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 +extern int _Unwind_Backtrace(int (*)(void *, void *), void *); + +struct Library *ObjFWBase; + +static void __attribute__((__used__)) +ctor(void) +{ + static bool initialized = false; + struct of_libc libc = { + .malloc = malloc, + .calloc = calloc, + .realloc = realloc, + .free = free, + .vfprintf = vfprintf, + .fflush = fflush, + .abort = abort, +#ifdef HAVE_SJLJ_EXCEPTIONS + ._Unwind_SjLj_RaiseException = _Unwind_SjLj_RaiseException, +#else + ._Unwind_RaiseException = _Unwind_RaiseException, +#endif + ._Unwind_DeleteException = _Unwind_DeleteException, + ._Unwind_GetLanguageSpecificData = + _Unwind_GetLanguageSpecificData, + ._Unwind_GetRegionStart = _Unwind_GetRegionStart, + ._Unwind_GetDataRelBase = _Unwind_GetDataRelBase, + ._Unwind_GetTextRelBase = _Unwind_GetTextRelBase, + ._Unwind_GetIP = _Unwind_GetIP, + ._Unwind_GetGR = _Unwind_GetGR, + ._Unwind_SetIP = _Unwind_SetIP, + ._Unwind_SetGR = _Unwind_SetGR, +#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 + .vsnprintf = vsnprintf, +#ifdef OF_AMIGAOS_M68K + .vsscanf = vsscanf, +#endif + .exit = exit, + .signal = signal, + .setlocale = setlocale, + ._Unwind_Backtrace = _Unwind_Backtrace + }; + + if (initialized) + return; + + if ((ObjFWBase = OpenLibrary(OBJFW_AMIGA_LIB, + OBJFW_LIB_MINOR)) == NULL) { + /* + * The linklib can be used by other libraries as well, so we + * can't have the compiler optimize this to another function, + * hence the use of an unnecessary format specifier. + */ + fprintf(stderr, "Failed to open %s!\n", OBJFW_AMIGA_LIB); + abort(); + } + + if (!glue_of_init(1, &libc, __sF)) { + /* + * The linklib can be used by other libraries as well, so we + * can't have the compiler optimize this to another function, + * hence the use of an unnecessary format specifier. + */ + fprintf(stderr, "Failed to initialize %s!\n", OBJFW_AMIGA_LIB); + abort(); + } + + initialized = true; +} + +static void __attribute__((__used__)) +dtor(void) +{ + CloseLibrary(ObjFWBase); +} + +#if defined(OF_AMIGAOS_M68K) +ADD2INIT(ctor, -2); +ADD2EXIT(dtor, -2); +#elif defined(OF_MORPHOS) +CONSTRUCTOR_P(ObjFW, 4000) +{ + ctor(); + + return 0; +} + +DESTRUCTOR_P(ObjFW, 4000) +{ + dtor(); +} +#endif + Index: src/runtime/linklib/Makefile ================================================================== --- src/runtime/linklib/Makefile +++ src/runtime/linklib/Makefile @@ -7,6 +7,5 @@ CPPFLAGS += -I.. -I../.. -I../../.. \ -DOBJC_COMPILING_AMIGA_LINKLIB \ -DOBJFWRT_AMIGA_LIB=\"${OBJFWRT_AMIGA_LIB}\" \ -DOBJFWRT_LIB_MINOR=${OBJFWRT_LIB_MINOR} -LD = ${OBJC}