This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC 2/2] Move gdb's xmalloc and friends to new file
- From: Alan Hayward <Alan dot Hayward at arm dot com>
- To: Tom Tromey <tom at tromey dot com>
- Cc: "gdb-patches\\@sourceware.org" <gdb-patches at sourceware dot org>, nd <nd at arm dot com>
- Date: Mon, 17 Jun 2019 15:44:58 +0000
- Subject: Re: [RFC 2/2] Move gdb's xmalloc and friends to new file
- References: <20190530213046.20542-1-tom@tromey.com> <20190530213046.20542-3-tom@tromey.com>
Tom,
Looks like this breaks the building of alloc-ipa.o when using Make 3.81
I’ve tried this on a few different machines.
g++ -x c++ -g -O2 -I. -I../../../src/binutils-gdb/gdb/gdbserver -I../../../src/binutils-gdb/gdb/gdbserver/../regformats -I../../../src/binutils-gdb/gdb/gdbserver/.. -I../../../src/binutils-gdb/gdb/gdbserver/../../include -I../../../src/binutils-gdb/gdb/gdbserver/../../gnulib/import -Ibuild-gnulib-gdbserver/import -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wformat -Wformat-nonliteral -Werror -DGDBSERVER -DCONFIG_UST_GDB_INTEGRATION -Drpl_strerror=strerror -fPIC -DIN_PROCESS_AGENT -fvisibility=hidden -c -o alloc-ipa.o -MT alloc-ipa.o -MMD -MP -MF ./.deps/alloc-ipa.Tpo `echo " -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wformat -Wformat-nonliteral " | sed "s/ -Wformat-nonliteral / -Wno-format-nonliteral /g"`
g++: warning: ‘-x c++’ after last input file has no effect
g++: fatal error: no input files
compilation terminated.
make-3.81[4]: *** [alloc-ipa.o] Error 1
make-3.81[4]: *** Waiting for unfinished jobs....
Something has stripped the "../../../src/binutils-gdb/gdb/gdbserver/../alloc.c” from the build line.
Bizarrely, if you then run make a second time, everything works:
g++ -x c++ -g -O2 -I. -I../../../src/binutils-gdb/gdb/gdbserver -I../../../src/binutils-gdb/gdb/gdbserver/../regformats -I../../../src/binutils-gdb/gdb/gdbserver/.. -I../../../src/binutils-gdb/gdb/gdbserver/../../include -I../../../src/binutils-gdb/gdb/gdbserver/../../gnulib/import -Ibuild-gnulib-gdbserver/import -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wformat -Wformat-nonliteral -Werror -DGDBSERVER -DCONFIG_UST_GDB_INTEGRATION -Drpl_strerror=strerror -fPIC -DIN_PROCESS_AGENT -fvisibility=hidden -c -o alloc-ipa.o -MT alloc-ipa.o -MMD -MP -MF ./.deps/alloc-ipa.Tpo `echo " -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wformat -Wformat-nonliteral " | sed "s/ -Wformat-nonliteral / -Wno-format-nonliteral /g"` ../../../src/binutils-gdb/gdb/gdbserver/../alloc.c
Reverting your change fixes the issue.
I’ve no idea what’s causing it, and am assuming it’s a weird make bug.
I remember having a 3.81 issue around the same area:
a543c5ca7c1285548726e6d92ca6044dc1963340.
(Personally, I’ve no attachment to 3.81, and usually use 4.x.)
Alan.
> On 30 May 2019, at 22:30, Tom Tromey <tom@tromey.com> wrote:
>
> When "common" becomes a library, linking will cause a symbol clash,
> because "xmalloc" and some related symbols are defined in that
> library, libiberty, and readline.
>
> To work around this problem, this patch moves the clashing symbols to
> a new file, which is then compiled separately for both gdb and
> gdbserver.
>
> gdb/ChangeLog
> 2019-05-30 Tom Tromey <tom@tromey.com>
>
> * common/common-utils.c (xmalloc, xrealloc, xcalloc)
> (xmalloc_failed): Move to alloc.c.
> * alloc.c: New file.
> * Makefile.in (COMMON_SFILES): Add alloc.c.
>
> gdb/gdbserver/ChangeLog
> 2019-05-30 Tom Tromey <tom@tromey.com>
>
> * Makefile.in (SFILES): Add alloc.c.
> (OBS): Add alloc.o.
> (IPA_OBJS): Add alloc-ipa.o.
> (alloc-ipa.o): New target.
> (%.o: ../%.c): New pattern rule.
> ---
> gdb/ChangeLog | 7 +++
> gdb/Makefile.in | 1 +
> gdb/alloc.c | 95 +++++++++++++++++++++++++++++++++++++++
> gdb/common/common-utils.c | 72 -----------------------------
> gdb/gdbserver/ChangeLog | 8 ++++
> gdb/gdbserver/Makefile.in | 11 +++++
> 6 files changed, 122 insertions(+), 72 deletions(-)
> create mode 100644 gdb/alloc.c
>
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 0f495783600..15ec7a61b1c 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -924,6 +924,7 @@ COMMON_SFILES = \
> ada-varobj.c \
> addrmap.c \
> agent.c \
> + alloc.c \
> annotate.c \
> arch-utils.c \
> auto-load.c \
> diff --git a/gdb/alloc.c b/gdb/alloc.c
> new file mode 100644
> index 00000000000..e6c9c215435
> --- /dev/null
> +++ b/gdb/alloc.c
> @@ -0,0 +1,95 @@
> +/* Shared allocation functions for GDB, the GNU debugger.
> +
> + Copyright (C) 2019 Free Software Foundation, Inc.
> +
> + This file is part of GDB.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program 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 General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#include "common/common-defs.h"
> +#include "libiberty.h"
> +#include <cstdlib>
> +#include "common/errors.h"
> +
> +/* The xmalloc() (libiberty.h) family of memory management routines.
> +
> + These are like the ISO-C malloc() family except that they implement
> + consistent semantics and guard against typical memory management
> + problems. */
> +
> +/* NOTE: These are declared using PTR to ensure consistency with
> + "libiberty.h". xfree() is GDB local. */
> +
> +PTR /* ARI: PTR */
> +xmalloc (size_t size)
> +{
> + void *val;
> +
> + /* See libiberty/xmalloc.c. This function need's to match that's
> + semantics. It never returns NULL. */
> + if (size == 0)
> + size = 1;
> +
> + val = malloc (size); /* ARI: malloc */
> + if (val == NULL)
> + malloc_failure (size);
> +
> + return val;
> +}
> +
> +PTR /* ARI: PTR */
> +xrealloc (PTR ptr, size_t size) /* ARI: PTR */
> +{
> + void *val;
> +
> + /* See libiberty/xmalloc.c. This function need's to match that's
> + semantics. It never returns NULL. */
> + if (size == 0)
> + size = 1;
> +
> + if (ptr != NULL)
> + val = realloc (ptr, size); /* ARI: realloc */
> + else
> + val = malloc (size); /* ARI: malloc */
> + if (val == NULL)
> + malloc_failure (size);
> +
> + return val;
> +}
> +
> +PTR /* ARI: PTR */
> +xcalloc (size_t number, size_t size)
> +{
> + void *mem;
> +
> + /* See libiberty/xmalloc.c. This function need's to match that's
> + semantics. It never returns NULL. */
> + if (number == 0 || size == 0)
> + {
> + number = 1;
> + size = 1;
> + }
> +
> + mem = calloc (number, size); /* ARI: xcalloc */
> + if (mem == NULL)
> + malloc_failure (number * size);
> +
> + return mem;
> +}
> +
> +void
> +xmalloc_failed (size_t size)
> +{
> + malloc_failure (size);
> +}
> diff --git a/gdb/common/common-utils.c b/gdb/common/common-utils.c
> index 74ca93810c7..dd839a0d4d1 100644
> --- a/gdb/common/common-utils.c
> +++ b/gdb/common/common-utils.c
> @@ -22,84 +22,12 @@
> #include "host-defs.h"
> #include <ctype.h>
>
> -/* The xmalloc() (libiberty.h) family of memory management routines.
> -
> - These are like the ISO-C malloc() family except that they implement
> - consistent semantics and guard against typical memory management
> - problems. */
> -
> -/* NOTE: These are declared using PTR to ensure consistency with
> - "libiberty.h". xfree() is GDB local. */
> -
> -PTR /* ARI: PTR */
> -xmalloc (size_t size)
> -{
> - void *val;
> -
> - /* See libiberty/xmalloc.c. This function need's to match that's
> - semantics. It never returns NULL. */
> - if (size == 0)
> - size = 1;
> -
> - val = malloc (size); /* ARI: malloc */
> - if (val == NULL)
> - malloc_failure (size);
> -
> - return val;
> -}
> -
> -PTR /* ARI: PTR */
> -xrealloc (PTR ptr, size_t size) /* ARI: PTR */
> -{
> - void *val;
> -
> - /* See libiberty/xmalloc.c. This function need's to match that's
> - semantics. It never returns NULL. */
> - if (size == 0)
> - size = 1;
> -
> - if (ptr != NULL)
> - val = realloc (ptr, size); /* ARI: realloc */
> - else
> - val = malloc (size); /* ARI: malloc */
> - if (val == NULL)
> - malloc_failure (size);
> -
> - return val;
> -}
> -
> -PTR /* ARI: PTR */
> -xcalloc (size_t number, size_t size)
> -{
> - void *mem;
> -
> - /* See libiberty/xmalloc.c. This function need's to match that's
> - semantics. It never returns NULL. */
> - if (number == 0 || size == 0)
> - {
> - number = 1;
> - size = 1;
> - }
> -
> - mem = calloc (number, size); /* ARI: xcalloc */
> - if (mem == NULL)
> - malloc_failure (number * size);
> -
> - return mem;
> -}
> -
> void *
> xzalloc (size_t size)
> {
> return xcalloc (1, size);
> }
>
> -void
> -xmalloc_failed (size_t size)
> -{
> - malloc_failure (size);
> -}
> -
> /* Like asprintf/vasprintf but get an internal_error if the call
> fails. */
>
> diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
> index f5fc55034ee..a0793e657c5 100644
> --- a/gdb/gdbserver/Makefile.in
> +++ b/gdb/gdbserver/Makefile.in
> @@ -197,6 +197,7 @@ SFILES = \
> $(srcdir)/arch/arm-get-next-pcs.c \
> $(srcdir)/arch/arm-linux.c \
> $(srcdir)/arch/ppc-linux-common.c \
> + $(srcdir)/../alloc.c \
> $(srcdir)/common/btrace-common.c \
> $(srcdir)/common/buffer.c \
> $(srcdir)/common/cleanups.c \
> @@ -238,6 +239,7 @@ SOURCES = $(SFILES)
> TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
>
> OBS = \
> + alloc.o \
> ax.o \
> common/agent.o \
> common/btrace-common.o \
> @@ -413,6 +415,7 @@ gdbreplay$(EXEEXT): $(sort $(GDBREPLAY_OBS)) $(LIBGNU) $(LIBIBERTY)
> $(LIBIBERTY)
>
> IPA_OBJS = \
> + alloc-ipa.o \
> ax-ipa.o \
> common/common-utils-ipa.o \
> common/errors-ipa.o \
> @@ -568,6 +571,10 @@ ax.o: ax.c
> $(COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
> $(POSTCOMPILE)
>
> +alloc-ipa.o: ../alloc.c
> + $(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
> + $(POSTCOMPILE)
> +
> # Rules for objects that go in the in-process agent.
>
> arch/%-ipa.o: ../arch/%.c
> @@ -623,6 +630,10 @@ common/%.o: ../common/%.c
> $(COMPILE) $<
> $(POSTCOMPILE)
>
> +%.o: ../%.c
> + $(COMPILE) $<
> + $(POSTCOMPILE)
> +
> # Rules for register format descriptions. Suffix destination files with
> # -generated to identify and clean them easily.
>
> --
> 2.17.2
>