alloca.in.h 2.4 KB

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