diff --git a/configure.ac b/configure.ac index 93dbb82..ab8ea21 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ AC_PREREQ(2.50) AC_CONFIG_AUX_DIR(autotools) AC_CANONICAL_SYSTEM -AM_INIT_AUTOMAKE(elk, 3.99.0) +AM_INIT_AUTOMAKE(elk, 3.99.1) AM_CONFIG_HEADER(config.h) AC_PROG_CC @@ -187,7 +187,7 @@ AC_DEFINE(USE_DLOPEN, 1, [FIXME HARD]) # with a special character (such as underline)? If so, syms_begin_with # should hold this character, otherwise leave it empty. if false; then - AC_DEFINE(SYMS_BEGIN_WITH, 1, [FIXME HARD]) + AC_DEFINE(SYMS_BEGIN_WITH, ['_'], [FIXME HARD]) fi # The symbol prefixes of extension initialization and finalization @@ -367,18 +367,6 @@ else fi AM_CONDITIONAL(HAVE_CXX, test "${ac_cv_my_have_cxx}" = "yes") -AC_CACHE_CHECK([__attribute__ ((noreturn)) support], - [ac_cv_c_attribute_noreturn], - [ac_cv_c_attribute_noreturn=no - CFLAGS="${CFLAGS_save} -Werror" - AC_TRY_COMPILE([], - [extern void foobar() __attribute__ ((noreturn));], - [ac_cv_c_attribute_noreturn=yes]) - CFLAGS="${CFLAGS_save}"]) -if test "${ac_cv_c_attribute_noreturn}" != "no"; then - AC_DEFINE(HAVE_ATTRIBUTE_NORETURN, 1, Support for __attribute__((noreturn))) -fi - AC_CACHE_CHECK([if \$CC accepts -Wall], [ac_cv_c_Wall], [CFLAGS="-Wall ${CFLAGS_save}" @@ -478,7 +466,7 @@ cat << EOF Configuration summary --------------------- -C++ support: ${ac_cv_my_have_cxx} +build C++ plugins: ${ac_cv_my_have_cxx} libgdbm support: ${ac_cv_my_have_xaw} X11 support: ${ac_cv_my_have_x11} Xaw support: ${ac_cv_my_have_xaw} diff --git a/include/extern.h b/include/extern.h index 3a2a26b..9cc0068 100644 --- a/include/extern.h +++ b/include/extern.h @@ -109,13 +109,8 @@ extern Object The_Environment, Global_Environment; /* Error handling */ -#ifdef HAVE_ATTRIBUTE_NORETURN -extern void Primitive_Error P_((const char*, ...)) __attribute__ ((__noreturn__)); -extern void Fatal_Error P_((const char*, ...)) __attribute__ ((__noreturn__)); -#else -extern void Primitive_Error P_((const char*, ...)); -extern void Fatal_Error P_((const char*, ...)); -#endif +extern void Primitive_Error P_((const char*, ...)) elk_attribute(__noreturn__); +extern void Fatal_Error P_((const char*, ...)) elk_attribute(__noreturn__); extern void Range_Error P_((Object)); extern void Panic P_((const char*)); extern Object P_Error P_((int, Object*)); @@ -473,14 +468,9 @@ extern void Terminate_Type P_((int)); */ extern TYPEDESCR *Types; extern Object P_Type P_((Object)); -#ifdef HAVE_ATTRIBUTE_NORETURN -extern void Wrong_Type P_((Object, int)) __attribute__ ((__noreturn__)); +extern void Wrong_Type P_((Object, int)) elk_attribute(__noreturn__); extern void Wrong_Type_Combination P_((Object, const char*)) - __attribute__ ((__noreturn__)); -#else -extern void Wrong_Type P_((Object, int)); -extern void Wrong_Type_Combination P_((Object, const char*)); -#endif + elk_attribute(__noreturn__); extern int Define_Type P_((int, const char*, int (*)(Object), int, int (*)(Object, Object), int (*)(Object, Object), int (*)(Object, Object, int, int, int), diff --git a/include/misc.h b/include/misc.h index f9e89e9..e37a858 100644 --- a/include/misc.h +++ b/include/misc.h @@ -28,28 +28,6 @@ * THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. */ -#ifndef __GNUC__ -# define __asm__ asm -#endif - -#ifndef HUGE -# define HUGE HUGE_VAL -#endif - - -/* Arithmetic shift right for compilers that don't sign extend: - */ -#if (-1 >> 1) < 0 -# define ASR(n,s) ((n) >>= (s)) -#else -# define NBITS(v) ((sizeof v) * 8) -# define HIBIT(v,n) (NBITS(v) - (n)) -# define ASR(n,s) ((n) >>= (s),\ - ((n) & (1 << (HIBIT((n),(s)) - 1)) ?\ - ((n) |= ~(((unsigned)1 << HIBIT((n),(s))) - 1)) :\ - (n))) -#endif - extern Object False2; #define Nullp(x) (TYPE(x) == T_Null) diff --git a/include/site.h.in b/include/site.h.in index 4bf49d5..8f33379 100644 --- a/include/site.h.in +++ b/include/site.h.in @@ -31,3 +31,35 @@ /* The C99 integers header */ #include <@STDINT_HEADER@> +/* C Compiler features */ +#ifndef __GNUC__ +# define __asm__ asm +#endif + +#ifndef HUGE +# define HUGE HUGE_VAL +#endif + +/* Under gcc, we use the __attribute__ macro to tell the compiler that a + * function does not return. */ +#ifdef __GNUC__ +# define elk_attribute(att) __attribute__ ((att)) +#else +# define elk_attribute(att) /* */ +#endif + + +/* Arithmetic shift right for compilers that don't sign extend: + */ +#if (-1 >> 1) < 0 +# define ASR(n,s) ((n) >>= (s)) +#else +# define NBITS(v) ((sizeof v) * 8) +# define HIBIT(v,n) (NBITS(v) - (n)) +# define ASR(n,s) ((n) >>= (s),\ + ((n) & (1 << (HIBIT((n),(s)) - 1)) ?\ + ((n) |= ~(((unsigned)1 << HIBIT((n),(s))) - 1)) :\ + (n))) +#endif + + diff --git a/src/error.c b/src/error.c index 0174e93..2f8abcb 100644 --- a/src/error.c +++ b/src/error.c @@ -36,13 +36,8 @@ #include "kernel.h" -#ifdef HAVE_ATTRIBUTE_NORETURN -void Reset () __attribute__ ((__noreturn__)); -void Err_Handler () __attribute__ ((__noreturn__)); -#else -void Reset (); -void Err_Handler (); -#endif +void Reset () elk_attribute(__noreturn__); +void Err_Handler () elk_attribute(__noreturn__); Object Arg_True; diff --git a/src/exception.c b/src/exception.c index 30b25c7..c6db738 100644 --- a/src/exception.c +++ b/src/exception.c @@ -34,11 +34,7 @@ #include "kernel.h" -#ifdef HAVE_ATTRIBUTE_NORETURN -extern void Reset () __attribute__ ((__noreturn__)); -#else -extern void Reset (); -#endif +extern void Reset () elk_attribute(__noreturn__); int Intr_Was_Ignored; unsigned long int Intr_Level; diff --git a/src/libelk.c b/src/libelk.c index 41c1f85..de05242 100644 --- a/src/libelk.c +++ b/src/libelk.c @@ -122,11 +122,7 @@ void Exit_Handler () { #ifndef HAVE_ATEXIT /* Hack: __GNUC_MINOR__ was introduced together with __attribute__ */ #ifdef __GNUC_MINOR__ -#ifdef HAVE_ATTRIBUTE_NORETURN -extern void _exit() __attribute__ ((noreturn)); -#else -extern void _exit(); -#endif +extern void _exit() elk_attribute(__noreturn__); #endif #ifndef PROFILING void exit (n) { diff --git a/src/proc.c b/src/proc.c index 3e1e8aa..400581c 100644 --- a/src/proc.c +++ b/src/proc.c @@ -57,12 +57,8 @@ extern void Switch_Environment (Object); extern unsigned int Stack_Size (); extern void Uncatchable_Error (char *); -#ifdef HAVE_ATTRIBUTE_NORETURN extern void Funcall_Control_Point (Object, Object, int) - __attribute__ ((__noreturn__)); -#else -extern void Funcall_Control_Point (Object, Object, int); -#endif + elk_attribute(__noreturn__); extern void Pop_Frame (); extern void Push_Frame (Object); diff --git a/src/read.c b/src/read.c index c404b76..01d915d 100644 --- a/src/read.c +++ b/src/read.c @@ -54,11 +54,7 @@ extern char *index(); extern double atof(); int Skip_Comment (Object); -#ifdef HAVE_ATTRIBUTE_NORETURN -void Reader_Error (Object, char *) __attribute__ ((__noreturn__)); -#else -void Reader_Error (Object, char *); -#endif +void Reader_Error (Object, char *) elk_attribute(__noreturn__); Object Sym_Quote, Sym_Quasiquote,