From 2bb7589ddf61e163f2e414e7033fad56ea17e784 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Mon, 8 Nov 2021 15:17:16 +0000 Subject: [PATCH] gdbsupport: move xfree into its own file In the next commit I'd like to reference gdb_unique_ptr within the common-utils.h file. However, this requires that I include gdb_unique_ptr.h, which requires that xfree be defined. Interestingly, gdb_unique_ptr.h doesn't actually include anything that defines xfree, but I was finding that when I added a gdb_unique_ptr.h include to common-utils.h I was getting a dependency cycle; before my change xfree was defined when gdb_unique_ptr.h was processed, while after my change it was not, and this made g++ unhappy. To break this cycle, I propose to move xfree into its own header file, gdb-xfree.h, which I'll then include into gdb_unique_ptr.h and common-utils.cc. --- gdbsupport/common-utils.cc | 1 + gdbsupport/common-utils.h | 16 --------------- gdbsupport/gdb-xfree.h | 41 +++++++++++++++++++++++++++++++++++++ gdbsupport/gdb_unique_ptr.h | 1 + 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 gdbsupport/gdb-xfree.h diff --git a/gdbsupport/common-utils.cc b/gdbsupport/common-utils.cc index 8ce839a54ae..7a8434538dc 100644 --- a/gdbsupport/common-utils.cc +++ b/gdbsupport/common-utils.cc @@ -21,6 +21,7 @@ #include "common-utils.h" #include "host-defs.h" #include "safe-ctype.h" +#include "gdbsupport/gdb-xfree.h" void * xzalloc (size_t size) diff --git a/gdbsupport/common-utils.h b/gdbsupport/common-utils.h index 224e1f31222..4a75e67079f 100644 --- a/gdbsupport/common-utils.h +++ b/gdbsupport/common-utils.h @@ -52,22 +52,6 @@ /* Like xmalloc, but zero the memory. */ void *xzalloc (size_t); -template -static void -xfree (T *ptr) -{ - static_assert (IsFreeable::value, "Trying to use xfree with a non-POD \ -data type. Use operator delete instead."); - - if (ptr != NULL) -#ifdef GNULIB_NAMESPACE - GNULIB_NAMESPACE::free (ptr); /* ARI: free */ -#else - free (ptr); /* ARI: free */ -#endif -} - - /* Like asprintf and vasprintf, but return the string, throw an error if no memory. */ char *xstrprintf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2); diff --git a/gdbsupport/gdb-xfree.h b/gdbsupport/gdb-xfree.h new file mode 100644 index 00000000000..2028698564e --- /dev/null +++ b/gdbsupport/gdb-xfree.h @@ -0,0 +1,41 @@ +/* Copyright (C) 1986-2021 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 . */ + +#ifndef GDBSUPPORT_GDB_XFREE_H +#define GDBSUPPORT_GDB_XFREE_H + +#include "gdbsupport/poison.h" + +/* GDB uses this instead of 'free', it detects when it is called on an + invalid type. */ + +template +static void +xfree (T *ptr) +{ + static_assert (IsFreeable::value, "Trying to use xfree with a non-POD \ +data type. Use operator delete instead."); + + if (ptr != NULL) +#ifdef GNULIB_NAMESPACE + GNULIB_NAMESPACE::free (ptr); /* ARI: free */ +#else + free (ptr); /* ARI: free */ +#endif +} + +#endif /* GDBSUPPORT_GDB_XFREE_H */ diff --git a/gdbsupport/gdb_unique_ptr.h b/gdbsupport/gdb_unique_ptr.h index 77aecb48e62..a4904ead57c 100644 --- a/gdbsupport/gdb_unique_ptr.h +++ b/gdbsupport/gdb_unique_ptr.h @@ -21,6 +21,7 @@ #define COMMON_GDB_UNIQUE_PTR_H #include +#include "gdbsupport/gdb-xfree.h" namespace gdb { -- 2.30.2