From 678cab02fbb0084ac681fa675d3abd7c141bd438 Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Thu, 10 Mar 2005 13:58:13 +0000 Subject: [PATCH] - The macro definitions deserved better documentation. Well, they probably still do... git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14878 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/macros.h | 221 +++++++++++++++++++++++++++-------------------- 1 file changed, 128 insertions(+), 93 deletions(-) diff --git a/library/macros.h b/library/macros.h index 7462487..3f410b0 100644 --- a/library/macros.h +++ b/library/macros.h @@ -1,5 +1,5 @@ /* - * $Id: macros.h,v 1.13 2005-03-10 09:55:03 obarthel Exp $ + * $Id: macros.h,v 1.14 2005-03-10 13:58:13 obarthel Exp $ * * :ts=4 * @@ -54,12 +54,6 @@ /****************************************************************************/ -#ifndef ZERO -#define ZERO ((BPTR)NULL) -#endif /* ZERO */ - -/****************************************************************************/ - #define NUM_ENTRIES(t) (sizeof(t) / sizeof(t[0])) /****************************************************************************/ @@ -75,17 +69,135 @@ /****************************************************************************/ /* Macro to get longword-aligned stack space for a structure - * Uses ANSI token catenation to form a name for the char array - * based on the variable name, then creates an appropriately - * typed pointer to point to the first longword boundary in the - * char array allocated. - */ + Uses ANSI token catenation to form a name for the char array + based on the variable name, then creates an appropriately + typed pointer to point to the first longword boundary in the + char array allocated. */ #define D_S(type, name) \ char a_##name[sizeof(type)+3]; \ type *name = (type *)((LONG)(a_##name+3) & ~3) /****************************************************************************/ +/* BCPL style "NULL"; this should be in . */ +#ifndef ZERO +#define ZERO ((BPTR)NULL) +#endif /* ZERO */ + +/****************************************************************************/ + +/* Constructor and destructor functions, as used by the library for data + initialization and cleanup. These particular functions are invoked by + the startup code before and after the main() function is/was called. + How this works is very compiler specific. We support three flavours + below. */ + +/****************************************************************************/ + +#ifdef __SASC + +#define CONSTRUCTOR(name,pri) \ + int __stdargs _STI_##pri##_##name(void); \ + int __stdargs _STI_##pri##_##name(void) + +#define DESTRUCTOR(name,pri) \ + int __stdargs _STD_##pri##_##name(void); \ + int __stdargs _STD_##pri##_##name(void) + +#define CONSTRUCTOR_SUCCEED() \ + return(0) + +#define CONSTRUCTOR_FAIL() \ + return(1) + +#endif /* __SASC */ + +/****************************************************************************/ + +#ifdef __GNUC__ + +#if defined(__amigaos4__) + +#define CONSTRUCTOR(name,pri) \ + STATIC VOID __attribute__((used)) name##_ctor(VOID); \ + STATIC VOID (*__##name##_ctor)(VOID) __attribute__((used,section(".ctors._" #pri))) = name##_ctor; \ + STATIC VOID name##_ctor(VOID) + +#define DESTRUCTOR(name,pri) \ + STATIC VOID __attribute__((used)) name##_dtor(VOID); \ + STATIC VOID (*__##name##_dtor)(VOID) __attribute__((used,section(".dtors._" #pri))) = name##_dtor; \ + STATIC VOID name##_dtor(VOID) + +#else + +#define CONSTRUCTOR(name,pri) \ + STATIC VOID __attribute__((constructor)) __ctor##pri##_##name##(VOID); \ + STATIC void __ctor##pri##_##name##(VOID) + +#define DESTRUCTOR(name,pri) \ + STATIC VOID __attribute__((destructor)) __dtor##pri##_##name##(VOID); \ + STATIC VOID __dtor##pri##_##name##(VOID) + +#endif /* __amigaos4__ */ + +#define CONSTRUCTOR_SUCCEED() \ + return + +#define CONSTRUCTOR_FAIL() \ + exit(RETURN_FAIL) + +#endif /* __GNUC__ */ + +/****************************************************************************/ + +/* These macros are for declaring functions to serve as constructors or + destructors. In which order these should be invoked is defined by the + priority, which is a number in the range 0-999. User-supplied + constructor/destructor functions should have priority 0. That way, + the user-supplied constructors will be invoked after the library + constructors and the user-supplied destructors before the library + destructors. */ + +#define CLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 500) +#define CLIB_DESTRUCTOR(name) DESTRUCTOR(name, 500) +#define PROFILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 150) +#define PROFILE_DESTRUCTOR(name) DESTRUCTOR(name, 150) + +/****************************************************************************/ + +/* Magic macros for code profiling, SAS/C style. Normally, you would find + these in , which is SAS/C-specific. */ + +/****************************************************************************/ + +#ifdef __SASC +extern void ASM _PROLOG(REG(a0,char *)); +extern void ASM _EPILOG(REG(a0,char *)); + +#if _PROFILE +#define PROFILE_OFF() _PROLOG(0L) +#define PROFILE_ON() _EPILOG(0L) +#else +#define PROFILE_OFF() ((void)0) +#define PROFILE_ON() ((void)0) +#endif /* _PROFILE */ +#endif /* __SASC */ + +/****************************************************************************/ + +#ifdef __GNUC__ +#define PROFILE_OFF() ((void)0) +#define PROFILE_ON() ((void)0) +#endif /* __GNUC__ */ + +/****************************************************************************/ + +/* Special data and function attributes; for OS4 most, if not all of them + are in a file called which is pulled in by the + header file. */ + +/****************************************************************************/ + #ifndef AMIGA_COMPILER_H #ifdef __SASC @@ -144,97 +256,20 @@ #ifndef UNUSED #ifdef __GNUC__ #define UNUSED __attribute__((unused)) -#define NOCOMMON __attribute__((nocommon)) #else #define UNUSED /* UNUSED */ -#define NOCOMMON /* NOCOMMON */ #endif /* __GNUC__ */ #endif /* UNUSED */ /****************************************************************************/ -#ifdef __SASC - -#define CONSTRUCTOR(name,pri) \ - int __stdargs _STI_##pri##_##name(void); \ - int __stdargs _STI_##pri##_##name(void) - -#define DESTRUCTOR(name,pri) \ - int __stdargs _STD_##pri##_##name(void); \ - int __stdargs _STD_##pri##_##name(void) - -#define CONSTRUCTOR_SUCCEED() \ - return(0) - -#define CONSTRUCTOR_FAIL() \ - return(1) - -#endif /* __SASC */ - -/****************************************************************************/ - +#ifndef NOCOMMON #ifdef __GNUC__ - -#if defined(__amigaos4__) - -#define CONSTRUCTOR(name,pri) \ - STATIC VOID __attribute__((used)) name##_ctor(VOID); \ - STATIC VOID (*__##name##_ctor)(VOID) __attribute__((used,section(".ctors._" #pri))) = name##_ctor; \ - STATIC VOID name##_ctor(VOID) - -#define DESTRUCTOR(name,pri) \ - STATIC VOID __attribute__((used)) name##_dtor(VOID); \ - STATIC VOID (*__##name##_dtor)(VOID) __attribute__((used,section(".dtors._" #pri))) = name##_dtor; \ - STATIC VOID name##_dtor(VOID) - +#define NOCOMMON __attribute__((nocommon)) #else - -#define CONSTRUCTOR(name,pri) \ - STATIC VOID __attribute__((constructor)) __ctor##pri##_##name##(VOID); \ - STATIC void __ctor##pri##_##name##(VOID) - -#define DESTRUCTOR(name,pri) \ - STATIC VOID __attribute__((destructor)) __dtor##pri##_##name##(VOID); \ - STATIC VOID __dtor##pri##_##name##(VOID) - -#endif /* __amigaos4__ */ - -#define CONSTRUCTOR_SUCCEED() \ - return - -#define CONSTRUCTOR_FAIL() \ - exit(RETURN_FAIL) /* ZZZ not a nice thing to do; fix the constructor invocation code! */ - -#endif /* __GNUC__ */ - -/****************************************************************************/ - -#define CLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 500) -#define CLIB_DESTRUCTOR(name) DESTRUCTOR(name, 500) -#define PROFILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 150) -#define PROFILE_DESTRUCTOR(name) DESTRUCTOR(name, 150) - -/****************************************************************************/ - -#ifdef __SASC -extern void ASM _PROLOG(REG(a0,char *)); -extern void ASM _EPILOG(REG(a0,char *)); - -#if _PROFILE -#define PROFILE_OFF() _PROLOG(0L) -#define PROFILE_ON() _EPILOG(0L) -#else -#define PROFILE_OFF() ((void)0) -#define PROFILE_ON() ((void)0) -#endif /* _PROFILE */ -#endif /* __SASC */ - -/****************************************************************************/ - -#ifdef __GNUC__ -#define PROFILE_OFF() ((void)0) -#define PROFILE_ON() ((void)0) +#define NOCOMMON /* NOCOMMON */ #endif /* __GNUC__ */ +#endif /* NOCOMMON */ /****************************************************************************/