merge from gcc

This commit is contained in:
DJ Delorie 2005-03-27 05:28:29 +00:00
parent 255557f8c3
commit c4a2d2f3e1
3 changed files with 90 additions and 86 deletions

View File

@ -1,3 +1,11 @@
2005-03-26 Gabriel Dos Reis <gdr@integrable-solutions.net>
* demangle.h: Remove uses of PARAMS.
* libiberty.h (ANSI_PROTOTYPES): Remove guard since
ANSI_PROTOTYPES is always assumed.
Remove uses of PARAMS throughout.
2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libiberty.h (xstrndup): Declare. * libiberty.h (xstrndup): Declare.

View File

@ -110,31 +110,31 @@ extern const struct demangler_engine
} libiberty_demanglers[]; } libiberty_demanglers[];
extern char * extern char *
cplus_demangle PARAMS ((const char *mangled, int options)); cplus_demangle (const char *mangled, int options);
extern int extern int
cplus_demangle_opname PARAMS ((const char *opname, char *result, int options)); cplus_demangle_opname (const char *opname, char *result, int options);
extern const char * extern const char *
cplus_mangle_opname PARAMS ((const char *opname, int options)); cplus_mangle_opname (const char *opname, int options);
/* Note: This sets global state. FIXME if you care about multi-threading. */ /* Note: This sets global state. FIXME if you care about multi-threading. */
extern void extern void
set_cplus_marker_for_demangling PARAMS ((int ch)); set_cplus_marker_for_demangling (int ch);
extern enum demangling_styles extern enum demangling_styles
cplus_demangle_set_style PARAMS ((enum demangling_styles style)); cplus_demangle_set_style (enum demangling_styles style);
extern enum demangling_styles extern enum demangling_styles
cplus_demangle_name_to_style PARAMS ((const char *name)); cplus_demangle_name_to_style (const char *name);
/* V3 ABI demangling entry points, defined in cp-demangle.c. */ /* V3 ABI demangling entry points, defined in cp-demangle.c. */
extern char* extern char*
cplus_demangle_v3 PARAMS ((const char* mangled, int options)); cplus_demangle_v3 (const char* mangled, int options);
extern char* extern char*
java_demangle_v3 PARAMS ((const char* mangled)); java_demangle_v3 (const char* mangled);
enum gnu_v3_ctor_kinds { enum gnu_v3_ctor_kinds {
@ -148,7 +148,7 @@ enum gnu_v3_ctor_kinds {
gnu_v3_ctor_kinds' value indicating what kind of constructor gnu_v3_ctor_kinds' value indicating what kind of constructor
it is. */ it is. */
extern enum gnu_v3_ctor_kinds extern enum gnu_v3_ctor_kinds
is_gnu_v3_mangled_ctor PARAMS ((const char *name)); is_gnu_v3_mangled_ctor (const char *name);
enum gnu_v3_dtor_kinds { enum gnu_v3_dtor_kinds {
@ -162,7 +162,7 @@ enum gnu_v3_dtor_kinds {
gnu_v3_dtor_kinds' value, indicating what kind of destructor gnu_v3_dtor_kinds' value, indicating what kind of destructor
it is. */ it is. */
extern enum gnu_v3_dtor_kinds extern enum gnu_v3_dtor_kinds
is_gnu_v3_mangled_dtor PARAMS ((const char *name)); is_gnu_v3_mangled_dtor (const char *name);
/* The V3 demangler works in two passes. The first pass builds a tree /* The V3 demangler works in two passes. The first pass builds a tree
representation of the mangled name, and the second pass turns the representation of the mangled name, and the second pass turns the
@ -440,25 +440,25 @@ struct demangle_component
unrecognized or inappropriate component type. */ unrecognized or inappropriate component type. */
extern int extern int
cplus_demangle_fill_component PARAMS ((struct demangle_component *fill, cplus_demangle_fill_component (struct demangle_component *fill,
enum demangle_component_type, enum demangle_component_type,
struct demangle_component *left, struct demangle_component *left,
struct demangle_component *right)); struct demangle_component *right);
/* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success, /* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success,
zero for bad arguments. */ zero for bad arguments. */
extern int extern int
cplus_demangle_fill_name PARAMS ((struct demangle_component *fill, cplus_demangle_fill_name (struct demangle_component *fill,
const char *, int)); const char *, int);
/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the /* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the
builtin type (e.g., "int", etc.). Returns non-zero on success, builtin type (e.g., "int", etc.). Returns non-zero on success,
zero if the type is not recognized. */ zero if the type is not recognized. */
extern int extern int
cplus_demangle_fill_builtin_type PARAMS ((struct demangle_component *fill, cplus_demangle_fill_builtin_type (struct demangle_component *fill,
const char *type_name)); const char *type_name);
/* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the /* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the
operator and the number of arguments which it takes (the latter is operator and the number of arguments which it takes (the latter is
@ -467,33 +467,33 @@ cplus_demangle_fill_builtin_type PARAMS ((struct demangle_component *fill,
not recognized. */ not recognized. */
extern int extern int
cplus_demangle_fill_operator PARAMS ((struct demangle_component *fill, cplus_demangle_fill_operator (struct demangle_component *fill,
const char *opname, int args)); const char *opname, int args);
/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the
number of arguments and the name. Returns non-zero on success, number of arguments and the name. Returns non-zero on success,
zero for bad arguments. */ zero for bad arguments. */
extern int extern int
cplus_demangle_fill_extended_operator PARAMS ((struct demangle_component *fill, cplus_demangle_fill_extended_operator (struct demangle_component *fill,
int numargs, int numargs,
struct demangle_component *nm)); struct demangle_component *nm);
/* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success, /* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success,
zero for bad arguments. */ zero for bad arguments. */
extern int extern int
cplus_demangle_fill_ctor PARAMS ((struct demangle_component *fill, cplus_demangle_fill_ctor (struct demangle_component *fill,
enum gnu_v3_ctor_kinds kind, enum gnu_v3_ctor_kinds kind,
struct demangle_component *name)); struct demangle_component *name);
/* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success, /* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success,
zero for bad arguments. */ zero for bad arguments. */
extern int extern int
cplus_demangle_fill_dtor PARAMS ((struct demangle_component *fill, cplus_demangle_fill_dtor (struct demangle_component *fill,
enum gnu_v3_dtor_kinds kind, enum gnu_v3_dtor_kinds kind,
struct demangle_component *name)); struct demangle_component *name);
/* This function translates a mangled name into a struct /* This function translates a mangled name into a struct
demangle_component tree. The first argument is the mangled name. demangle_component tree. The first argument is the mangled name.
@ -504,9 +504,7 @@ cplus_demangle_fill_dtor PARAMS ((struct demangle_component *fill,
needed. */ needed. */
extern struct demangle_component * extern struct demangle_component *
cplus_demangle_v3_components PARAMS ((const char *mangled, cplus_demangle_v3_components (const char *mangled, int options, void **mem);
int options,
void **mem));
/* This function takes a struct demangle_component tree and returns /* This function takes a struct demangle_component tree and returns
the corresponding demangled string. The first argument is DMGL_* the corresponding demangled string. The first argument is DMGL_*
@ -521,10 +519,10 @@ cplus_demangle_v3_components PARAMS ((const char *mangled,
memory allocation error. */ memory allocation error. */
extern char * extern char *
cplus_demangle_print PARAMS ((int options, cplus_demangle_print (int options,
const struct demangle_component *tree, const struct demangle_component *tree,
int estimated_length, int estimated_length,
size_t *p_allocated_size)); size_t *p_allocated_size);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -41,26 +41,24 @@ extern "C" {
#include "ansidecl.h" #include "ansidecl.h"
#ifdef ANSI_PROTOTYPES
/* Get a definition for size_t. */ /* Get a definition for size_t. */
#include <stddef.h> #include <stddef.h>
/* Get a definition for va_list. */ /* Get a definition for va_list. */
#include <stdarg.h> #include <stdarg.h>
#endif
/* Build an argument vector from a string. Allocates memory using /* Build an argument vector from a string. Allocates memory using
malloc. Use freeargv to free the vector. */ malloc. Use freeargv to free the vector. */
extern char **buildargv PARAMS ((const char *)) ATTRIBUTE_MALLOC; extern char **buildargv (const char *) ATTRIBUTE_MALLOC;
/* Free a vector returned by buildargv. */ /* Free a vector returned by buildargv. */
extern void freeargv PARAMS ((char **)); extern void freeargv (char **);
/* Duplicate an argument vector. Allocates memory using malloc. Use /* Duplicate an argument vector. Allocates memory using malloc. Use
freeargv to free the vector. */ freeargv to free the vector. */
extern char **dupargv PARAMS ((char **)) ATTRIBUTE_MALLOC; extern char **dupargv (char **) ATTRIBUTE_MALLOC;
/* Return the last component of a path name. Note that we can't use a /* Return the last component of a path name. Note that we can't use a
@ -75,7 +73,7 @@ extern char **dupargv PARAMS ((char **)) ATTRIBUTE_MALLOC;
is 1, we found it so don't provide any declaration at all. */ is 1, we found it so don't provide any declaration at all. */
#if !HAVE_DECL_BASENAME #if !HAVE_DECL_BASENAME
#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME) #if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME)
extern char *basename PARAMS ((const char *)); extern char *basename (const char *);
#else #else
extern char *basename (); extern char *basename ();
#endif #endif
@ -83,17 +81,17 @@ extern char *basename ();
/* A well-defined basename () that is always compiled in. */ /* A well-defined basename () that is always compiled in. */
extern const char *lbasename PARAMS ((const char *)); extern const char *lbasename (const char *);
/* A well-defined realpath () that is always compiled in. */ /* A well-defined realpath () that is always compiled in. */
extern char *lrealpath PARAMS ((const char *)); extern char *lrealpath (const char *);
/* Concatenate an arbitrary number of strings. You must pass NULL as /* Concatenate an arbitrary number of strings. You must pass NULL as
the last argument of this function, to terminate the list of the last argument of this function, to terminate the list of
strings. Allocates memory using xmalloc. */ strings. Allocates memory using xmalloc. */
extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL;
/* Concatenate an arbitrary number of strings. You must pass NULL as /* Concatenate an arbitrary number of strings. You must pass NULL as
the last argument of this function, to terminate the list of the last argument of this function, to terminate the list of
@ -102,27 +100,27 @@ extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC ATTRIBUTE_SENT
pointer to be freed after the new string is created, similar to the pointer to be freed after the new string is created, similar to the
way xrealloc works. */ way xrealloc works. */
extern char *reconcat PARAMS ((char *, const char *, ...)) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL;
/* Determine the length of concatenating an arbitrary number of /* Determine the length of concatenating an arbitrary number of
strings. You must pass NULL as the last argument of this function, strings. You must pass NULL as the last argument of this function,
to terminate the list of strings. */ to terminate the list of strings. */
extern unsigned long concat_length PARAMS ((const char *, ...)) ATTRIBUTE_SENTINEL; extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL;
/* Concatenate an arbitrary number of strings into a SUPPLIED area of /* Concatenate an arbitrary number of strings into a SUPPLIED area of
memory. You must pass NULL as the last argument of this function, memory. You must pass NULL as the last argument of this function,
to terminate the list of strings. The supplied memory is assumed to terminate the list of strings. The supplied memory is assumed
to be large enough. */ to be large enough. */
extern char *concat_copy PARAMS ((char *, const char *, ...)) ATTRIBUTE_SENTINEL; extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_SENTINEL;
/* Concatenate an arbitrary number of strings into a GLOBAL area of /* Concatenate an arbitrary number of strings into a GLOBAL area of
memory. You must pass NULL as the last argument of this function, memory. You must pass NULL as the last argument of this function,
to terminate the list of strings. The supplied memory is assumed to terminate the list of strings. The supplied memory is assumed
to be large enough. */ to be large enough. */
extern char *concat_copy2 PARAMS ((const char *, ...)) ATTRIBUTE_SENTINEL; extern char *concat_copy2 (const char *, ...) ATTRIBUTE_SENTINEL;
/* This is the global area used by concat_copy2. */ /* This is the global area used by concat_copy2. */
@ -138,12 +136,12 @@ extern char *libiberty_concat_ptr;
/* Check whether two file descriptors refer to the same file. */ /* Check whether two file descriptors refer to the same file. */
extern int fdmatch PARAMS ((int fd1, int fd2)); extern int fdmatch (int fd1, int fd2);
/* Get the working directory. The result is cached, so don't call /* Get the working directory. The result is cached, so don't call
chdir() between calls to getpwd(). */ chdir() between calls to getpwd(). */
extern char * getpwd PARAMS ((void)); extern char * getpwd (void);
/* Get the current time. */ /* Get the current time. */
/* Prototypes vary from system to system, so we only provide a /* Prototypes vary from system to system, so we only provide a
@ -151,121 +149,121 @@ extern char * getpwd PARAMS ((void));
#ifdef __MINGW32__ #ifdef __MINGW32__
/* Forward declaration to avoid #include <sys/time.h>. */ /* Forward declaration to avoid #include <sys/time.h>. */
struct timeval; struct timeval;
extern int gettimeofday PARAMS ((struct timeval *, void *)); extern int gettimeofday (struct timeval *, void *);
#endif #endif
/* Get the amount of time the process has run, in microseconds. */ /* Get the amount of time the process has run, in microseconds. */
extern long get_run_time PARAMS ((void)); extern long get_run_time (void);
/* Generate a relocated path to some installation directory. Allocates /* Generate a relocated path to some installation directory. Allocates
return value using malloc. */ return value using malloc. */
extern char *make_relative_prefix PARAMS ((const char *, const char *, extern char *make_relative_prefix (const char *, const char *,
const char *)) ATTRIBUTE_MALLOC; const char *) ATTRIBUTE_MALLOC;
/* Choose a temporary directory to use for scratch files. */ /* Choose a temporary directory to use for scratch files. */
extern char *choose_temp_base PARAMS ((void)) ATTRIBUTE_MALLOC; extern char *choose_temp_base (void) ATTRIBUTE_MALLOC;
/* Return a temporary file name or NULL if unable to create one. */ /* Return a temporary file name or NULL if unable to create one. */
extern char *make_temp_file PARAMS ((const char *)) ATTRIBUTE_MALLOC; extern char *make_temp_file (const char *) ATTRIBUTE_MALLOC;
/* Remove a link to a file unless it is special. */ /* Remove a link to a file unless it is special. */
extern int unlink_if_ordinary PARAMS((const char *)); extern int unlink_if_ordinary (const char *);
/* Allocate memory filled with spaces. Allocates using malloc. */ /* Allocate memory filled with spaces. Allocates using malloc. */
extern const char *spaces PARAMS ((int count)); extern const char *spaces (int count);
/* Return the maximum error number for which strerror will return a /* Return the maximum error number for which strerror will return a
string. */ string. */
extern int errno_max PARAMS ((void)); extern int errno_max (void);
/* Return the name of an errno value (e.g., strerrno (EINVAL) returns /* Return the name of an errno value (e.g., strerrno (EINVAL) returns
"EINVAL"). */ "EINVAL"). */
extern const char *strerrno PARAMS ((int)); extern const char *strerrno (int);
/* Given the name of an errno value, return the value. */ /* Given the name of an errno value, return the value. */
extern int strtoerrno PARAMS ((const char *)); extern int strtoerrno (const char *);
/* ANSI's strerror(), but more robust. */ /* ANSI's strerror(), but more robust. */
extern char *xstrerror PARAMS ((int)); extern char *xstrerror (int);
/* Return the maximum signal number for which strsignal will return a /* Return the maximum signal number for which strsignal will return a
string. */ string. */
extern int signo_max PARAMS ((void)); extern int signo_max (void);
/* Return a signal message string for a signal number /* Return a signal message string for a signal number
(e.g., strsignal (SIGHUP) returns something like "Hangup"). */ (e.g., strsignal (SIGHUP) returns something like "Hangup"). */
/* This is commented out as it can conflict with one in system headers. /* This is commented out as it can conflict with one in system headers.
We still document its existence though. */ We still document its existence though. */
/*extern const char *strsignal PARAMS ((int));*/ /*extern const char *strsignal (int);*/
/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns /* Return the name of a signal number (e.g., strsigno (SIGHUP) returns
"SIGHUP"). */ "SIGHUP"). */
extern const char *strsigno PARAMS ((int)); extern const char *strsigno (int);
/* Given the name of a signal, return its number. */ /* Given the name of a signal, return its number. */
extern int strtosigno PARAMS ((const char *)); extern int strtosigno (const char *);
/* Register a function to be run by xexit. Returns 0 on success. */ /* Register a function to be run by xexit. Returns 0 on success. */
extern int xatexit PARAMS ((void (*fn) (void))); extern int xatexit (void (*fn) (void));
/* Exit, calling all the functions registered with xatexit. */ /* Exit, calling all the functions registered with xatexit. */
extern void xexit PARAMS ((int status)) ATTRIBUTE_NORETURN; extern void xexit (int status) ATTRIBUTE_NORETURN;
/* Set the program name used by xmalloc. */ /* Set the program name used by xmalloc. */
extern void xmalloc_set_program_name PARAMS ((const char *)); extern void xmalloc_set_program_name (const char *);
/* Report an allocation failure. */ /* Report an allocation failure. */
extern void xmalloc_failed PARAMS ((size_t)) ATTRIBUTE_NORETURN; extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN;
/* Allocate memory without fail. If malloc fails, this will print a /* Allocate memory without fail. If malloc fails, this will print a
message to stderr (using the name set by xmalloc_set_program_name, message to stderr (using the name set by xmalloc_set_program_name,
if any) and then call xexit. */ if any) and then call xexit. */
extern PTR xmalloc PARAMS ((size_t)) ATTRIBUTE_MALLOC; extern PTR xmalloc (size_t) ATTRIBUTE_MALLOC;
/* Reallocate memory without fail. This works like xmalloc. Note, /* Reallocate memory without fail. This works like xmalloc. Note,
realloc type functions are not suitable for attribute malloc since realloc type functions are not suitable for attribute malloc since
they may return the same address across multiple calls. */ they may return the same address across multiple calls. */
extern PTR xrealloc PARAMS ((PTR, size_t)); extern PTR xrealloc (PTR, size_t);
/* Allocate memory without fail and set it to zero. This works like /* Allocate memory without fail and set it to zero. This works like
xmalloc. */ xmalloc. */
extern PTR xcalloc PARAMS ((size_t, size_t)) ATTRIBUTE_MALLOC; extern PTR xcalloc (size_t, size_t) ATTRIBUTE_MALLOC;
/* Copy a string into a memory buffer without fail. */ /* Copy a string into a memory buffer without fail. */
extern char *xstrdup PARAMS ((const char *)) ATTRIBUTE_MALLOC; extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
/* Copy at most N characters from string into a buffer without fail. */ /* Copy at most N characters from string into a buffer without fail. */
extern char *xstrndup PARAMS ((const char *, size_t)) ATTRIBUTE_MALLOC; extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC;
/* Copy an existing memory buffer to a new memory buffer without fail. */ /* Copy an existing memory buffer to a new memory buffer without fail. */
extern PTR xmemdup PARAMS ((const PTR, size_t, size_t)) ATTRIBUTE_MALLOC; extern PTR xmemdup (const PTR, size_t, size_t) ATTRIBUTE_MALLOC;
/* Physical memory routines. Return values are in BYTES. */ /* Physical memory routines. Return values are in BYTES. */
extern double physmem_total PARAMS ((void)); extern double physmem_total (void);
extern double physmem_available PARAMS ((void)); extern double physmem_available (void);
/* These macros provide a K&R/C89/C++-friendly way of allocating structures /* These macros provide a K&R/C89/C++-friendly way of allocating structures
@ -303,7 +301,7 @@ extern double physmem_available PARAMS ((void));
#define _hex_array_size 256 #define _hex_array_size 256
#define _hex_bad 99 #define _hex_bad 99
extern const unsigned char _hex_value[_hex_array_size]; extern const unsigned char _hex_value[_hex_array_size];
extern void hex_init PARAMS ((void)); extern void hex_init (void);
#define hex_p(c) (hex_value (c) != _hex_bad) #define hex_p(c) (hex_value (c) != _hex_bad)
/* If you change this, note well: Some code relies on side effects in /* If you change this, note well: Some code relies on side effects in
the argument being performed exactly once. */ the argument being performed exactly once. */
@ -319,25 +317,25 @@ extern void hex_init PARAMS ((void));
/* Execute a program. */ /* Execute a program. */
extern int pexecute PARAMS ((const char *, char * const *, const char *, extern int pexecute (const char *, char * const *, const char *,
const char *, char **, char **, int)); const char *, char **, char **, int);
/* Wait for pexecute to finish. */ /* Wait for pexecute to finish. */
extern int pwait PARAMS ((int, int *, int)); extern int pwait (int, int *, int);
#if !HAVE_DECL_ASPRINTF #if !HAVE_DECL_ASPRINTF
/* Like sprintf but provides a pointer to malloc'd storage, which must /* Like sprintf but provides a pointer to malloc'd storage, which must
be freed by the caller. */ be freed by the caller. */
extern int asprintf PARAMS ((char **, const char *, ...)) ATTRIBUTE_PRINTF_2; extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
#endif #endif
#if !HAVE_DECL_VASPRINTF #if !HAVE_DECL_VASPRINTF
/* Like vsprintf but provides a pointer to malloc'd storage, which /* Like vsprintf but provides a pointer to malloc'd storage, which
must be freed by the caller. */ must be freed by the caller. */
extern int vasprintf PARAMS ((char **, const char *, va_list)) extern int vasprintf (char **, const char *, va_list)
ATTRIBUTE_PRINTF(2,0); ATTRIBUTE_PRINTF(2,0);
#endif #endif
@ -349,7 +347,7 @@ extern int vasprintf PARAMS ((char **, const char *, va_list))
USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is
also set/unset as it is often used to indicate whether code needs also set/unset as it is often used to indicate whether code needs
to call alloca(0). */ to call alloca(0). */
extern PTR C_alloca PARAMS ((size_t)) ATTRIBUTE_MALLOC; extern PTR C_alloca (size_t) ATTRIBUTE_MALLOC;
#undef alloca #undef alloca
#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA #if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA
# define alloca(x) __builtin_alloca(x) # define alloca(x) __builtin_alloca(x)