[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
AC_FUNC_ALLOCA description is not clear, potentially wrong
From: |
Vincent Lefevre |
Subject: |
AC_FUNC_ALLOCA description is not clear, potentially wrong |
Date: |
Thu, 24 Jan 2019 16:45:55 +0100 |
User-agent: |
Mutt/1.11.2+89 (4e6744dc) vl-114617 (2019-01-18) |
The current AC_FUNC_ALLOCA description is:
-- Macro: AC_FUNC_ALLOCA
Check how to get 'alloca'. Tries to get a builtin version by
checking for 'alloca.h' or the predefined C preprocessor macros
'__GNUC__' and '_AIX'. If this macro finds 'alloca.h', it defines
'HAVE_ALLOCA_H'.
If those attempts fail, it looks for the function in the standard C
library. If any of those methods succeed, it defines
'HAVE_ALLOCA'. Otherwise, it sets the output variable 'ALLOCA' to
'${LIBOBJDIR}alloca.o' and defines 'C_ALLOCA' (so programs can
periodically call 'alloca (0)' to garbage collect). This variable
is separate from 'LIBOBJS' so multiple programs can share the value
of 'ALLOCA' without needing to create an actual library, in case
only some of them use the code in 'LIBOBJS'. The '${LIBOBJDIR}'
prefix serves the same purpose as in 'LIBOBJS' (*note AC_LIBOBJ vs
LIBOBJS::).
This macro does not try to get 'alloca' from the System V R3
'libPW' or the System V R4 'libucb' because those libraries contain
some incompatible functions that cause trouble. Some versions do
not even contain 'alloca' or contain a buggy version. If you still
want to use their 'alloca', use 'ar' to extract 'alloca.o' from
them instead of compiling 'alloca.c'.
Source files that use 'alloca' should start with a piece of code
like the following, to declare it properly.
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
# include <stdlib.h>
# endif
#endif
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
#elif !defined alloca
# ifdef __GNUC__
# define alloca __builtin_alloca
# elif defined _AIX
# define alloca __alloca
# elif defined _MSC_VER
# include <malloc.h>
# define alloca _alloca
# elif !defined HAVE_ALLOCA
# ifdef __cplusplus
extern "C"
# endif
void *alloca (size_t);
# endif
#endif
The conditions under which 'HAVE_ALLOCA' is defined are not clear.
In particular, the line
# elif !defined HAVE_ALLOCA
seems surprising. I would have thought that it should have been
# elif defined HAVE_ALLOCA
(i.e. the function exists, but <alloca.h> is not there to declare
it, so that the code needs to do the declaration). If alloca() is
completely missing, one should not use it, so that declaring it
may not be a good idea. If this is for the case where the user
compiles alloca.c, then this should be handled in a separate case.
--
Vincent Lefèvre <address@hidden> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- AC_FUNC_ALLOCA description is not clear, potentially wrong,
Vincent Lefevre <=