aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2001-09-17 18:48:45 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2001-09-17 18:48:45 +0000
commitc1d49704bcc084245adffb45a22d43a841665515 (patch)
treed0168824c3517b671ef6a4c4bbf09f335edd2800
parent14baae01f63af3ef58bf9a0923a92d0de7098891 (diff)
downloadgcc-c1d49704bcc084245adffb45a22d43a841665515.zip
gcc-c1d49704bcc084245adffb45a22d43a841665515.tar.gz
gcc-c1d49704bcc084245adffb45a22d43a841665515.tar.bz2
libiberty.h (ASTRDUP): New macro.
include: * libiberty.h (ASTRDUP): New macro. libiberty_optr, libiberty_nptr, libiberty_len): Declare. libiberty: * alloca.c (libiberty_optr, libiberty_nptr, libiberty_len): Define. gcc: * c-aux-info.c (affix_data_type): Use ASTRDUP in lieu of alloca/strcpy. From-SVN: r45657
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-aux-info.c4
-rw-r--r--include/ChangeLog5
-rw-r--r--include/libiberty.h13
-rw-r--r--libiberty/ChangeLog5
-rw-r--r--libiberty/alloca.c6
6 files changed, 35 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8b0fe94..554b252 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * c-aux-info.c (affix_data_type): Use ASTRDUP in lieu of
+ alloca/strcpy.
+
2001-09-17 Neil Booth <neil@daikokuya.demon.co.uk>
* cpphash.h (_cpp_lex_direct): New.
diff --git a/gcc/c-aux-info.c b/gcc/c-aux-info.c
index ee9c516..c9daa1d 100644
--- a/gcc/c-aux-info.c
+++ b/gcc/c-aux-info.c
@@ -64,13 +64,11 @@ static char *
affix_data_type (param)
const char *param;
{
- char *type_or_decl = (char *) alloca (strlen (param) + 1);
+ char *const type_or_decl = ASTRDUP (param);
char *p = type_or_decl;
char *qualifiers_then_data_type;
char saved;
- strcpy (type_or_decl, param);
-
/* Skip as many leading const's or volatile's as there are. */
for (;;)
diff --git a/include/ChangeLog b/include/ChangeLog
index 81d2cc2..d745a28 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * libiberty.h (ASTRDUP): New macro.
+ libiberty_optr, libiberty_nptr, libiberty_len): Declare.
+
2001-08-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* ansidecl.h: Update comments reflecting previous change.
diff --git a/include/libiberty.h b/include/libiberty.h
index 8d46e37..7220ec0 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -246,12 +246,25 @@ extern PTR C_alloca PARAMS((size_t));
#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA
# define alloca(x) __builtin_alloca(x)
# undef C_ALLOCA
+# define ASTRDUP(X) \
+ (__extension__ ({ const char *const libiberty_optr = (X); \
+ const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \
+ char *const libiberty_nptr = alloca (libiberty_len); \
+ (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); }))
#else
# define alloca(x) C_alloca(x)
# undef USE_C_ALLOCA
# define USE_C_ALLOCA 1
# undef C_ALLOCA
# define C_ALLOCA 1
+extern const char *libiberty_optr;
+extern char *libiberty_nptr;
+extern unsigned long libiberty_len;
+# define ASTRDUP(X) \
+ (libiberty_optr = (X), \
+ libiberty_len = strlen (libiberty_optr) + 1, \
+ libiberty_nptr = alloca (libiberty_len), \
+ (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len))
#endif
#ifdef __cplusplus
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index afeeaaf..970dc98 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * alloca.c (libiberty_optr, libiberty_nptr, libiberty_len):
+ Define.
+
2001-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* asprintf.c: Don't define USE_STDARG. Use VPARAMS, VA_OPEN,
diff --git a/libiberty/alloca.c b/libiberty/alloca.c
index bf105d8..822c1dc 100644
--- a/libiberty/alloca.c
+++ b/libiberty/alloca.c
@@ -34,6 +34,12 @@
#include <stdlib.h>
#endif
+/* These variables are used by the ASTRDUP implementation that relies
+ on C_alloca. */
+const char *libiberty_optr;
+char *libiberty_nptr;
+unsigned long libiberty_len;
+
/* If your stack is a linked list of frames, you have to
provide an "address metric" ADDRESS_FUNCTION macro. */