@@ -2850,7 +2850,8 @@ build_elf_symbol(read_context& ctxt, const xmlNodePtr node,
elf_symbol::version version(version_string, is_default_version);
- if (drop_if_suppressed && suppr::is_elf_symbol_suppressed(ctxt, name, type))
+ const bool is_suppressed = suppr::is_elf_symbol_suppressed(ctxt, name, type);
+ if (drop_if_suppressed && is_suppressed)
return elf_symbol_sptr();
const environment* env = ctxt.get_environment();
@@ -2860,6 +2861,8 @@ build_elf_symbol(read_context& ctxt, const xmlNodePtr node,
version, visibility,
/*is_linux_string_cst=*/false);
+ e->set_is_suppressed(is_suppressed);
+
if (crc != 0)
e->set_crc(crc);
@@ -2950,7 +2953,7 @@ build_elf_symbol_db(read_context& ctxt,
elf_symbol_sptr sym;
for (xmlNodePtr n = node->children; n; n = n->next)
{
- if ((sym = build_elf_symbol(ctxt, n, /*drop_if_suppress=*/true)))
+ if ((sym = build_elf_symbol(ctxt, n, /*drop_if_suppress=*/false)))
{
id_sym_map[sym->get_id_string()] = sym;
xml_node_ptr_elf_symbol_map[n] = sym;
@@ -361,7 +361,13 @@ symtab::load_(string_elf_symbols_map_sptr function_symbol_map,
end = function_symbol_map->end();
it != end; ++it)
{
- symbols_.insert(symbols_.end(), it->second.begin(), it->second.end());
+ for (elf_symbols::const_iterator sym_it = it->second.begin(),
+ sym_end = it->second.end();
+ sym_it != sym_end; ++sym_it)
+ {
+ if (!(*sym_it)->is_suppressed())
+ symbols_.push_back(*sym_it);
+ }
ABG_ASSERT(name_symbol_map_.insert(*it).second);
}
@@ -371,7 +377,13 @@ symtab::load_(string_elf_symbols_map_sptr function_symbol_map,
end = variables_symbol_map->end();
it != end; ++it)
{
- symbols_.insert(symbols_.end(), it->second.begin(), it->second.end());
+ for (elf_symbols::const_iterator sym_it = it->second.begin(),
+ sym_end = it->second.end();
+ sym_it != sym_end; ++sym_it)
+ {
+ if (!(*sym_it)->is_suppressed())
+ symbols_.push_back(*sym_it);
+ }
ABG_ASSERT(name_symbol_map_.insert(*it).second);
}
@@ -161,6 +161,9 @@ test-abidiff-exit/test-fun-param-v0.o \
test-abidiff-exit/test-fun-param-v1.abi \
test-abidiff-exit/test-fun-param-v1.c \
test-abidiff-exit/test-fun-param-v1.o \
+test-abidiff-exit/test-missing-alias-report.txt \
+test-abidiff-exit/test-missing-alias.abi \
+test-abidiff-exit/test-missing-alias.suppr \
\
test-diff-dwarf/test0-v0.cc \
test-diff-dwarf/test0-v0.o \
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
+<abi-corpus path='test.so' soname='test.so'>
+ <elf-function-symbols>
+ <elf-symbol name='__foo' type='func-type' binding='global-binding' visibility='default-visibility' alias='foo' is-defined='yes'/>
+ <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+ </elf-function-symbols>
+ <abi-instr version='1.0' address-size='64' path='test.c' language='LANG_C89'>
+ <type-decl name='void' id='48b5725f'/>
+ <function-decl name='__foo' mangled-name='__foo' filepath='test.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
+</abi-corpus>
new file mode 100644
@@ -0,0 +1,4 @@
+[suppress_function]
+ symbol_name_not_regexp = ^__foo$
+ drop = true
+
@@ -212,6 +212,15 @@ InOutSpec in_out_specs[] =
"data/test-abidiff-exit/test-fun-param-report.txt",
"output/test-abidiff-exit/test-fun-param-report.txt"
},
+ {
+ "data/test-abidiff-exit/test-missing-alias.abi",
+ "data/test-abidiff-exit/test-missing-alias.abi",
+ "data/test-abidiff-exit/test-missing-alias.suppr",
+ "",
+ abigail::tools_utils::ABIDIFF_OK,
+ "data/test-abidiff-exit/test-missing-alias-report.txt",
+ "output/test-abidiff-exit/test-missing-alias-report.txt"
+ },
{0, 0, 0 ,0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
};