public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Enze Li <lienze2010@hotmail.com>
To: Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v4 18/34] Introduce the new DWARF index class
Date: Thu, 14 Apr 2022 13:32:39 +0800	[thread overview]
Message-ID: <MEAP282MB0293D4E1E97C127B5524893CDDEF9@MEAP282MB0293.AUSP282.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <20220404195335.2111906-19-tom@tromey.com>

Hi Tom,

From this commit 51f5a4b8e93("Introduce the new DWARF index class"), I
ran into this error:

===================================================================
  CXX    dwarf2/cooked-index.o
In file included from dwarf2/cooked-index.c:21:
./dwarf2/cooked-index.h:169:12: error: explicitly defaulted move
constructor is implicitly deleted [-Werror,-Wdefaulted-function-
deleted]
  explicit cooked_index (cooked_index &&other) = default;
           ^
./dwarf2/cooked-index.h:247:16: note: move constructor of
'cooked_index' is implicitly deleted because field 'm_storage' has a
deleted move constructor
  auto_obstack m_storage;
               ^
./../gdbsupport/gdb_obstack.h:128:28: note: 'auto_obstack' has been
explicitly marked deleted here
  DISABLE_COPY_AND_ASSIGN (auto_obstack);
                           ^
In file included from dwarf2/cooked-index.c:21:
./dwarf2/cooked-index.h:171:17: error: explicitly defaulted move
assignment operator is implicitly deleted [-Werror,-Wdefaulted-
function-deleted]
  cooked_index &operator= (cooked_index &&other) = default;
                ^
./dwarf2/cooked-index.h:247:16: note: move assignment operator of
'cooked_index' is implicitly deleted because field 'm_storage' has a
deleted move assignment operator
  auto_obstack m_storage;
               ^
./../gdbsupport/gdb_obstack.h:128:3: note: 'operator=' has been
explicitly marked deleted here
  DISABLE_COPY_AND_ASSIGN (auto_obstack);
  ^
./../include/ansidecl.h:425:8: note: expanded from macro
'DISABLE_COPY_AND_ASSIGN'
  void operator= (const TYPE &) = delete
       ^
2 errors generated.
make[2]: *** [Makefile:1892: dwarf2/cooked-index.o] Error 1
===================================================================

This happens on Fedora 35 with clang13 and Ubuntu 22.04 with clang14.

Thanks,
Enze

On Mon, 2022-04-04 at 13:53 -0600, Tom Tromey wrote:
> This patch introduces the new DWARF index class.  It is called
> "cooked" to contrast against a "raw" index, which is mapped from disk
> without extra effort.
> 
> Nothing constructs a cooked index yet.  The essential idea here is
> that index entries are created via the "add" method; then when all
> the
> entries have been read, they are "finalize"d -- name canonicalization
> is performed and the entries are added to a sorted vector.
> 
> Entries use the DWARF name (DW_AT_name) or linkage name, not the full
> name as is done for partial symbols.
> 
> These two facets -- the short name and the deferred canonicalization
> -- help improve the performance of this approach.  This will become
> clear in later patches, when parallelization is added.
> 
> Some special code is needed for Ada, because GNAT only emits mangled
> ("encoded", in the Ada lingo) names, and so we reconstruct the
> hierarchical structure after the fact.  This is also done in the
> finalization phase.
> 
> One other aspect worth noting is that the way the "main" function is
> found is different in the new code.  Currently gdb will notice
> DW_AT_main_subprogram, but won't recognize "main" during reading --
> this is done later, via explicit symbol lookup.  This is done
> differently in the new code so that finalization can be done in the
> background without then requiring a synchronization to look up the
> symbol.
> ---
>  gdb/Makefile.in           |   2 +
>  gdb/dwarf2/cooked-index.c | 274
> ++++++++++++++++++++++++++++++++++++++
>  gdb/dwarf2/cooked-index.h | 260 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 536 insertions(+)
>  create mode 100644 gdb/dwarf2/cooked-index.c
>  create mode 100644 gdb/dwarf2/cooked-index.h
> 
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index ab1bdd1d28a..cbae7803813 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -1047,6 +1047,7 @@ COMMON_SFILES = \
>  	dwarf2/abbrev-cache.c \
>  	dwarf2/attribute.c \
>  	dwarf2/comp-unit-head.c \
> +	dwarf2/cooked-index.c \
>  	dwarf2/cu.c \
>  	dwarf2/dwz.c \
>  	dwarf2/expr.c \
> @@ -1293,6 +1294,7 @@ HFILES_NO_SRCDIR = \
>  	dictionary.h \
>  	disasm.h \
>  	dummy-frame.h \
> +	dwarf2/cooked-index.h \
>  	dwarf2/cu.h \
>  	dwarf2/frame-tailcall.h \
>  	dwarf2/frame.h \
> diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c
> new file mode 100644
> index 00000000000..374540f09da
> --- /dev/null
> +++ b/gdb/dwarf2/cooked-index.c
> @@ -0,0 +1,274 @@
> +/* DIE indexing 
> +
> +   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 "defs.h"
> +#include "dwarf2/cooked-index.h"
> +#include "dwarf2/read.h"
> +#include "cp-support.h"
> +#include "ada-lang.h"
> +#include "split-name.h"
> +#include <algorithm>
> +
> +/* Hash function for cooked_index_entry.  */
> +
> +static hashval_t
> +hash_entry (const void *e)
> +{
> +  const cooked_index_entry *entry = (const cooked_index_entry *) e;
> +  return dwarf5_djb_hash (entry->canonical);
> +}
> +
> +/* Equality function for cooked_index_entry.  */
> +
> +static int
> +eq_entry (const void *a, const void *b)
> +{
> +  const cooked_index_entry *ae = (const cooked_index_entry *) a;
> +  const gdb::string_view *sv = (const gdb::string_view *) b;
> +  return (strlen (ae->canonical) == sv->length ()
> +	  && strncasecmp (ae->canonical, sv->data (), sv->length ()) ==
> 0);
> +}
> +
> +/* See cooked-index.h.  */
> +
> +const char *
> +cooked_index_entry::full_name (struct obstack *storage) const
> +{
> +  if ((flags & IS_LINKAGE) != 0)
> +    return canonical;
> +
> +  const char *sep = nullptr;
> +  switch (per_cu->lang)
> +    {
> +    case language_cplus:
> +    case language_rust:
> +      sep = "::";
> +      break;
> +
> +    case language_go:
> +    case language_d:
> +    case language_ada:
> +      sep = ".";
> +      break;
> +    }
> +
> +  if (sep == nullptr)
> +    return canonical;
> +
> +  const cooked_index_entry *parent = parent_entry;
> +  if (tag == DW_TAG_enumeration_type && (flags & IS_ENUM_CLASS) ==
> 0)
> +    parent = parent->parent_entry;
> +
> +  if (parent != nullptr)
> +    parent->write_scope (storage, sep);
> +  obstack_grow0 (storage, canonical, strlen (canonical));
> +  return (const char *) obstack_finish (storage);
> +}
> +
> +/* See cooked-index.h.  */
> +
> +void
> +cooked_index_entry::write_scope (struct obstack *storage,
> +				 const char *sep) const
> +{
> +  if (parent_entry != nullptr)
> +    parent_entry->write_scope (storage, sep);
> +  obstack_grow (storage, canonical, strlen (canonical));
> +  obstack_grow (storage, sep, strlen (sep));
> +}
> +
> +/* See cooked-index.h.  */
> +
> +const cooked_index_entry *
> +cooked_index::add (sect_offset die_offset, enum dwarf_tag tag,
> +		   cooked_index_flag flags, const char *name,
> +		   const cooked_index_entry *parent_entry,
> +		   dwarf2_per_cu_data *per_cu)
> +{
> +  cooked_index_entry *result = create (die_offset, tag, flags, name,
> +				       parent_entry, per_cu);
> +  m_entries.push_back (result);
> +
> +  /* An explicitly-tagged main program should always override the
> +     implicit "main" discovery.  */
> +  if ((flags & IS_MAIN) != 0)
> +    m_main = result;
> +  else if (per_cu->lang != language_ada
> +	   && m_main == nullptr
> +	   && strcmp (name, "main") == 0)
> +    m_main = result;
> +
> +  return result;
> +}
> +
> +/* See cooked-index.h.  */
> +
> +cooked_index::range
> +cooked_index::find (gdb::string_view name, bool completing)
> +{
> +  auto lower = std::lower_bound (m_entries.begin (), m_entries.end
> (),
> +				 name,
> +				 [=] (const cooked_index_entry *entry,
> +				      const gdb::string_view &n)
> +  {
> +    int cmp = strncasecmp (entry->canonical, n.data (), n.length
> ());
> +    if (cmp != 0 || completing)
> +      return cmp < 0;
> +    return strlen (entry->canonical) < n.length ();
> +  });
> +
> +  auto upper = std::upper_bound (m_entries.begin (), m_entries.end
> (),
> +				 name,
> +				 [=] (const gdb::string_view &n,
> +				      const cooked_index_entry *entry)
> +  {
> +    int cmp = strncasecmp (n.data (), entry->canonical, n.length
> ());
> +    if (cmp != 0 || completing)
> +      return cmp < 0;
> +    return n.length () < strlen (entry->canonical);
> +  });
> +
> +  return range (lower, upper);
> +}
> +
> +/* See cooked-index.h.  */
> +
> +gdb::unique_xmalloc_ptr<char>
> +cooked_index::handle_gnat_encoded_entry (cooked_index_entry *entry,
> +					 htab_t gnat_entries)
> +{
> +  std::string canonical = ada_decode (entry->name, false, false);
> +  if (canonical.empty ())
> +    return {};
> +  std::vector<gdb::string_view> names = split_name (canonical.c_str
> (),
> +						    split_style::DOT);
> +  gdb::string_view tail = names.back ();
> +  names.pop_back ();
> +
> +  const cooked_index_entry *parent = nullptr;
> +  for (const auto &name : names)
> +    {
> +      uint32_t hashval = dwarf5_djb_hash (name);
> +      void **slot = htab_find_slot_with_hash (gnat_entries, &name,
> +					      hashval, INSERT);
> +      /* CUs are processed in order, so we only need to check the
> most
> +	 recent entry.  */
> +      cooked_index_entry *last = (cooked_index_entry *) *slot;
> +      if (last == nullptr || last->per_cu != entry->per_cu)
> +	{
> +	  gdb::unique_xmalloc_ptr<char> new_name
> +	    = make_unique_xstrndup (name.data (), name.length ());
> +	  last = create (entry->die_offset, DW_TAG_namespace,
> +			 0, new_name.get (), parent,
> +			 entry->per_cu);
> +	  last->canonical = last->name;
> +	  m_names.push_back (std::move (new_name));
> +	  *slot = last;
> +	}
> +
> +      parent = last;
> +    }
> +
> +  entry->parent_entry = parent;
> +  return make_unique_xstrndup (tail.data (), tail.length ());
> +}
> +
> +/* See cooked-index.h.  */
> +
> +void
> +cooked_index::finalize ()
> +{
> +  auto hash_name_ptr = [] (const void *p)
> +    {
> +      const cooked_index_entry *entry = (const cooked_index_entry *)
> p;
> +      return htab_hash_pointer (entry->name);
> +    };
> +
> +  auto eq_name_ptr = [] (const void *a, const void *b) -> int
> +    {
> +      const cooked_index_entry *ea = (const cooked_index_entry *) a;
> +      const cooked_index_entry *eb = (const cooked_index_entry *) b;
> +      return ea->name == eb->name;
> +    };
> +
> +  /* We can use pointer equality here because names come from
> +     .debug_str, which will normally be unique-ified by the linker.
> +     Also, duplicates are relatively harmless -- they just mean a
> bit
> +     of extra memory is used.  */
> +  htab_up seen_names (htab_create_alloc (10, hash_name_ptr,
> eq_name_ptr,
> +					 nullptr, xcalloc, xfree));
> +
> +  htab_up gnat_entries (htab_create_alloc (10, hash_entry, eq_entry,
> +					   nullptr, xcalloc, xfree));
> +
> +  for (cooked_index_entry *entry : m_entries)
> +    {
> +      gdb_assert (entry->canonical == nullptr);
> +      if ((entry->per_cu->lang != language_cplus
> +	   && entry->per_cu->lang != language_ada)
> +	  || (entry->flags & IS_LINKAGE) != 0)
> +	entry->canonical = entry->name;
> +      else
> +	{
> +	  if (entry->per_cu->lang == language_ada)
> +	    {
> +	      gdb::unique_xmalloc_ptr<char> canon_name
> +		= handle_gnat_encoded_entry (entry, gnat_entries.get
> ());
> +	      if (canon_name == nullptr)
> +		entry->canonical = entry->name;
> +	      else
> +		{
> +		  entry->canonical = canon_name.get ();
> +		  m_names.push_back (std::move (canon_name));
> +		}
> +	    }
> +	  else
> +	    {
> +	      void **slot = htab_find_slot (seen_names.get (), entry,
> +					    INSERT);
> +	      if (*slot == nullptr)
> +		{
> +		  gdb::unique_xmalloc_ptr<char> canon_name
> +		    = cp_canonicalize_string (entry->name);
> +		  if (canon_name == nullptr)
> +		    entry->canonical = entry->name;
> +		  else
> +		    {
> +		      entry->canonical = canon_name.get ();
> +		      m_names.push_back (std::move (canon_name));
> +		    }
> +		}
> +	      else
> +		{
> +		  const cooked_index_entry *other
> +		    = (const cooked_index_entry *) *slot;
> +		  entry->canonical = other->canonical;
> +		}
> +	    }
> +	}
> +    }
> +
> +  m_names.shrink_to_fit ();
> +  m_entries.shrink_to_fit ();
> +  std::sort (m_entries.begin (), m_entries.end (),
> +	     [] (const cooked_index_entry *a, const cooked_index_entry
> *b)
> +	     {
> +	       return *a < *b;
> +	     });
> +}
> diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h
> new file mode 100644
> index 00000000000..691f6348148
> --- /dev/null
> +++ b/gdb/dwarf2/cooked-index.h
> @@ -0,0 +1,260 @@
> +/* DIE indexing 
> +
> +   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 GDB_DWARF2_COOKED_INDEX_H
> +#define GDB_DWARF2_COOKED_INDEX_H
> +
> +#include "dwarf2.h"
> +#include "gdbtypes.h"
> +#include "symtab.h"
> +#include "hashtab.h"
> +#include "dwarf2/index-common.h"
> +#include "gdbsupport/gdb_string_view.h"
> +#include "quick-symbol.h"
> +#include "gdbsupport/gdb_obstack.h"
> +#include "addrmap.h"
> +#include "gdbsupport/iterator-range.h"
> +
> +struct dwarf2_per_cu_data;
> +
> +/* Flags that describe an entry in the index.  */
> +enum cooked_index_flag_enum : unsigned char
> +{
> +  /* True if this entry is the program's "main".  */
> +  IS_MAIN = 1,
> +  /* True if this entry represents a "static" object.  */
> +  IS_STATIC = 2,
> +  /* True if this entry is an "enum class".  */
> +  IS_ENUM_CLASS = 4,
> +  /* True if this entry uses the linkage name.  */
> +  IS_LINKAGE = 8,
> +};
> +DEF_ENUM_FLAGS_TYPE (enum cooked_index_flag_enum,
> cooked_index_flag);
> +
> +/* A cooked_index_entry represents a single item in the index.  Note
> +   that two entries can be created for the same DIE -- one using the
> +   name, and another one using the linkage name, if any.
> +
> +   This is an "open" class and the members are all directly
> +   accessible.  It is read-only after the index has been fully read
> +   and processed.  */
> +struct cooked_index_entry : public allocate_on_obstack
> +{
> +  cooked_index_entry (sect_offset die_offset_, enum dwarf_tag tag_,
> +		      cooked_index_flag flags_, const char *name_,
> +		      const cooked_index_entry *parent_entry_,
> +		      dwarf2_per_cu_data *per_cu_)
> +    : name (name_),
> +      tag (tag_),
> +      flags (flags_),
> +      die_offset (die_offset_),
> +      parent_entry (parent_entry_),
> +      per_cu (per_cu_)
> +  {
> +  }
> +
> +  /* Return true if this entry matches SEARCH_FLAGS.  */
> +  bool matches (block_search_flags search_flags) const
> +  {
> +    if ((search_flags & SEARCH_STATIC_BLOCK) != 0
> +	&& (flags & IS_STATIC) != 0)
> +      return true;
> +    if ((search_flags & SEARCH_GLOBAL_BLOCK) != 0
> +	&& (flags & IS_STATIC) == 0)
> +      return true;
> +    return false;
> +  }
> +
> +  /* Return true if this entry matches DOMAIN.  */
> +  bool matches (domain_enum domain) const
> +  {
> +    switch (domain)
> +      {
> +      case LABEL_DOMAIN:
> +	return false;
> +
> +      case MODULE_DOMAIN:
> +	return tag == DW_TAG_module;
> +
> +      case COMMON_BLOCK_DOMAIN:
> +	return tag == DW_TAG_common_block;
> +      }
> +
> +    return true;
> +  }
> +
> +  /* Return true if this entry matches KIND.  */
> +  bool matches (enum search_domain kind) const
> +  {
> +    switch (kind)
> +      {
> +      case VARIABLES_DOMAIN:
> +	return tag == DW_TAG_variable;
> +      case FUNCTIONS_DOMAIN:
> +	return tag == DW_TAG_subprogram;
> +      case TYPES_DOMAIN:
> +	return tag == DW_TAG_typedef || tag == DW_TAG_structure_type;
> +      case MODULES_DOMAIN:
> +	return tag == DW_TAG_module;
> +      }
> +
> +    return true;
> +  }
> +
> +  /* Construct the fully-qualified name of this entry and return a
> +     pointer to it.  If allocation is needed, it will be done on
> +     STORAGE.  */
> +  const char *full_name (struct obstack *storage) const;
> +
> +  /* Entries must be sorted case-insensitively; this compares two
> +     entries.  */
> +  bool operator< (const cooked_index_entry &other) const
> +  {
> +    return strcasecmp (canonical, other.canonical) < 0;
> +  }
> +
> +  /* The name as it appears in DWARF.  This always points into one
> of
> +     the mapped DWARF sections.  Note that this may be the name or
> the
> +     linkage name -- two entries are created for DIEs which have
> both
> +     attributes.  */
> +  const char *name;
> +  /* The canonical name.  For C++ names, this may differ from NAME.
> +     In all other cases, this is equal to NAME.  */
> +  const char *canonical = nullptr;
> +  /* The DWARF tag.  */
> +  enum dwarf_tag tag;
> +  /* Any flags attached to this entry.  */
> +  cooked_index_flag flags;
> +  /* The offset of this DIE.  */
> +  sect_offset die_offset;
> +  /* The parent entry.  This is NULL for top-level entries.
> +     Otherwise, it points to the parent entry, such as a namespace
> or
> +     class.  */
> +  const cooked_index_entry *parent_entry;
> +  /* The CU from which this entry originates.  */
> +  dwarf2_per_cu_data *per_cu;
> +
> +private:
> +
> +  void write_scope (struct obstack *storage, const char *sep) const;
> +};
> +
> +/* An index of interesting DIEs.  This is "cooked", in contrast to a
> +   mapped .debug_names or .gdb_index, which are "raw".  An entry in
> +   the index is of type cooked_index_entry.
> +
> +   Operations on the index are described below.  They are chosen to
> +   make it relatively simple to implement the symtab "quick"
> +   methods.  */
> +class cooked_index
> +{
> +public:
> +  cooked_index () = default;
> +  explicit cooked_index (cooked_index &&other) = default;
> +  DISABLE_COPY_AND_ASSIGN (cooked_index);
> +  cooked_index &operator= (cooked_index &&other) = default;
> +
> +  /* Create a new cooked_index_entry and register it with this
> object.
> +     Entries are owned by this object.  The new item is
> returned.  */
> +  const cooked_index_entry *add (sect_offset die_offset, enum
> dwarf_tag tag,
> +				 cooked_index_flag flags,
> +				 const char *name,
> +				 const cooked_index_entry
> *parent_entry,
> +				 dwarf2_per_cu_data *per_cu);
> +
> +  /* Return the entry that is believed to represent the program's
> +     "main".  This will return NULL if no such entry is
> available.  */
> +  const cooked_index_entry *get_main () const
> +  {
> +    return m_main;
> +  }
> +
> +  /* Install a new fixed addrmap from the given mutable addrmap.  */
> +  void install_addrmap (addrmap *map)
> +  {
> +    gdb_assert (m_addrmap == nullptr);
> +    m_addrmap = addrmap_create_fixed (map, &m_storage);
> +  }
> +
> +  /* Look up ADDR in the address map, and return either the
> +     corresponding CU, or nullptr if the address could not be
> +     found.  */
> +  dwarf2_per_cu_data *lookup (CORE_ADDR addr)
> +  {
> +    return (dwarf2_per_cu_data *) addrmap_find (m_addrmap, addr);
> +  }
> +
> +  /* Finalize the index.  This should be called a single time, when
> +     the index has been fully populated.  It enters all the entries
> +     into the internal hash table.  */
> +  void finalize ();
> +
> +  /* A simple range over part of m_entries.  */
> +  typedef iterator_range<std::vector<cooked_index_entry
> *>::iterator> range;
> +
> +  /* Look up an entry by name.  Returns a range of all matching
> +     results.  If COMPLETING is true, then a larger range, suitable
> +     for completion, will be returned.  */
> +  range find (gdb::string_view name, bool completing);
> +
> +  /* Return a range of all the entries.  */
> +  range all_entries ()
> +  {
> +    return { m_entries.begin (), m_entries.end () };
> +  }
> +
> +private:
> +
> +  /* GNAT only emits mangled ("encoded") names in the DWARF, and
> does
> +     not emit the module structure.  However, we need this structure
> +     to do lookups.  This function recreates that structure for an
> +     existing entry.  It returns the base name (last element) of the
> +     full decoded name.  */
> +  gdb::unique_xmalloc_ptr<char> handle_gnat_encoded_entry
> +       (cooked_index_entry *entry, htab_t gnat_entries);
> +
> +  /* Create a new cooked_index_entry and register it with this
> object.
> +     Entries are owned by this object.  The new item is
> returned.  */
> +  cooked_index_entry *create (sect_offset die_offset,
> +			      enum dwarf_tag tag,
> +			      cooked_index_flag flags,
> +			      const char *name,
> +			      const cooked_index_entry *parent_entry,
> +			      dwarf2_per_cu_data *per_cu)
> +  {
> +    return new (&m_storage) cooked_index_entry (die_offset, tag,
> flags,
> +						name, parent_entry,
> +						per_cu);
> +  }
> +
> +  /* Storage for the entries.  */
> +  auto_obstack m_storage;
> +  /* List of all entries.  */
> +  std::vector<cooked_index_entry *> m_entries;
> +  /* If we found "main" or an entry with 'is_main' set, store it
> +     here.  */
> +  cooked_index_entry *m_main = nullptr;
> +  /* Storage for canonical names.  */
> +  std::vector<gdb::unique_xmalloc_ptr<char>> m_names;
> +  /* The addrmap.  This maps address ranges to dwarf2_per_cu_data
> +     objects.  */
> +  addrmap *m_addrmap = nullptr;
> +};
> +
> +#endif /* GDB_DWARF2_COOKED_INDEX_H */


  parent reply	other threads:[~2022-04-14  5:33 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-04 19:53 [PATCH v4 00/34] Rewrite the DWARF "partial" reader Tom Tromey
2022-04-04 19:53 ` [PATCH v4 01/34] Allow thread-pool.h to work without threads Tom Tromey
2022-04-08 16:13   ` Pedro Alves
2022-04-04 19:53 ` [PATCH v4 02/34] Split create_addrmap_from_aranges Tom Tromey
2022-04-04 19:53 ` [PATCH v4 03/34] Fix latent bug in read_addrmap_from_aranges Tom Tromey
2022-04-04 19:53 ` [PATCH v4 04/34] Add dwarf2_per_cu_data::addresses_seen Tom Tromey
2022-04-04 19:53 ` [PATCH v4 05/34] Refactor dwarf2_get_pc_bounds Tom Tromey
2022-04-04 19:53 ` [PATCH v4 06/34] Allow ada_decode not to decode operators Tom Tromey
2022-04-04 19:53 ` [PATCH v4 07/34] Let skip_one_die not skip children Tom Tromey
2022-04-04 19:53 ` [PATCH v4 08/34] Add name splitting Tom Tromey
2022-04-04 19:53 ` [PATCH v4 09/34] Add new overload of dwarf5_djb_hash Tom Tromey
2022-04-04 19:53 ` [PATCH v4 10/34] Refactor build_type_psymtabs_reader Tom Tromey
2022-04-04 19:53 ` [PATCH v4 11/34] Add batching parameter to parallel_for_each Tom Tromey
2022-04-04 19:53 ` [PATCH v4 12/34] Return vector of results from parallel_for_each Tom Tromey
2022-04-04 19:53 ` [PATCH v4 13/34] Specialize std::hash for gdb_exception Tom Tromey
2022-04-04 19:53 ` [PATCH v4 14/34] Add "fullname" handling to file_and_directory Tom Tromey
2022-04-04 19:53 ` [PATCH v4 15/34] Introduce DWARF abbrev cache Tom Tromey
2022-04-04 19:53 ` [PATCH v4 16/34] Statically examine abbrev properties Tom Tromey
2022-04-04 19:53 ` [PATCH v4 17/34] Update skip_one_die for new " Tom Tromey
2022-04-04 19:53 ` [PATCH v4 18/34] Introduce the new DWARF index class Tom Tromey
2022-04-10 17:38   ` Tom Tromey
2022-04-14  5:32   ` Enze Li [this message]
2022-04-14 11:52     ` Simon Marchi
2022-04-04 19:53 ` [PATCH v4 19/34] The new DWARF indexer Tom Tromey
2022-04-04 19:53 ` [PATCH v4 20/34] Implement quick_symbol_functions for cooked DWARF index Tom Tromey
2022-04-04 19:53 ` [PATCH v4 21/34] Wire in the new DWARF indexer Tom Tromey
2022-04-04 19:53 ` [PATCH v4 22/34] Introduce thread-safe handling for complaints Tom Tromey
2022-04-04 19:53 ` [PATCH v4 23/34] Pre-read DWARF section data Tom Tromey
2022-04-04 19:53 ` [PATCH v4 24/34] Parallelize DWARF indexing Tom Tromey
2022-04-04 19:53 ` [PATCH v4 25/34] "Finalize" the DWARF index in the background Tom Tromey
2022-04-04 19:53 ` [PATCH v4 26/34] Rename write_psymtabs_to_index Tom Tromey
2022-04-04 19:53 ` [PATCH v4 27/34] Change the key type in psym_index_map Tom Tromey
2022-04-04 19:53 ` [PATCH v4 28/34] Change parameters to write_address_map Tom Tromey
2022-04-04 19:53 ` [PATCH v4 29/34] Genericize addrmap handling in the DWARF index writer Tom Tromey
2022-04-04 19:53 ` [PATCH v4 30/34] Adapt .gdb_index writer to new DWARF scanner Tom Tromey
2022-04-04 19:53 ` [PATCH v4 31/34] Adapt .debug_names " Tom Tromey
2022-04-04 19:53 ` [PATCH v4 32/34] Enable the new DWARF indexer Tom Tromey
2022-04-04 19:53 ` [PATCH v4 33/34] Delete DWARF psymtab code Tom Tromey
2022-04-04 19:53 ` [PATCH v4 34/34] Remove dwarf2_per_cu_data::v Tom Tromey
2022-04-12 15:30 ` [PATCH v4 00/34] Rewrite the DWARF "partial" reader Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MEAP282MB0293D4E1E97C127B5524893CDDEF9@MEAP282MB0293.AUSP282.PROD.OUTLOOK.COM \
    --to=lienze2010@hotmail.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).