corpus: is_empty: consider actual translation unit contents
authorMatthias Maennich <maennich@google.com>
Mon, 13 Jan 2020 14:44:50 +0000 (14:44 +0000)
committerMatthias Maennich <maennich@google.com>
Mon, 20 Jan 2020 14:52:30 +0000 (14:52 +0000)
A corpus with completely filtered out symbols (exhaustive whitelist),
still contains compilation units, but they are empty. A list of empty
translation units shall be considered empty as no entries need to be
considered. That is useful to skip empty corpora when writing out the
xml for them.

Hence, teach is_empty() to have a look at the actual translation units.

* src/abg-corpus.cc (corpus::is_empty): consider a list of
  empty members to be empty.

Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
src/abg-corpus.cc

index baed8e53a4ad7a700e353a8d9d56bc31c5d53251..567f1b5e7f82d2cb30869ef9663ddda2797f8c0f 100644 (file)
@@ -849,13 +849,30 @@ void
 corpus::set_architecture_name(const string& arch)
 {priv_->architecture_name = arch;}
 
-/// Tests if the corpus contains no translation unit.
+/// Tests if the corpus is empty from an ABI surface perspective. I.e. if all
+/// of these criteria are true:
+///  - all translation units (members) are empty
+///  - the maps function and variable symbols are not having entries
+///  - for shared libraries:
+///    - the soname is empty
+///    - there are no DT_NEEDED entries
 ///
 /// @return true if the corpus contains no translation unit.
 bool
 corpus::is_empty() const
 {
-  return (priv_->members.empty()
+  bool members_empty = true;
+  for (translation_units::const_iterator i = priv_->members.begin(),
+                                        e = priv_->members.end();
+       i != e; ++i)
+    {
+      if (!(*i)->is_empty())
+       {
+         members_empty = false;
+         break;
+       }
+    }
+  return (members_empty
          && priv_->fun_symbol_map
          && priv_->fun_symbol_map->empty()
          && priv_->var_symbol_map