[PATCH, libiberty, gcc]: Introduce xasprintf to libiberty and use it in gengtype

Uros Bizjak ubizjak@gmail.com
Wed Dec 24 10:33:00 GMT 2014


Hello!

Based on a suggestion from [1] and on previous work by Manuel and Ben.
The new code is almost the same as existing asprintf.c, but uses
recently added xvasprintf.

Thes patch removes local xasprintf definition from gengtype.c and uses
the new one there.

libiberty/ChangeLog:

2014-12-24  Uros Bizjak  <ubizjak@gmail.com>
        Ben Elliston  <bje@au.ibm.com>
        Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

    * xasprintf.c: New file.
    * Makefile.in (CFILES): Add xasprintf.c.
    (REQUIRED_OFILES): Add xasprintf.$(objext).
    (xasprintf.$(objext)): New target.
    * functions.texi: Regenerate.

include/ChangeLog:

2014-12-24  Uros Bizjak  <ubizjak@gmail.com>
        Ben Elliston  <bje@au.ibm.com>
        Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

    * libiberty.h (xasprintf): Declare.

gcc/ChangeLog:

2014-12-24  Uros Bizjak  <ubizjak@gmail.com>

    * gengtype.h (xasprintf): Remove declaration.
    * gengtype.c (xasprintf): Remove.

Bootstrapped and regression tested on x86_64-linux-gnu.

OK for mainline?

[1] https://gcc.gnu.org/ml/gcc-patches/2014-12/msg00848.html

Uros.
-------------- next part --------------
Index: gcc/gengtype.c
===================================================================
--- gcc/gengtype.c	(revision 219042)
+++ gcc/gengtype.c	(working copy)
@@ -119,23 +119,6 @@ error_at_line (const struct fileloc *pos, const ch
 
   va_end (ap);
 }
-
-/* asprintf, but produces fatal message on out-of-memory.  */
-char *
-xasprintf (const char *format, ...)
-{
-  int n;
-  char *result;
-  va_list ap;
-
-  va_start (ap, format);
-  n = vasprintf (&result, format, ap);
-  if (result == NULL || n < 0)
-    fatal ("out of memory");
-  va_end (ap);
-
-  return result;
-}
 

 /* Locate the ultimate base class of struct S.  */
 
Index: gcc/gengtype.h
===================================================================
--- gcc/gengtype.h	(revision 219042)
+++ gcc/gengtype.h	(working copy)
@@ -418,9 +418,6 @@ void write_state (const char* path);
 extern void error_at_line
 (const struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2;
 
-/* Like asprintf, but calls fatal() on out of memory.  */
-extern char *xasprintf (const char *, ...) ATTRIBUTE_PRINTF_1;
-
 /* Constructor routines for types.  */
 extern void do_typedef (const char *s, type_p t, struct fileloc *pos);
 extern void do_scalar_typedef (const char *s, struct fileloc *pos);
Index: include/libiberty.h
===================================================================
--- include/libiberty.h	(revision 219042)
+++ include/libiberty.h	(working copy)
@@ -629,6 +629,11 @@ extern int pwait (int, int *, int);
 extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
 #endif
 
+/* Like asprintf but allocates memory without fail. This works like
+   xmalloc.  */
+
+extern char *xasprintf (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_PRINTF_1;
+
 #if !HAVE_DECL_VASPRINTF
 /* Like vsprintf but provides a pointer to malloc'd storage, which
    must be freed by the caller.  */
Index: libiberty/Makefile.in
===================================================================
--- libiberty/Makefile.in	(revision 219042)
+++ libiberty/Makefile.in	(working copy)
@@ -158,8 +158,8 @@ CFILES = alloca.c argv.c asprintf.c atexit.c				\
 	vasprintf.c vfork.c vfprintf.c vprintf.c vprintf-support.c	\
 	 vsnprintf.c vsprintf.c						\
 	waitpid.c							\
-	xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c	\
-	 xstrndup.c xvasprintf.c
+	xasprintf.c xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c	\
+	 xstrerror.c xstrndup.c xvasprintf.c
 
 # These are always included in the library.  The first four are listed
 # first and by compile time to optimize parallel builds.
@@ -190,9 +190,10 @@ REQUIRED_OFILES =							\
 	./splay-tree.$(objext) ./stack-limit.$(objext)			\
 	./strerror.$(objext) ./strsignal.$(objext)			\
 	./timeval-utils.$(objext) ./unlink-if-ordinary.$(objext)	\
-	./xatexit.$(objext) ./xexit.$(objext) ./xmalloc.$(objext)	\
-	./xmemdup.$(objext) ./xstrdup.$(objext) ./xstrerror.$(objext)	\
-	./xstrndup.$(objext) ./xvasprintf.$(objext)
+	./xasprintf.$(objext) ./xatexit.$(objext) ./xexit.$(objext)	\
+	./xmalloc.$(objext) ./xmemdup.$(objext) ./xstrdup.$(objext)	\
+	./xstrerror.$(objext) ./xstrndup.$(objext)			\
+	./xvasprintf.$(objext)
 
 # These are all the objects that configure may add to the library via
 # $funcs or EXTRA_OFILES.  This list exists here only for "make
@@ -1618,6 +1619,16 @@ $(CONFIGURED_OFILES): stamp-picdir stamp-noasandir
 	else true; fi
 	$(COMPILE.c) $(srcdir)/waitpid.c $(OUTPUT_OPTION)
 
+./xasprintf.$(objext): $(srcdir)/xasprintf.c config.h $(INCDIR)/ansidecl.h \
+	$(INCDIR)/libiberty.h
+	if [ x"$(PICFLAG)" != x ]; then \
+	  $(COMPILE.c) $(PICFLAG) $(srcdir)/xasprintf.c -o pic/$@; \
+	else true; fi
+	if [ x"$(NOASANFLAG)" != x ]; then \
+	  $(COMPILE.c) $(PICFLAG) $(NOASANFLAG) $(srcdir)/xasprintf.c -o noasan/$@; \
+	else true; fi
+	$(COMPILE.c) $(srcdir)/xasprintf.c $(OUTPUT_OPTION)
+
 ./xatexit.$(objext): $(srcdir)/xatexit.c config.h $(INCDIR)/ansidecl.h \
 	$(INCDIR)/libiberty.h
 	if [ x"$(PICFLAG)" != x ]; then \
Index: libiberty/functions.texi
===================================================================
--- libiberty/functions.texi	(revision 219042)
+++ libiberty/functions.texi	(working copy)
@@ -1923,6 +1923,15 @@ if an error occurred while writing to FILE.
 
 @end deftypefn
 
+@c xasprintf.c:31
+@deftypefn Replacement char* xasprintf (const char *@var{format}, ...)
+
+Print to allocated string without fail.  If @code{xasprintf} fails,
+this will print a message to @code{stderr} (using the name set by
+@code{xmalloc_set_program_name}, if any) and then call @code{xexit}.
+
+@end deftypefn
+
 @c xatexit.c:11
 @deftypefun int xatexit (void (*@var{fn}) (void))
 
Index: libiberty/xasprintf.c
===================================================================
--- libiberty/xasprintf.c	(revision 0)
+++ libiberty/xasprintf.c	(working copy)
@@ -0,0 +1,50 @@
+/* Implement the xasprintf function.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Contributed by Manuel Lopez-Ibanez.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB.  If not, write
+to the Free Software Foundation, Inc., 51 Franklin Street - Fifth
+Floor, Boston, MA 02110-1301, USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "ansidecl.h"
+#include "libiberty.h"
+
+#include <stdarg.h>
+
+/*
+
+@deftypefn Replacement char* xasprintf (const char *@var{format}, ...)
+
+Print to allocated string without fail.  If @code{xasprintf} fails,
+this will print a message to @code{stderr} (using the name set by
+@code{xmalloc_set_program_name}, if any) and then call @code{xexit}.
+
+@end deftypefn
+
+*/
+
+char *
+xasprintf (const char *fmt, ...)
+{
+  char *buf;
+  va_list ap;
+  va_start (ap, fmt);
+  buf = xvasprintf (fmt, ap);
+  va_end (ap);
+  return buf;
+}


More information about the Gcc-patches mailing list