1 /* Memory allocation on the stack. 2 3 Copyright (C) 1995, 1999, 2001-2004, 2006-2023 Free Software Foundation, 4 Inc. 5 6 This file is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as 8 published by the Free Software Foundation; either version 2.1 of the 9 License, or (at your option) any later version. 10 11 This file is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License 17 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 18 19 /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H 20 means there is a real alloca function. */ 21 #ifndef _GL_ALLOCA_H 22 #define _GL_ALLOCA_H 23 24 /* alloca (N) returns a pointer to N bytes of memory 25 allocated on the stack, which will last until the function returns. 26 Use of alloca should be avoided: 27 - inside arguments of function calls - undefined behaviour, 28 - in inline functions - the allocation may actually last until the 29 calling function returns, 30 - for huge N (say, N >= 65536) - you never know how large (or small) 31 the stack is, and when the stack cannot fulfill the memory allocation 32 request, the program just crashes. 33 */ 34 35 #ifndef alloca 36 /* Some version of mingw have an <alloca.h> that causes trouble when 37 included after 'alloca' gets defined as a macro. As a workaround, 38 include this <alloca.h> first and define 'alloca' as a macro afterwards 39 if needed. */ 40 # if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@ 41 # include_next <alloca.h> 42 # endif 43 #endif 44 #ifndef alloca 45 # if defined __GNUC__ || (__clang_major__ >= 4) 46 # define alloca __builtin_alloca 47 # elif defined _AIX 48 # define alloca __alloca 49 # elif defined _MSC_VER 50 # include <malloc.h> 51 # define alloca _alloca 52 # elif defined __DECC && defined __VMS 53 # define alloca __ALLOCA 54 # elif defined __TANDEM && defined _TNS_E_TARGET 55 # ifdef __cplusplus 56 extern "C" 57 # endif 58 void *_alloca (unsigned short); 59 # pragma intrinsic (_alloca) 60 # define alloca _alloca 61 # elif defined __MVS__ 62 # include <stdlib.h> 63 # else 64 # include <stddef.h> 65 # ifdef __cplusplus 66 extern "C" 67 # endif 68 void *alloca (size_t); 69 # endif 70 #endif 71 72 #endif /* _GL_ALLOCA_H */