Introduce gdb-hashtab module in gdbsupport

gdb has some extensions and helpers for working with the libiberty
hash table.  This patch consolidates these and moves them to
gdbsupport.
This commit is contained in:
Tom Tromey 2021-12-21 16:48:38 -07:00
parent bf31fd38f0
commit 0589ca4e7b
10 changed files with 110 additions and 59 deletions

View File

@ -18,6 +18,7 @@
#define COMPILE_COMPILE_INTERNAL_H
#include "gcc-c-interface.h"
#include "gdbsupport/gdb-hashtab.h"
/* Debugging flag for the "compile" family of commands. */

View File

@ -17,6 +17,7 @@
#if !defined (COMPLETER_H)
#define COMPLETER_H 1
#include "gdbsupport/gdb-hashtab.h"
#include "gdbsupport/gdb_vecs.h"
#include "command.h"

View File

@ -22,6 +22,7 @@
#include "defs.h"
#include "gdbsupport/function-view.h"
#include "gdbsupport/gdb-hashtab.h"
/* Cache to watch for file names already seen. */

View File

@ -46,6 +46,7 @@
#include "hashtab.h"
#include "gdbsupport/array-view.h"
#include "gdbsupport/gdb-hashtab.h"
#include "gdbsupport/gdb_optional.h"
#include "gdbsupport/offset-type.h"
#include "gdbsupport/enum-flags.h"

View File

@ -2841,30 +2841,6 @@ gdb_argv_as_array_view_test ()
#endif /* GDB_SELF_TEST */
/* Allocation function for the libiberty hash table which uses an
obstack. The obstack is passed as DATA. */
void *
hashtab_obstack_allocate (void *data, size_t size, size_t count)
{
size_t total = size * count;
void *ptr = obstack_alloc ((struct obstack *) data, total);
memset (ptr, 0, total);
return ptr;
}
/* Trivial deallocation function for the libiberty splay tree and hash
table - don't deallocate anything. Rely on later deletion of the
obstack. DATA will be the obstack, although it is not needed
here. */
void
dummy_obstack_deallocate (void *object, void *data)
{
return;
}
/* Simple, portable version of dirname that does not modify its
argument. */

View File

@ -123,27 +123,6 @@ extern int parse_escape (struct gdbarch *, const char **);
/* Cleanup utilities. */
/* A deleter for a hash table. */
struct htab_deleter
{
void operator() (htab *ptr) const
{
htab_delete (ptr);
}
};
/* A unique_ptr wrapper for htab_t. */
typedef std::unique_ptr<htab, htab_deleter> htab_up;
/* A wrapper for 'delete' that can used as a hash table entry deletion
function. */
template<typename T>
void
htab_delete_entry (void *ptr)
{
delete (T *) ptr;
}
extern void init_page_info (void);
/* Temporarily set BATCH_FLAG and the associated unlimited terminal size.
@ -384,11 +363,6 @@ extern void demangler_warning (const char *file, int line,
/* Misc. utilities. */
/* Allocation and deallocation functions for the libiberty hash table
which use obstacks. */
void *hashtab_obstack_allocate (void *data, size_t size, size_t count);
void dummy_obstack_deallocate (void *object, void *data);
#ifdef HAVE_WAITPID
extern pid_t wait_to_die_with_timeout (pid_t pid, int *status, int timeout);
#endif

View File

@ -52,6 +52,7 @@ libgdbsupport_a_SOURCES = \
filestuff.cc \
format.cc \
gdb-dlfcn.cc \
gdb-hashtab.cc \
gdb_obstack.cc \
gdb_tilde_expand.cc \
gdb_wait.cc \

View File

@ -151,15 +151,15 @@ am_libgdbsupport_a_OBJECTS = agent.$(OBJEXT) btrace-common.$(OBJEXT) \
common-regcache.$(OBJEXT) common-utils.$(OBJEXT) \
environ.$(OBJEXT) errors.$(OBJEXT) event-loop.$(OBJEXT) \
fileio.$(OBJEXT) filestuff.$(OBJEXT) format.$(OBJEXT) \
gdb-dlfcn.$(OBJEXT) gdb_obstack.$(OBJEXT) \
gdb_tilde_expand.$(OBJEXT) gdb_wait.$(OBJEXT) \
gdb_vecs.$(OBJEXT) job-control.$(OBJEXT) netstuff.$(OBJEXT) \
new-op.$(OBJEXT) pathstuff.$(OBJEXT) print-utils.$(OBJEXT) \
ptid.$(OBJEXT) rsp-low.$(OBJEXT) run-time-clock.$(OBJEXT) \
safe-strerror.$(OBJEXT) scoped_mmap.$(OBJEXT) search.$(OBJEXT) \
signals.$(OBJEXT) signals-state-save-restore.$(OBJEXT) \
tdesc.$(OBJEXT) thread-pool.$(OBJEXT) xml-utils.$(OBJEXT) \
$(am__objects_1)
gdb-dlfcn.$(OBJEXT) gdb-hashtab.$(OBJEXT) \
gdb_obstack.$(OBJEXT) gdb_tilde_expand.$(OBJEXT) \
gdb_wait.$(OBJEXT) gdb_vecs.$(OBJEXT) job-control.$(OBJEXT) \
netstuff.$(OBJEXT) new-op.$(OBJEXT) pathstuff.$(OBJEXT) \
print-utils.$(OBJEXT) ptid.$(OBJEXT) rsp-low.$(OBJEXT) \
run-time-clock.$(OBJEXT) safe-strerror.$(OBJEXT) \
scoped_mmap.$(OBJEXT) search.$(OBJEXT) signals.$(OBJEXT) \
signals-state-save-restore.$(OBJEXT) tdesc.$(OBJEXT) \
thread-pool.$(OBJEXT) xml-utils.$(OBJEXT) $(am__objects_1)
libgdbsupport_a_OBJECTS = $(am_libgdbsupport_a_OBJECTS)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@ -377,6 +377,7 @@ libgdbsupport_a_SOURCES = \
filestuff.cc \
format.cc \
gdb-dlfcn.cc \
gdb-hashtab.cc \
gdb_obstack.cc \
gdb_tilde_expand.cc \
gdb_wait.cc \
@ -483,6 +484,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filestuff.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/format.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdb-dlfcn.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdb-hashtab.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdb_obstack.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdb_tilde_expand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdb_vecs.Po@am__quote@

44
gdbsupport/gdb-hashtab.cc Normal file
View File

@ -0,0 +1,44 @@
/* Hash table wrappers for gdb.
Copyright (C) 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 <http://www.gnu.org/licenses/>. */
#include "common-defs.h"
#include "gdb-hashtab.h"
/* Allocation function for the libiberty hash table which uses an
obstack. The obstack is passed as DATA. */
void *
hashtab_obstack_allocate (void *data, size_t size, size_t count)
{
size_t total = size * count;
void *ptr = obstack_alloc ((struct obstack *) data, total);
memset (ptr, 0, total);
return ptr;
}
/* Trivial deallocation function for the libiberty splay tree and hash
table - don't deallocate anything. Rely on later deletion of the
obstack. DATA will be the obstack, although it is not needed
here. */
void
dummy_obstack_deallocate (void *object, void *data)
{
return;
}

50
gdbsupport/gdb-hashtab.h Normal file
View File

@ -0,0 +1,50 @@
/* Hash table wrappers for gdb.
Copyright (C) 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 <http://www.gnu.org/licenses/>. */
#ifndef GDBSUPPORT_GDB_HASHTAB_H
#define GDBSUPPORT_GDB_HASHTAB_H
#include "hashtab.h"
/* A deleter for a hash table. */
struct htab_deleter
{
void operator() (htab *ptr) const
{
htab_delete (ptr);
}
};
/* A unique_ptr wrapper for htab_t. */
typedef std::unique_ptr<htab, htab_deleter> htab_up;
/* A wrapper for 'delete' that can used as a hash table entry deletion
function. */
template<typename T>
void
htab_delete_entry (void *ptr)
{
delete (T *) ptr;
}
/* Allocation and deallocation functions for the libiberty hash table
which use obstacks. */
void *hashtab_obstack_allocate (void *data, size_t size, size_t count);
void dummy_obstack_deallocate (void *object, void *data);
#endif /* GDBSUPPORT_GDB_HASHTAB_H */