public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
* [PATCH, RFC] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group
@ 2023-02-01 10:48 Dodji Seketeli
  2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
  0 siblings, 1 reply; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-01 10:48 UTC (permalink / raw)
  To: gprocida; +Cc: libabigail

Hello Giuliano,

You recently made me aware (on #libabigail IRC channel on oftc) of an
issue regarding duplicated corpora in the output of "abidw --linux-tree".

Thank you for the heads-up and sorry for the disagreement.

Below is a patch I am proposing to address that problem.  Could you
please tell me if it addresses the issue at hand?  If yes, I'd be happy
to apply it.  Otherwise, I'll get back to the black board.

Thank you in advance.




It's been brought to my attention on IRC that running

    abidw --linux-tree <kernel-build-tree>

would result in a corpus group that duplicates every single corpus in
the resulting abixml.  Oops.

This is because both dwarf::reader::read_corpus() and
elf_based_reader::read_and_add_corpus_to_group() add the corpus to the
corpus_group, and yet, the later function calls the former.  So the
corpus is added to the corpus_group twice.

This patch ensures that
elf_based_reader::read_and_add_corpus_to_group() is the only one to
add the corpus to the group.  It also ensures that this happens before
the corpus is constructed from the debug info because that is useful
for sharing types among the various corpora.  Otherwise, those types
are potentially duplicated in the IR of each corpus.

The patch also ensures the abixml writer enforces the fact that each
corpus is emitted only once.

	* src/abg-dwarf-reader.cc (reader::read_debug_info_into_corpus):
	Do not add the corpus to the group here ...
	* src/abg-elf-based-reader.cc
	(elf_based_reader::read_and_add_corpus_to_group): ... because it's
	already added here.  But then, let's add it here /before/ reading
	type & symbols information into the corpus.
	* src/abg-writer.cc (write_context::m_emitted_corpora_set): Add
	new data member.
	(write_context::{corpus_is_emitted, record_corpus_as_emitted}):
	Define new member functions.
	(write_corpus): Invoke the new
	write_context::record_corpus_as_emitted here.
	(write_corpus_group): Ensure that each corpus is emitted only
	once.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-dwarf-reader.cc     |  3 ---
 src/abg-elf-based-reader.cc |  4 +---
 src/abg-writer.cc           | 45 +++++++++++++++++++++++++++++++++++--
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index ce6b52d4..c67edc47 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -2121,9 +2121,6 @@ public:
     corpus()->set_soname(dt_soname());
     corpus()->set_needed(dt_needed());
     corpus()->set_architecture_name(elf_architecture());
-    if (corpus_group_sptr group = corpus_group())
-      group->add_corpus(corpus());
-
     // Set symbols information to the corpus.
     corpus()->set_symtab(symtab());
 
diff --git a/src/abg-elf-based-reader.cc b/src/abg-elf-based-reader.cc
index cd7b59b6..d1d9a2df 100644
--- a/src/abg-elf-based-reader.cc
+++ b/src/abg-elf-based-reader.cc
@@ -92,10 +92,8 @@ ir::corpus_sptr
 elf_based_reader::read_and_add_corpus_to_group(ir::corpus_group& group,
 					       fe_iface::status& status)
 {
+  group.add_corpus(corpus());
   ir::corpus_sptr corp = read_corpus(status);
-
-  if (status & fe_iface::STATUS_OK)
-    group.add_corpus(corp);
   return corp;
 }
 
diff --git a/src/abg-writer.cc b/src/abg-writer.cc
index 1fb067b8..9fe3dec7 100644
--- a/src/abg-writer.cc
+++ b/src/abg-writer.cc
@@ -230,7 +230,8 @@ class write_context
   class_tmpl_shared_ptr_map		m_class_tmpl_id_map;
   string_elf_symbol_sptr_map_type	m_fun_symbol_map;
   string_elf_symbol_sptr_map_type	m_var_symbol_map;
-  unordered_set<interned_string, hash_interned_string> m_emitted_decls_set;
+  unordered_set<interned_string, hash_interned_string>	m_emitted_decls_set;
+  unordered_set<string>				m_emitted_corpora_set;
 
   write_context();
 
@@ -818,6 +819,42 @@ public:
     m_emitted_decls_set.insert(irepr);
   }
 
+  /// Test if a corpus has already been emitted.
+  ///
+  /// A corpus is emitted if it's been recorded as having been emitted
+  /// by the function record_corpus_as_emitted().
+  ///
+  /// @param corp the corpus to consider.
+  ///
+  /// @return true iff the corpus @p corp has been emitted.
+  bool
+  corpus_is_emitted(const corpus_sptr& corp)
+  {
+    if (!corp)
+      return false;
+
+    if (m_emitted_corpora_set.find(corp->get_path())
+	== m_emitted_corpora_set.end())
+      return false;
+
+    return true;
+  }
+
+  /// Record the corpus has having been emitted.
+  ///
+  /// @param corp the corpus to consider.
+  void
+  record_corpus_as_emitted(const corpus_sptr& corp)
+  {
+    if (!corp)
+      return;
+
+    const string& path = corp->get_path();
+    ABG_ASSERT(!path.empty());
+
+    m_emitted_corpora_set.insert(path);
+  }
+
   /// Get the set of types that have been emitted.
   ///
   /// @return the set of types that have been emitted.
@@ -4588,6 +4625,7 @@ write_corpus(write_context&	ctxt,
   out << "</abi-corpus>\n";
 
   ctxt.clear_referenced_types();
+  ctxt.record_corpus_as_emitted(corpus);
 
   return true;
 }
@@ -4639,7 +4677,10 @@ std::ostream& out = ctxt.get_ostream();
 	 group->get_corpora().begin();
        c != group->get_corpora().end();
        ++c)
-    write_corpus(ctxt, *c, get_indent_to_level(ctxt, indent, 1), true);
+    {
+      ABG_ASSERT(!ctxt.corpus_is_emitted(*c));
+      write_corpus(ctxt, *c, get_indent_to_level(ctxt, indent, 1), true);
+    }
 
   do_indent_to_level(ctxt, indent, 0);
   out << "</abi-corpus-group>\n";
-- 
2.31.1

Cheers,

-- 
		Dodji


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 0/4] Fix duplicated corpora in corpus group
  2023-02-01 10:48 [PATCH, RFC] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group Dodji Seketeli
@ 2023-02-03 10:59 ` Dodji Seketeli
  2023-02-03 11:47   ` [PATCH 1/4] fe-iface: Add missing virtual destructor Dodji Seketeli
                     ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-03 10:59 UTC (permalink / raw)
  To: libabigail; +Cc: gprocida, Dodji Seketeli

Hello,

Giuliano Procida brought to my attention that the ABI representation
emitted by abidw from current mainline wrongly duplicates every single
corpus in a corpus group represented in the ABIXML output.

The last patch of this series fixes the issue.

While testing that patch however, Giuliano noted other unrelated
issues with the code base.  The first three patches of the series
address those lateral problems.

This series is applied to the mainline.

Dodji Seketeli (4):
  fe-iface: Add missing virtual destructor
  dwarf-reader: Remove unused code
  corpus: Handle empty symbol table cases
  {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group

 include/abg-fe-iface.h      |  2 +-
 src/abg-corpus.cc           | 58 +++++++++++++++++++++++++------------
 src/abg-dwarf-reader.cc     | 44 ----------------------------
 src/abg-elf-based-reader.cc |  4 +--
 src/abg-writer.cc           | 45 ++++++++++++++++++++++++++--
 5 files changed, 85 insertions(+), 68 deletions(-)

-- 
2.31.1



-- 
		Dodji

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] fe-iface: Add missing virtual destructor
  2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
@ 2023-02-03 11:47   ` Dodji Seketeli
  2023-02-03 11:47   ` [PATCH 2/4] dwarf-reader: Remove unused code Dodji Seketeli
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-03 11:47 UTC (permalink / raw)
  To: libabigail; +Cc: gprocida, Dodji Seketeli

Hello,

	* include/abg-fe-iface.cc (fe_iface::~fe_iface): Make this
	virtual.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 include/abg-fe-iface.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/abg-fe-iface.h b/include/abg-fe-iface.h
index d83a1391..12b8b2bd 100644
--- a/include/abg-fe-iface.h
+++ b/include/abg-fe-iface.h
@@ -72,7 +72,7 @@ protected:
 
   fe_iface(const std::string& corpus_path, environment& e);
 
-  ~fe_iface();
+  virtual ~fe_iface();
 
   void
   reset(const std::string& corpus_path, environment& e);
-- 
2.31.1



-- 
		Dodji


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/4] dwarf-reader: Remove unused code
  2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
  2023-02-03 11:47   ` [PATCH 1/4] fe-iface: Add missing virtual destructor Dodji Seketeli
@ 2023-02-03 11:47   ` Dodji Seketeli
  2023-02-03 11:48   ` [PATCH 3/4] corpus: Handle empty symbol table cases Dodji Seketeli
  2023-02-03 11:49   ` [PATCH 4/4] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group Dodji Seketeli
  3 siblings, 0 replies; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-03 11:47 UTC (permalink / raw)
  To: libabigail; +Cc: gprocida, Dodji Seketeli

Hello,

	* src/abg-dwarf-reader.cc (reader::{find_symbol_table_section,
	lookup_native_elf_symbol_from_index}): Remove these dead
	functions.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-dwarf-reader.cc | 41 -----------------------------------------
 1 file changed, 41 deletions(-)

diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index ce6b52d4..566c9db1 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -4815,47 +4815,6 @@ public:
   var_decls_to_re_add_to_tree()
   {return var_decls_to_add_;}
 
-  /// The section containing the symbol table from the current ELF
-  /// file.
-  ///
-  /// Note that after it's first invocation, this function caches the
-  /// symbol table that it found.  Subsequent invocations just return
-  /// the cached symbol table section.
-  ///
-  /// @return the symbol table section if found
-  Elf_Scn*
-  find_symbol_table_section() const
-  {return find_symbol_table_section();}
-
-  /// Lookup an elf symbol, referred to by its index, from the .symtab
-  /// section.
-  ///
-  /// The resulting symbol returned is an instance of a GElf_Sym, from
-  /// the libelf library.
-  ///
-  /// @param symbol_index the index of the symbol to look up.
-  ///
-  /// @param elf_sym out parameter.  This is set to the resulting ELF
-  /// symbol iff the function returns TRUE, meaning the symbol was
-  /// found.
-  ///
-  /// @return TRUE iff the symbol was found.
-  bool
-  lookup_native_elf_symbol_from_index(size_t symbol_index, GElf_Sym &elf_sym)
-  {
-    Elf_Scn* symtab_section = find_symbol_table_section();
-    if (!symtab_section)
-      return false;
-
-    Elf_Data* symtab = elf_getdata(symtab_section, 0);
-    ABG_ASSERT(symtab);
-
-    if (!gelf_getsym(symtab, symbol_index, &elf_sym))
-      return false;
-
-    return true;
-  }
-
   /// Test if a DIE represents a decl (function or variable) that has
   /// a symbol that is exported, whatever that means.  This is
   /// supposed to work for Linux Kernel binaries as well.
-- 
2.31.1



-- 
		Dodji


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/4] corpus: Handle empty symbol table cases
  2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
  2023-02-03 11:47   ` [PATCH 1/4] fe-iface: Add missing virtual destructor Dodji Seketeli
  2023-02-03 11:47   ` [PATCH 2/4] dwarf-reader: Remove unused code Dodji Seketeli
@ 2023-02-03 11:48   ` Dodji Seketeli
  2023-02-03 11:49   ` [PATCH 4/4] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group Dodji Seketeli
  3 siblings, 0 replies; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-03 11:48 UTC (permalink / raw)
  To: libabigail; +Cc: gprocida, Dodji Seketeli

Hello,

There can be cases where the symbol table associated with a given
corpus is empty.  This patch handles those cases to avoid crashes.

	* src/abg-corpus.cc (corpus::priv::{get_sorted_fun_symbols,
	get_sorted_undefined_fun_symbols, get_sorted_var_symbols,
	get_sorted_undefined_var_symbols}): If the symbol is null, then
	return an empty vector of symbols.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-corpus.cc | 58 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 18 deletions(-)

diff --git a/src/abg-corpus.cc b/src/abg-corpus.cc
index b6f760bb..4f20a888 100644
--- a/src/abg-corpus.cc
+++ b/src/abg-corpus.cc
@@ -313,9 +313,15 @@ corpus::priv::get_sorted_fun_symbols() const
 {
   if (!sorted_fun_symbols)
     {
-      auto filter = symtab_->make_filter();
-      filter.set_functions();
-      sorted_fun_symbols = elf_symbols(symtab_->begin(filter), symtab_->end());
+      if (symtab_)
+	{
+	  auto filter = symtab_->make_filter();
+	  filter.set_functions();
+	  sorted_fun_symbols = elf_symbols(symtab_->begin(filter),
+					   symtab_->end());
+	}
+      else
+	sorted_fun_symbols = elf_symbols();
     }
   return *sorted_fun_symbols;
 }
@@ -349,13 +355,18 @@ corpus::priv::get_sorted_undefined_fun_symbols() const
 {
   if (!sorted_undefined_fun_symbols)
     {
-      auto filter = symtab_->make_filter();
-      filter.set_functions();
-      filter.set_undefined_symbols();
-      filter.set_public_symbols(false);
+      if (symtab_)
+	{
+	  auto filter = symtab_->make_filter();
+	  filter.set_functions();
+	  filter.set_undefined_symbols();
+	  filter.set_public_symbols(false);
 
-      sorted_undefined_fun_symbols =
-	elf_symbols(symtab_->begin(filter), symtab_->end());
+	  sorted_undefined_fun_symbols =
+	    elf_symbols(symtab_->begin(filter), symtab_->end());
+	}
+      else
+	sorted_undefined_fun_symbols = elf_symbols();
     }
   return *sorted_undefined_fun_symbols;
 }
@@ -446,10 +457,16 @@ corpus::priv::get_sorted_var_symbols() const
 {
   if (!sorted_var_symbols)
     {
-      auto filter = symtab_->make_filter();
-      filter.set_variables();
+      if (symtab_)
+	{
+	  auto filter = symtab_->make_filter();
+	  filter.set_variables();
 
-      sorted_var_symbols = elf_symbols(symtab_->begin(filter), symtab_->end());
+	  sorted_var_symbols = elf_symbols(symtab_->begin(filter),
+					   symtab_->end());
+	}
+      else
+	sorted_var_symbols = elf_symbols();
     }
   return *sorted_var_symbols;
 }
@@ -483,13 +500,18 @@ corpus::priv::get_sorted_undefined_var_symbols() const
 {
   if (!sorted_undefined_var_symbols)
     {
-      auto filter = symtab_->make_filter();
-      filter.set_variables();
-      filter.set_undefined_symbols();
-      filter.set_public_symbols(false);
+      if (symtab_)
+	{
+	  auto filter = symtab_->make_filter();
+	  filter.set_variables();
+	  filter.set_undefined_symbols();
+	  filter.set_public_symbols(false);
 
-      sorted_undefined_var_symbols =
-	  elf_symbols(symtab_->begin(filter), symtab_->end());
+	  sorted_undefined_var_symbols =
+	    elf_symbols(symtab_->begin(filter), symtab_->end());
+	}
+      else
+	sorted_undefined_var_symbols = elf_symbols();
     }
   return *sorted_undefined_var_symbols;
 }
-- 
2.31.1



-- 
		Dodji


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 4/4] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group
  2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
                     ` (2 preceding siblings ...)
  2023-02-03 11:48   ` [PATCH 3/4] corpus: Handle empty symbol table cases Dodji Seketeli
@ 2023-02-03 11:49   ` Dodji Seketeli
  3 siblings, 0 replies; 6+ messages in thread
From: Dodji Seketeli @ 2023-02-03 11:49 UTC (permalink / raw)
  To: libabigail; +Cc: gprocida, Dodji Seketeli

Hello,

It's been brought to my attention on IRC that running

    abidw --linux-tree <kernel-build-tree>

would result in a corpus group that duplicates every single corpus in
the resulting abixml.  Oops.

This is because both dwarf::reader::read_corpus() and
elf_based_reader::read_and_add_corpus_to_group() add the corpus to the
corpus_group, and yet, the later function calls the former.  So the
corpus is added to the corpus_group twice.

This patch ensures that
elf_based_reader::read_and_add_corpus_to_group() is the only one to
add the corpus to the group.  It also ensures that this happens before
the corpus is constructed from the debug info because that is useful
for sharing types among the various corpora.  Otherwise, those types
are potentially duplicated in the IR of each corpus.

The patch also ensures that the abixml writer enforces the fact that
each corpus is emitted only once.

	* src/abg-dwarf-reader.cc (reader::read_debug_info_into_corpus):
	Do not add the corpus to the group here ...
	* src/abg-elf-based-reader.cc
	(elf_based_reader::read_and_add_corpus_to_group): ... because it's
	already added here.  But then, let's add it here /before/ reading
	type & symbols information into the corpus.
	* src/abg-writer.cc (write_context::m_emitted_corpora_set): Add
	new data member.
	(write_context::{corpus_is_emitted, record_corpus_as_emitted}):
	Define new member functions.
	(write_corpus): Invoke the new
	write_context::record_corpus_as_emitted here.
	(write_corpus_group): Ensure that each corpus is emitted only
	once.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-dwarf-reader.cc     |  3 ---
 src/abg-elf-based-reader.cc |  4 +---
 src/abg-writer.cc           | 45 +++++++++++++++++++++++++++++++++++--
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index 566c9db1..92ce6c6a 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -2121,9 +2121,6 @@ public:
     corpus()->set_soname(dt_soname());
     corpus()->set_needed(dt_needed());
     corpus()->set_architecture_name(elf_architecture());
-    if (corpus_group_sptr group = corpus_group())
-      group->add_corpus(corpus());
-
     // Set symbols information to the corpus.
     corpus()->set_symtab(symtab());
 
diff --git a/src/abg-elf-based-reader.cc b/src/abg-elf-based-reader.cc
index cd7b59b6..d1d9a2df 100644
--- a/src/abg-elf-based-reader.cc
+++ b/src/abg-elf-based-reader.cc
@@ -92,10 +92,8 @@ ir::corpus_sptr
 elf_based_reader::read_and_add_corpus_to_group(ir::corpus_group& group,
 					       fe_iface::status& status)
 {
+  group.add_corpus(corpus());
   ir::corpus_sptr corp = read_corpus(status);
-
-  if (status & fe_iface::STATUS_OK)
-    group.add_corpus(corp);
   return corp;
 }
 
diff --git a/src/abg-writer.cc b/src/abg-writer.cc
index 1fb067b8..9fe3dec7 100644
--- a/src/abg-writer.cc
+++ b/src/abg-writer.cc
@@ -230,7 +230,8 @@ class write_context
   class_tmpl_shared_ptr_map		m_class_tmpl_id_map;
   string_elf_symbol_sptr_map_type	m_fun_symbol_map;
   string_elf_symbol_sptr_map_type	m_var_symbol_map;
-  unordered_set<interned_string, hash_interned_string> m_emitted_decls_set;
+  unordered_set<interned_string, hash_interned_string>	m_emitted_decls_set;
+  unordered_set<string>				m_emitted_corpora_set;
 
   write_context();
 
@@ -818,6 +819,42 @@ public:
     m_emitted_decls_set.insert(irepr);
   }
 
+  /// Test if a corpus has already been emitted.
+  ///
+  /// A corpus is emitted if it's been recorded as having been emitted
+  /// by the function record_corpus_as_emitted().
+  ///
+  /// @param corp the corpus to consider.
+  ///
+  /// @return true iff the corpus @p corp has been emitted.
+  bool
+  corpus_is_emitted(const corpus_sptr& corp)
+  {
+    if (!corp)
+      return false;
+
+    if (m_emitted_corpora_set.find(corp->get_path())
+	== m_emitted_corpora_set.end())
+      return false;
+
+    return true;
+  }
+
+  /// Record the corpus has having been emitted.
+  ///
+  /// @param corp the corpus to consider.
+  void
+  record_corpus_as_emitted(const corpus_sptr& corp)
+  {
+    if (!corp)
+      return;
+
+    const string& path = corp->get_path();
+    ABG_ASSERT(!path.empty());
+
+    m_emitted_corpora_set.insert(path);
+  }
+
   /// Get the set of types that have been emitted.
   ///
   /// @return the set of types that have been emitted.
@@ -4588,6 +4625,7 @@ write_corpus(write_context&	ctxt,
   out << "</abi-corpus>\n";
 
   ctxt.clear_referenced_types();
+  ctxt.record_corpus_as_emitted(corpus);
 
   return true;
 }
@@ -4639,7 +4677,10 @@ std::ostream& out = ctxt.get_ostream();
 	 group->get_corpora().begin();
        c != group->get_corpora().end();
        ++c)
-    write_corpus(ctxt, *c, get_indent_to_level(ctxt, indent, 1), true);
+    {
+      ABG_ASSERT(!ctxt.corpus_is_emitted(*c));
+      write_corpus(ctxt, *c, get_indent_to_level(ctxt, indent, 1), true);
+    }
 
   do_indent_to_level(ctxt, indent, 0);
   out << "</abi-corpus-group>\n";
-- 
2.31.1



-- 
		Dodji


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-02-03 11:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-01 10:48 [PATCH, RFC] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group Dodji Seketeli
2023-02-03 10:59 ` [PATCH 0/4] Fix duplicated corpora in corpus group Dodji Seketeli
2023-02-03 11:47   ` [PATCH 1/4] fe-iface: Add missing virtual destructor Dodji Seketeli
2023-02-03 11:47   ` [PATCH 2/4] dwarf-reader: Remove unused code Dodji Seketeli
2023-02-03 11:48   ` [PATCH 3/4] corpus: Handle empty symbol table cases Dodji Seketeli
2023-02-03 11:49   ` [PATCH 4/4] {dwarf,elf_based}-reader,writer: Avoid duplicating corpora in corpus_group Dodji Seketeli

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).