15 #include "abg-internal.h"
20 ABG_BEGIN_EXPORT_DECLARATIONS
24 #include "abg-suppression.h"
43 using std::dynamic_pointer_cast;
48 OFFSET_OF_FLEXIBLE_ARRAY_DATA_MEMBER_STRING()
50 static string s =
"offset_of_flexible_array_data_member";
58 static string s =
"end";
77 for (
const char *
const * name = names; name < names + count; ++name)
92 suppression_base::suppression_base(
const string& label)
93 : priv_(new
priv(label))
106 suppression_base::suppression_base(
const string& label,
107 const string& file_name_regex_str,
108 const string& file_name_not_regex_str)
109 : priv_(new
priv(label,
111 file_name_not_regex_str))
122 {
return priv_->drops_artifact_;}
133 {priv_->drops_artifact_ = f;}
144 {
return priv_->is_artificial_;}
154 {priv_->is_artificial_ = f;}
161 {
return priv_->label_;}
168 {priv_->label_ = label;}
180 {priv_->file_name_regex_str_ = regexp;}
192 {
return priv_->file_name_regex_str_;}
205 {priv_->file_name_not_regex_str_ = regexp;}
218 {
return priv_->file_name_not_regex_str_;}
242 {priv_->soname_regex_str_ = regexp;}
254 {
return priv_->soname_regex_str_;}
267 {priv_->soname_not_regex_str_ = regexp;}
280 {
return priv_->soname_not_regex_str_;}
371 string first_soname = ctxt.
get_corpus_diff()->first_corpus()->get_soname(),
377 if (!suppr.priv_->matches_soname(first_soname)
378 && !suppr.priv_->matches_soname(second_soname))
397 names_of_binaries_match(
const suppression_base& suppr,
398 const diff_context &ctxt)
401 string first_binary_path = ctxt.get_corpus_diff()->first_corpus()->get_path(),
402 second_binary_path = ctxt.get_corpus_diff()->second_corpus()->get_path();
404 if (!suppr.has_file_name_related_property())
407 if (!suppr.priv_->matches_binary_name(first_binary_path)
408 && !suppr.priv_->matches_binary_name(second_binary_path))
414 suppression_base::~suppression_base()
418 read_type_suppression(
const ini::config::section& section);
421 read_function_suppression(
const ini::config::section& section);
424 read_variable_suppression(
const ini::config::section& section);
427 read_file_suppression(
const ini::config::section& section);
440 read_suppressions(
const ini::config& config,
444 for (ini::config::sections_type::const_iterator i =
445 config.get_sections().begin();
446 i != config.get_sections().end();
448 if ((s = read_type_suppression(**i))
449 || (s = read_function_suppression(**i))
450 || (s = read_variable_suppression(**i))
451 || (s = read_file_suppression(**i)))
452 suppressions.push_back(s);
463 read_suppressions(std::istream& input,
467 read_suppressions(*config, suppressions);
477 read_suppressions(
const string& file_path,
481 read_suppressions(*config, suppressions);
503 type_suppression::type_suppression(
const string& label,
504 const string& type_name_regexp,
505 const string& type_name)
507 priv_(new
priv(type_name_regexp,
515 type_suppression::~type_suppression()
527 {priv_->type_name_regex_str_ = name_regex_str;}
538 {
return priv_->type_name_regex_str_;}
549 {priv_->set_type_name_not_regex_str(r);}
560 {
return priv_->get_type_name_not_regex_str();}
568 {priv_->type_name_ = name;}
576 {
return priv_->type_name_;}
584 {
return priv_->consider_type_kind_;}
592 {priv_->consider_type_kind_ = f;}
603 {priv_->type_kind_ = k;}
614 {
return priv_->type_kind_;}
623 {
return priv_->consider_reach_kind_;}
633 {priv_->consider_reach_kind_ = f;}
642 {
return priv_->reach_kind_;}
651 {priv_->reach_kind_ = k;}
658 {
return priv_->has_size_change_;}
665 {priv_->has_size_change_ = flag;}
671 const unordered_set<string>&
673 {
return priv_->potential_data_members_;}
681 (
const string_set_type& s)
const
682 {priv_->potential_data_members_ = s;}
689 {
return priv_->potential_data_members_regex_str_;}
696 (
const string& d)
const
697 {priv_->potential_data_members_regex_str_ = d;}
706 {priv_->insertion_ranges_ = r;}
715 {
return priv_->insertion_ranges_;}
724 {
return priv_->insertion_ranges_;}
731 const unordered_set<string>&
733 {
return priv_->source_locations_to_keep_;}
740 unordered_set<string>&
742 {
return priv_->source_locations_to_keep_;}
750 (
const unordered_set<string>& l)
751 {priv_->source_locations_to_keep_ = l;}
759 {
return priv_->source_location_to_keep_regex_str_;}
767 {priv_->source_location_to_keep_regex_str_ = r;}
775 const vector<string>&
777 {
return priv_->changed_enumerator_names_;}
787 {priv_->changed_enumerator_names_ = n;}
796 const vector<regex::regex_t_sptr>&
798 {
return priv_->changed_enumerators_regexp_;}
809 {priv_->changed_enumerators_regexp_ = n;}
839 if (comparison::filtering::has_virtual_mem_fn_change(d))
860 d =
is_type_diff(ptr_diff->underlying_type_diff().get());
873 d =
is_type_diff(ref_diff->underlying_type_diff().get());
886 d =
is_type_diff(ptr_diff->underlying_type_diff().get());
892 d =
is_type_diff(ref_diff->underlying_type_diff().get());
901 type_base_sptr ft, st;
942 if (!f->find_data_member(var_name))
949 priv_->get_potential_data_member_names_regex())
951 bool data_member_matched =
false;
954 if (
regex::match(data_member_name_regex, dm->get_name()))
956 data_member_matched =
true;
960 if (!data_member_matched)
998 decl_base_sptr member = m.second;
999 bool matched =
false;
1004 first_type_decl.get()))
1016 bool matched =
false;
1020 first_type_decl.get()))
1038 && (enum_dif->
first_enum()->get_size_in_bits()
1049 bool matched =
true;
1050 for (string_changed_enumerator_map::const_iterator i =
1094 if (!names_of_binaries_match(*
this, *ctxt))
1099 if (!sonames_of_binaries_match(*
this, *ctxt))
1120 const type_base_sptr &type)
1127 bool matches =
true;
1130 case type_suppression::UNKNOWN_TYPE_KIND:
1131 case type_suppression::CLASS_TYPE_KIND:
1135 case type_suppression::STRUCT_TYPE_KIND:
1138 if (!klass || !klass->is_struct())
1142 case type_suppression::UNION_TYPE_KIND:
1146 case type_suppression::ENUM_TYPE_KIND:
1150 case type_suppression::ARRAY_TYPE_KIND:
1154 case type_suppression::TYPEDEF_TYPE_KIND:
1158 case type_suppression::BUILTIN_TYPE_KIND:
1185 const string& type_name)
1188 || s.priv_->get_type_name_regex()
1189 || s.priv_->get_type_name_not_regex())
1205 s.priv_->get_type_name_regex())
1212 s.priv_->get_type_name_not_regex())
1236 const type_base_sptr& type)
1256 string loc_path, loc_path_base;
1257 unsigned loc_line = 0, loc_column = 0;
1258 loc.
expand(loc_path, loc_line, loc_column);
1260 if (
regex_t_sptr regexp = s.priv_->get_source_location_to_keep_regex())
1275 || s.priv_->get_source_location_to_keep_regex())
1295 const type_base_sptr& type)
1313 if (cl->get_is_declaration_only())
1317 ABG_ASSERT(!cl->get_definition_of_declaration());
1326 || s.priv_->get_source_location_to_keep_regex())
1349 const string& type_name,
1369 if (!suppression_matches_type_no_name(*
this, type))
1391 if (!suppression_matches_type_no_name(*
this, type))
1401 struct type_suppression::insertion_range::priv
1410 : begin_(begin), end_(end)
1430 : priv_(new priv(begin, end))
1440 {
return priv_->begin_;}
1449 {
return priv_->end_;}
1538 value = b->as_integer();
1545 && (fn_call->get_name() ==
"offset_of"
1546 || fn_call->get_name() ==
"offset_after"
1547 || fn_call->get_name() ==
"offset_of_first_data_member_regexp"
1548 || fn_call->get_name() ==
"offset_of_last_data_member_regexp")
1549 && fn_call->get_arguments().size() == 1)
1551 if (fn_call->get_name() ==
"offset_of"
1552 || fn_call->get_name() ==
"offset_after")
1554 string member_name = fn_call->get_arguments()[0];
1555 for (class_decl::data_members::const_iterator it =
1562 if ((*it)->get_name() == member_name)
1564 if (fn_call->get_name() ==
"offset_of")
1566 else if (fn_call->get_name() ==
"offset_after")
1571 (*it)->get_type()->get_size_in_bits();
1581 else if (fn_call->get_name() ==
"offset_of_first_data_member_regexp"
1582 || fn_call->get_name() ==
"offset_of_last_data_member_regexp")
1584 string name_regexp = fn_call->get_arguments()[0];
1588 if (fn_call->get_name() ==
"offset_of_first_data_member_regexp")
1590 else if (fn_call->get_name() ==
"offset_of_last_data_member_regexp")
1603 if (b->get_name() == OFFSET_OF_FLEXIBLE_ARRAY_DATA_MEMBER_STRING())
1613 else if (b->get_name() == END_STRING())
1618 value = std::numeric_limits<uint64_t>::max();
1635 return value == std::numeric_limits<uint64_t>::max();
1678 struct type_suppression::insertion_range::boundary::priv
1696 struct type_suppression::insertion_range::integer_boundary::priv
1704 priv(uint64_t value)
1713 type_suppression::insertion_range::integer_boundary::integer_boundary(uint64_t value)
1714 : priv_(new priv(value))
1723 {
return priv_->value_;}
1728 type_suppression::insertion_range::integer_boundary::operator uint64_t()
const
1729 {
return as_integer();}
1737 struct type_suppression::insertion_range::fn_call_expr_boundary::priv
1754 type_suppression::insertion_range::fn_call_expr_boundary::
1756 : priv_(new priv(expr))
1764 {
return priv_->expr_;}
1770 {
return as_function_call_expr();}
1779 struct type_suppression::insertion_range::named_boundary::priv
1786 priv(
const string& name)
1795 type_suppression::insertion_range::named_boundary::named_boundary(
const string& name)
1796 : priv_(new priv(name))
1804 {
return priv_->name_;}
1839 const string& type_name_regexp,
1840 const string& type_name)
1874 read_type_kind_string(
const string& input)
1876 if (input ==
"class")
1877 return type_suppression::CLASS_TYPE_KIND;
1878 else if (input ==
"struct")
1879 return type_suppression::STRUCT_TYPE_KIND;
1880 else if (input ==
"union")
1881 return type_suppression::UNION_TYPE_KIND;
1882 else if (input ==
"enum")
1883 return type_suppression::ENUM_TYPE_KIND;
1884 else if (input ==
"array")
1885 return type_suppression::ARRAY_TYPE_KIND;
1886 else if (input ==
"typedef")
1887 return type_suppression::TYPEDEF_TYPE_KIND;
1888 else if (input ==
"builtin")
1889 return type_suppression::BUILTIN_TYPE_KIND;
1891 return type_suppression::UNKNOWN_TYPE_KIND;
1902 read_suppression_reach_kind(
const string& input)
1904 if (input ==
"direct")
1906 else if (input ==
"pointer")
1908 else if (input ==
"reference")
1910 else if (input ==
"reference-or-pointer")
1924 read_type_suppression(
const ini::config::section& section)
1928 if (section.get_name() !=
"suppress_type"
1929 && section.get_name() !=
"allow_type")
1932 static const char *
const sufficient_props[] = {
1934 "file_name_not_regexp",
1936 "soname_not_regexp",
1941 "source_location_not_in",
1942 "source_location_not_regexp",
1945 sizeof(sufficient_props)/
sizeof(
char*),
1954 string drop_artifact_str = drop_artifact
1955 ? drop_artifact->
get_value()->as_string()
1961 string has_size_change_str = has_size_change
1962 ? has_size_change->
get_value()->as_string()
1967 string label_str = label ? label->
get_value()->as_string() :
"";
1971 string file_name_regex_str =
1972 file_name_regex_prop ? file_name_regex_prop->
get_value()->as_string() :
"";
1976 string file_name_not_regex_str =
1977 file_name_not_regex_prop
1978 ? file_name_not_regex_prop->
get_value()->as_string()
1983 string soname_regex_str =
1984 soname_regex_prop ? soname_regex_prop->
get_value()->as_string() :
"";
1988 string soname_not_regex_str =
1989 soname_not_regex_prop
1990 ? soname_not_regex_prop->
get_value()->as_string()
1995 string name_regex_str = name_regex_prop
1996 ? name_regex_prop->
get_value()->as_string()
2001 string name_not_regex_str = name_not_regex_prop
2002 ? name_not_regex_prop->
get_value()->as_string()
2007 string name_str = name_prop
2012 section.find_property(
"source_location_not_in");
2013 unordered_set<string> srcloc_not_in;
2014 if (srcloc_not_in_prop)
2017 srcloc_not_in.insert(p->get_value()->as_string());
2024 vector<string>::const_iterator i;
2025 for (i = list_property->get_value()->get_content().begin();
2026 i != list_property->get_value()->get_content().end();
2028 srcloc_not_in.insert(*i);
2035 string srcloc_not_regexp_str;
2036 if (srcloc_not_regexp_prop)
2037 srcloc_not_regexp_str = srcloc_not_regexp_prop->
get_value()->as_string();
2039 bool consider_type_kind =
false;
2044 consider_type_kind =
true;
2046 read_type_kind_string(type_kind_prop->get_value()->as_string());
2049 bool consider_reach_kind =
false;
2054 consider_reach_kind =
true;
2056 read_suppression_reach_kind(reach_kind_prop->get_value()->as_string());
2060 string_set_type potential_data_member_names;
2069 tv = prop->get_value();
2072 sv = prop->get_value();
2077 && tv->get_value_items().size() == 1
2090 potential_data_member_names.insert(name);
2093 for (
const string& name : val->get_content())
2094 potential_data_member_names.insert(name);
2098 string name = sv->as_string();
2099 potential_data_member_names.insert(name);
2104 string potential_data_member_names_regexp_str;
2107 potential_data_member_names_regexp_str = prop->get_value()->as_string();
2110 vector<type_suppression::insertion_range_sptr> insert_ranges;
2111 bool consider_data_member_insertion =
false;
2117 string ins_point = prop->get_value()->as_string();
2119 if (ins_point == END_STRING())
2121 else if (ins_point == OFFSET_OF_FLEXIBLE_ARRAY_DATA_MEMBER_STRING())
2123 else if (isdigit(ins_point[0]))
2125 (atoi(ins_point.c_str()));
2134 (
new type_suppression::insertion_range(begin, end));
2135 insert_ranges.push_back(insert_range);
2136 consider_data_member_insertion =
true;
2142 (
"has_data_member_inserted_between")))
2155 && v->get_value_items().size() == 1
2162 string str = val->get_content()[0];
2166 else if (isdigit(str[0]))
2168 (atoi(str.c_str()));
2175 str = val->get_content()[1];
2179 else if (isdigit(str[0]))
2181 (atoi(str.c_str()));
2189 (
new type_suppression::insertion_range(begin, end));
2190 insert_ranges.push_back(insert_range);
2191 consider_data_member_insertion =
true;
2210 (
"has_data_members_inserted_between")))
2212 bool is_well_formed =
true;
2213 for (vector<ini::property_value_sptr>::const_iterator i =
2214 prop->get_value()->get_value_items().begin();
2215 is_well_formed && i != prop->get_value()->get_value_items().end();
2221 || tuple_value->get_value_items().size() != 1
2224 is_well_formed =
false;
2229 if (list_value->get_content().size() != 2)
2231 is_well_formed =
false;
2236 string str = list_value->get_content()[0];
2240 else if (isdigit(str[0]))
2243 (atoi(str.c_str()));
2250 str = list_value->get_content()[1];
2254 else if (isdigit(str[0]))
2256 (atoi(str.c_str()));
2264 (
new type_suppression::insertion_range(begin, end));
2265 insert_ranges.push_back(insert_range);
2266 consider_data_member_insertion =
true;
2268 if (!is_well_formed)
2282 section.find_property(
"changed_enumerators");
2284 vector<string> changed_enumerator_names;
2285 if (changed_enumerators_prop)
2289 changed_enumerator_names =
2290 p->get_value()->get_content();
2293 changed_enumerator_names.push_back(p->get_value()->as_string());
2304 section.find_property(
"changed_enumerators_regexp");
2306 vector<regex_t_sptr> changed_enumerators_regexp;
2307 if (changed_enumerators_regexp_prop)
2312 for (
string e : p->get_value()->get_content())
2318 changed_enumerators_regexp.push_back(
2324 if (section.get_name() ==
"suppress_type")
2325 result.reset(
new type_suppression(label_str, name_regex_str, name_str));
2326 else if (section.get_name() ==
"allow_type")
2327 result.reset(
new negated_type_suppression(label_str, name_regex_str,
2330 if (consider_type_kind)
2332 result->set_consider_type_kind(
true);
2333 result->set_type_kind(type_kind);
2336 if (consider_reach_kind)
2338 result->set_consider_reach_kind(
true);
2339 result->set_reach_kind(reach_kind);
2342 if (!potential_data_member_names.empty())
2343 result->set_potential_data_member_names(potential_data_member_names);
2345 if (!potential_data_member_names_regexp_str.empty())
2346 result->set_potential_data_member_names_regex_str
2347 (potential_data_member_names_regexp_str);
2349 if (consider_data_member_insertion)
2350 result->set_data_member_insertion_ranges(insert_ranges);
2352 if (!name_not_regex_str.empty())
2353 result->set_type_name_not_regex_str(name_not_regex_str);
2355 if (!file_name_regex_str.empty())
2356 result->set_file_name_regex_str(file_name_regex_str);
2358 if (!file_name_not_regex_str.empty())
2359 result->set_file_name_not_regex_str(file_name_not_regex_str);
2361 if (!soname_regex_str.empty())
2362 result->set_soname_regex_str(soname_regex_str);
2364 if (!soname_not_regex_str.empty())
2365 result->set_soname_not_regex_str(soname_not_regex_str);
2367 if (!srcloc_not_in.empty())
2368 result->set_source_locations_to_keep(srcloc_not_in);
2370 if (!srcloc_not_regexp_str.empty())
2371 result->set_source_location_to_keep_regex_str(srcloc_not_regexp_str);
2373 if ((drop_artifact_str ==
"yes" || drop_artifact_str ==
"true")
2374 && ((!name_regex_str.empty()
2375 || !name_str.empty()
2376 || !srcloc_not_regexp_str.empty()
2377 || !srcloc_not_in.empty())))
2378 result->set_drops_artifact_from_ir(
true);
2380 if (has_size_change_str ==
"yes" || has_size_change_str ==
"true")
2381 result->set_has_size_change(
true);
2383 if (result->get_type_kind() == type_suppression::ENUM_TYPE_KIND
2384 && !changed_enumerator_names.empty())
2385 result->set_changed_enumerator_names(changed_enumerator_names);
2387 if (result->get_type_kind() == type_suppression::ENUM_TYPE_KIND
2388 && !changed_enumerators_regexp.empty())
2389 result->set_changed_enumerators_regexp(changed_enumerators_regexp);
2407 function_suppression::parameter_spec::parameter_spec(
size_t i,
2409 const string& tn_regex)
2410 : priv_(new
priv(i, tn, tn_regex))
2420 {
return priv_->index_;}
2428 {priv_->index_ = i;}
2435 {
return priv_->type_name_;}
2443 {priv_->type_name_ = tn;}
2456 {
return priv_->type_name_regex_str_;}
2470 (
const string& type_name_regex_str)
2471 {priv_->type_name_regex_str_ = type_name_regex_str;}
2540 const string& ret_tn,
2541 const string& ret_tr,
2543 const string& sym_n,
2544 const string& sym_nr,
2545 const string& sym_v,
2546 const string& sym_vr)
2548 priv_(new
priv(name, nr, ret_tn, ret_tr, ps,
2549 sym_n, sym_nr, sym_v, sym_vr))
2552 function_suppression::~function_suppression()
2565 if (s ==
"function-subtype-change")
2567 else if (s ==
"added-function")
2569 else if (s ==
"deleted-function")
2571 else if (s ==
"all")
2574 return UNDEFINED_CHANGE_KIND;
2582 {
return priv_->change_kind_;}
2589 {priv_->change_kind_ = k;}
2598 {
return priv_->name_;}
2616 {
return priv_->name_regex_str_;}
2625 {priv_->name_regex_str_ = r;}
2635 {
return priv_->name_not_regex_str_;}
2645 {priv_->name_not_regex_str_ = r;}
2654 {
return priv_->return_type_name_;}
2663 {priv_->return_type_name_ = tr;}
2679 {
return priv_->return_type_regex_str_;}
2695 {priv_->return_type_regex_str_ = r;}
2707 {
return priv_->parm_specs_;}
2720 {priv_->parm_specs_ = p;}
2727 {priv_->parm_specs_.push_back(p);}
2738 {
return priv_->symbol_name_;}
2749 {priv_->symbol_name_ = n;}
2765 {
return priv_->symbol_name_regex_str_;}
2781 {priv_->symbol_name_regex_str_ = r;}
2800 {
return priv_->symbol_name_not_regex_str_;}
2820 {priv_->symbol_name_not_regex_str_ = r;}
2831 {
return priv_->symbol_version_;}
2842 {priv_->symbol_version_ = v;}
2857 {
return priv_->symbol_version_regex_str_;}
2872 {priv_->symbol_version_regex_str_ = r;}
2880 {
return priv_->allow_other_aliases_;}
2888 {priv_->allow_other_aliases_ = f;}
2942 if (!names_of_binaries_match(*
this, *ctxt))
2947 if (!sonames_of_binaries_match(*
this, *ctxt))
2962 && fn->
get_symbol()->get_alias_from_name(fname))
2972 symbol_name = sym->get_name();
2973 if (sym->has_aliases() && sym->get_alias_from_name(fname))
2976 a && !a->is_main_symbol();
2977 a = a->get_next_alias())
2978 if (a->get_name() != symbol_name)
2988 const regex_t_sptr name_regex = priv_->get_name_regex();
2996 && fn->
get_symbol()->get_alias_from_name(fname))
3006 symbol_name = sym->get_name();
3007 if (sym->has_aliases())
3010 a && !a->is_main_symbol();
3011 a = a->get_next_alias())
3019 const regex_t_sptr name_not_regex = priv_->get_name_not_regex();
3027 && fn->
get_symbol()->get_alias_from_name(fname))
3037 symbol_name = sym->get_name();
3038 if (sym->has_aliases())
3041 a && !a->is_main_symbol();
3042 a = a->get_next_alias())
3052 string fn_return_type_name = fn->
get_type()->get_return_type()
3053 ?
static_cast<string>
3055 ->get_qualified_name()))
3065 const regex_t_sptr return_type_regex = priv_->get_return_type_regex();
3066 if (return_type_regex
3067 && !
regex::match(return_type_regex, fn_return_type_name))
3073 string fn_sym_name, fn_sym_version;
3077 fn_sym_name = sym->get_name();
3078 fn_sym_version = sym->get_version().str();
3091 if (sym->has_aliases())
3094 a && !a->is_main_symbol();
3095 a = a->get_next_alias())
3096 if (a->get_name() != fn_sym_name)
3103 const regex_t_sptr symbol_name_regex = priv_->get_symbol_name_regex();
3104 if (symbol_name_regex && !
regex::match(symbol_name_regex, fn_sym_name))
3108 priv_->get_symbol_name_not_regex();
3109 if (symbol_name_not_regex
3118 if (sym->has_aliases())
3121 a && !a->is_main_symbol();
3122 a = a->get_next_alias())
3124 if (symbol_name_regex
3128 if (symbol_name_not_regex
3146 priv_->get_symbol_version_regex();
3147 if (symbol_version_regex
3148 && !
regex::match(symbol_version_regex, fn_sym_version))
3156 type_base_sptr parm_type;
3158 for (parameter_specs_type::const_iterator p =
3163 size_t index = (*p)->get_index();
3165 fn_type->get_parm_at_index_from_first_non_implicit_parm(index);
3169 string fn_parm_type_qualified_name;
3172 parm_type = fn_parm->get_type();
3173 fn_parm_type_qualified_name =
3177 const string& tn = (*p)->get_parameter_type_name();
3180 if (tn != fn_parm_type_qualified_name)
3186 (*p)->priv_->get_type_name_regex();
3187 if (parm_type_name_regex)
3190 fn_parm_type_qualified_name))
3255 if (!names_of_binaries_match(*
this, *ctxt))
3261 if (!sonames_of_binaries_match(*
this, *ctxt))
3267 bool no_symbol_name =
false, no_symbol_version =
false;
3277 const regex_t_sptr symbol_name_regex = priv_->get_symbol_name_regex();
3278 if (symbol_name_regex && !
regex::match(symbol_name_regex, sym_name))
3282 no_symbol_name =
true;
3293 priv_->get_symbol_version_regex();
3294 if (symbol_version_regex
3299 no_symbol_version =
true;
3301 if (no_symbol_name && no_symbol_version)
3351 (
static_cast<unsigned>(l) & static_cast<unsigned>(r));
3367 (
static_cast<unsigned>(l) | static_cast<unsigned>(r));
3380 const string& var_name)
3387 else if (
regex_t_sptr regexp = s.priv_->get_name_not_regex())
3392 else if (s.priv_->name_.empty())
3396 if (s.priv_->name_ != var_name)
3414 const string& var_linkage_name)
3416 if (
regex_t_sptr regexp = s.priv_->get_symbol_name_regex())
3422 s.priv_->get_symbol_name_not_regex())
3427 else if (s.priv_->symbol_name_.empty())
3431 if (s.priv_->symbol_name_ != var_linkage_name)
3449 const string& type_name)
3451 if (
regex_t_sptr regexp = s.priv_->get_type_name_regex())
3475 read_parameter_spec_from_string(
const string& str)
3477 string::size_type cur = 0;
3481 for (; cur < str.size(); ++cur)
3482 if (!isspace(str[cur]))
3487 if (str[cur] ==
'\'')
3490 for (; cur < str.size(); ++cur)
3491 if (!isdigit(str[cur]))
3494 index_str += str[cur];
3498 for (; cur < str.size(); ++cur)
3499 if (!isspace(str[cur]))
3502 bool is_regex =
false;
3503 if (str[cur] ==
'/')
3511 for (; cur < str.size(); ++cur)
3512 if (!isspace(str[cur]))
3514 if (is_regex && str[cur] ==
'/')
3516 type_name += str[cur];
3519 if (is_regex && str[cur] ==
'/')
3522 if (!index_str.empty() || !type_name.empty())
3524 std::string type_name_regex;
3527 type_name_regex = type_name;
3530 function_suppression::parameter_spec* p =
3531 new function_suppression::parameter_spec(atoi(index_str.c_str()),
3532 type_name, type_name_regex);
3547 read_function_suppression(
const ini::config::section& section)
3551 if (section.get_name() !=
"suppress_function")
3554 static const char *
const sufficient_props[] = {
3557 "file_name_not_regexp",
3559 "soname_not_regexp",
3565 "return_type_regexp",
3567 "symbol_name_regexp",
3568 "symbol_name_not_regexp",
3570 "symbol_version_regexp",
3573 sizeof(sufficient_props)/
sizeof(
char*),
3582 string drop_artifact_str = drop_artifact
3583 ? drop_artifact->
get_value()->as_string()
3588 string change_kind_str = change_kind_prop
3589 ? change_kind_prop->
get_value()->as_string()
3594 string label_str = label_prop
3600 string file_name_regex_str =
3601 file_name_regex_prop ? file_name_regex_prop->
get_value()->as_string() :
"";
3605 string file_name_not_regex_str =
3606 file_name_not_regex_prop
3607 ? file_name_not_regex_prop->
get_value()->as_string()
3612 string soname_regex_str =
3613 soname_regex_prop ? soname_regex_prop->
get_value()->as_string() :
"";
3617 string soname_not_regex_str =
3618 soname_not_regex_prop
3619 ? soname_not_regex_prop->
get_value()->as_string()
3624 string name = name_prop
3630 string name_regex_str = name_regex_prop
3631 ? name_regex_prop->
get_value()->as_string()
3636 string name_not_regex_str = name_not_regex_prop
3637 ? name_not_regex_prop->
get_value()->as_string()
3642 string return_type_name = return_type_name_prop
3643 ? return_type_name_prop->
get_value()->as_string()
3648 string return_type_regex_str = return_type_regex_prop
3649 ? return_type_regex_prop->
get_value()->as_string()
3654 string sym_name = sym_name_prop
3655 ? sym_name_prop->
get_value()->as_string()
3660 string sym_name_regex_str = sym_name_regex_prop
3661 ? sym_name_regex_prop->
get_value()->as_string()
3666 string sym_name_not_regex_str = sym_name_not_regex_prop
3667 ? sym_name_not_regex_prop->
get_value()->as_string()
3672 string sym_version = sym_ver_prop
3673 ? sym_ver_prop->
get_value()->as_string()
3678 string sym_ver_regex_str = sym_ver_regex_prop
3679 ? sym_ver_regex_prop->
get_value()->as_string()
3684 string allow_other_aliases = allow_other_aliases_prop
3685 ? allow_other_aliases_prop->
get_value()->as_string()
3690 for (ini::config::properties_type::const_iterator p =
3691 section.get_properties().begin();
3692 p != section.get_properties().end();
3694 if ((*p)->get_name() ==
"parameter")
3698 if ((parm = read_parameter_spec_from_string
3699 (prop->get_value()->as_string())))
3700 parms.push_back(parm);
3703 result.reset(
new function_suppression(label_str,
3707 return_type_regex_str,
3712 sym_ver_regex_str));
3714 if ((drop_artifact_str ==
"yes" || drop_artifact_str ==
"true")
3716 || !name_regex_str.empty()
3717 || !name_not_regex_str.empty()
3718 || !sym_name.empty()
3719 || !sym_name_regex_str.empty()
3720 || !sym_name_not_regex_str.empty()))
3721 result->set_drops_artifact_from_ir(
true);
3723 if (!change_kind_str.empty())
3724 result->set_change_kind
3727 if (!allow_other_aliases.empty())
3728 result->set_allow_other_aliases(allow_other_aliases ==
"yes"
3729 || allow_other_aliases ==
"true");
3731 if (!name_not_regex_str.empty())
3732 result->set_name_not_regex_str(name_not_regex_str);
3734 if (!sym_name_not_regex_str.empty())
3735 result->set_symbol_name_not_regex_str(sym_name_not_regex_str);
3737 if (!file_name_regex_str.empty())
3738 result->set_file_name_regex_str(file_name_regex_str);
3740 if (!file_name_not_regex_str.empty())
3741 result->set_file_name_not_regex_str(file_name_not_regex_str);
3743 if (!soname_regex_str.empty())
3744 result->set_soname_regex_str(soname_regex_str);
3746 if (!soname_not_regex_str.empty())
3747 result->set_soname_not_regex_str(soname_not_regex_str);
3809 const string& name_regex_str,
3810 const string& symbol_name,
3811 const string& symbol_name_regex_str,
3812 const string& symbol_version,
3813 const string& symbol_version_regex,
3814 const string& type_name,
3815 const string& type_name_regex_str)
3817 priv_(new
priv(name, name_regex_str,
3818 symbol_name, symbol_name_regex_str,
3819 symbol_version, symbol_version_regex,
3820 type_name, type_name_regex_str))
3838 if (s ==
"variable-subtype-change")
3840 else if (s ==
"added-variable")
3842 else if (s ==
"deleted-variable")
3844 else if (s ==
"all")
3847 return UNDEFINED_CHANGE_KIND;
3855 {
return priv_->change_kind_;}
3862 {priv_->change_kind_ = k;}
3871 {
return priv_->name_;}
3892 {
return priv_->name_regex_str_;}
3904 {priv_->name_regex_str_ = r;}
3911 {
return priv_->name_not_regex_str_;}
3918 {priv_->name_not_regex_str_ = r;}
3929 {
return priv_->symbol_name_;}
3940 {priv_->symbol_name_ = n;}
3953 {
return priv_->symbol_name_regex_str_;}
3966 {priv_->symbol_name_regex_str_ = r;}
3985 {
return priv_->symbol_name_not_regex_str_;}
4005 {priv_->symbol_name_not_regex_str_ = r;}
4014 {
return priv_->symbol_version_;}
4023 {priv_->symbol_version_ = v;}
4035 {
return priv_->symbol_version_regex_str_;}
4047 {priv_->symbol_version_regex_str_ = r;}
4058 {
return priv_->type_name_;}
4069 {priv_->type_name_ = n;}
4082 {
return priv_->type_name_regex_str_;}
4095 {priv_->type_name_regex_str_ = r;}
4150 if (!names_of_binaries_match(*
this, *ctxt))
4156 if (!sonames_of_binaries_match(*
this, *ctxt))
4175 const regex_t_sptr name_regex = priv_->get_name_regex();
4179 const regex_t_sptr name_not_regex = priv_->get_name_not_regex();
4180 if (name_not_regex &&
regex::match(name_not_regex, var_name))
4195 const regex_t_sptr sym_name_regex = priv_->get_symbol_name_regex();
4196 if (sym_name_regex && !
regex::match(sym_name_regex, var_sym_name))
4200 priv_->get_symbol_name_not_regex();
4201 if (sym_name_not_regex &&
regex::match(sym_name_not_regex, var_sym_name))
4206 string var_sym_version =
4216 priv_->get_symbol_version_regex();
4217 if (symbol_version_regex
4218 && !
regex::match(symbol_version_regex, var_sym_version))
4223 string var_type_name =
4235 const regex_t_sptr type_name_regex = priv_->get_type_name_regex();
4236 if (type_name_regex && !
regex::match(type_name_regex, var_type_name))
4299 if (!names_of_binaries_match(*
this, *ctxt))
4304 if (!sonames_of_binaries_match(*
this, *ctxt))
4311 bool no_symbol_name =
false, no_symbol_version =
false;
4326 const regex_t_sptr sym_name_regex = priv_->get_symbol_name_regex();
4327 if (sym_name_regex && !
regex::match(sym_name_regex, sym_name))
4331 no_symbol_name =
true;
4342 priv_->get_symbol_version_regex();
4343 if (symbol_version_regex
4348 no_symbol_version =
true;
4350 if (no_symbol_name && no_symbol_version)
4400 (
static_cast<unsigned>(l) & static_cast<unsigned>(r));
4416 (
static_cast<unsigned>(l) | static_cast<unsigned>(r));
4431 if (section.
get_name() !=
"suppress_variable")
4434 static const char *
const sufficient_props[] = {
4437 "file_name_not_regexp",
4439 "soname_not_regexp",
4444 "symbol_name_regexp",
4445 "symbol_name_not_regexp",
4447 "symbol_version_regexp",
4452 sizeof(sufficient_props)/
sizeof(
char*),
4461 string drop_artifact_str = drop_artifact
4462 ? drop_artifact->
get_value()->as_string()
4467 string change_kind_str = change_kind_prop
4468 ? change_kind_prop->
get_value()->as_string()
4473 string label_str = (label_prop
4474 ? label_prop->get_value()->as_string()
4479 string file_name_regex_str =
4480 file_name_regex_prop ? file_name_regex_prop->
get_value()->as_string() :
"";
4484 string file_name_not_regex_str =
4485 file_name_not_regex_prop
4486 ? file_name_not_regex_prop->
get_value()->as_string()
4491 string soname_regex_str =
4492 soname_regex_prop ? soname_regex_prop->
get_value()->as_string() :
"";
4496 string soname_not_regex_str =
4497 soname_not_regex_prop
4498 ? soname_not_regex_prop->
get_value()->as_string()
4503 string name_str = (name_prop
4504 ? name_prop->get_value()->as_string()
4509 string name_regex_str = (name_regex_prop
4510 ? name_regex_prop->get_value()->as_string()
4515 string name_not_regex_str = name_not_regex_prop
4516 ? name_not_regex_prop->
get_value()->as_string()
4521 string symbol_name = (sym_name_prop
4522 ? sym_name_prop->get_value()->as_string()
4527 string symbol_name_regex_str = sym_name_regex_prop
4528 ? sym_name_regex_prop->
get_value()->as_string()
4533 string symbol_name_not_regex_str = sym_name_not_regex_prop
4534 ? sym_name_not_regex_prop->
get_value()->as_string()
4539 string symbol_version = sym_version_prop
4540 ? sym_version_prop->
get_value()->as_string()
4545 string symbol_version_regex_str = sym_version_regex_prop
4546 ? sym_version_regex_prop->
get_value()->as_string()
4551 string type_name_str = type_name_prop
4552 ? type_name_prop->
get_value()->as_string()
4557 string type_name_regex_str = type_name_regex_prop
4558 ? type_name_regex_prop->
get_value()->as_string()
4561 result.reset(
new variable_suppression(label_str,
4565 symbol_name_regex_str,
4567 symbol_version_regex_str,
4569 type_name_regex_str));
4571 if ((drop_artifact_str ==
"yes" || drop_artifact_str ==
"true")
4572 && (!name_str.empty()
4573 || !name_regex_str.empty()
4574 || !name_not_regex_str.empty()
4575 || !symbol_name.empty()
4576 || !symbol_name_regex_str.empty()
4577 || !symbol_name_not_regex_str.empty()))
4578 result->set_drops_artifact_from_ir(
true);
4580 if (!name_not_regex_str.empty())
4581 result->set_name_not_regex_str(name_not_regex_str);
4583 if (!symbol_name_not_regex_str.empty())
4584 result->set_symbol_name_not_regex_str(symbol_name_not_regex_str);
4586 if (!change_kind_str.empty())
4587 result->set_change_kind
4590 if (!file_name_regex_str.empty())
4591 result->set_file_name_regex_str(file_name_regex_str);
4593 if (!file_name_not_regex_str.empty())
4594 result->set_file_name_not_regex_str(file_name_not_regex_str);
4596 if (!soname_regex_str.empty())
4597 result->set_soname_regex_str(soname_regex_str);
4599 if (!soname_not_regex_str.empty())
4600 result->set_soname_not_regex_str(soname_not_regex_str);
4623 const string& var_name,
4624 const string& var_linkage_name,
4625 bool require_drop_property)
4627 for (
auto i : supprs)
4630 if (require_drop_property && !i->get_drops_artifact_from_ir())
4632 if (!var_name.empty()
4635 if (!var_linkage_name.empty()
4659 file_suppression::file_suppression(
const string& label,
4660 const string& fname_regex_str,
4661 const string& fname_not_regex_str)
4664 fname_not_regex_str)
4688 if (file_path.empty())
4694 bool has_regexp =
false;
4696 if (
regex_t_sptr regexp = suppression_base::priv_->get_file_name_regex())
4703 if (
regex_t_sptr regexp = suppression_base::priv_->get_file_name_not_regex())
4733 if (section.
get_name() !=
"suppress_file")
4736 static const char *
const sufficient_props[] = {
4738 "file_name_not_regexp",
4740 "soname_not_regexp",
4743 sizeof(sufficient_props)/
sizeof(
char*),
4749 string label_str = (label_prop
4750 ? label_prop->get_value()->as_string()
4755 string file_name_regex_str =
4756 file_name_regex_prop ? file_name_regex_prop->
get_value()->as_string() :
"";
4760 string file_name_not_regex_str =
4761 file_name_not_regex_prop
4762 ? file_name_not_regex_prop->
get_value()->as_string()
4767 string soname_regex_str =
4768 soname_regex_prop ? soname_regex_prop->
get_value()->as_string() :
"";
4772 string soname_not_regex_str =
4773 soname_not_regex_prop
4774 ? soname_not_regex_prop->
get_value()->as_string()
4778 file_name_regex_str,
4779 file_name_not_regex_str));
4781 if (!soname_regex_str.empty())
4783 result->set_soname_regex_str(soname_regex_str);
4784 result->set_drops_artifact_from_ir(
true);
4787 if (!soname_not_regex_str.empty())
4789 result->set_soname_not_regex_str(soname_not_regex_str);
4790 result->set_drops_artifact_from_ir(
true);
4823 for (suppressions_type::const_iterator i = sprs.begin(); i != sprs.end(); ++i)
4825 if (s->suppresses_file(file_path))
4844 return suppr.priv_->matches_soname(soname);
4860 const string& filename,
4864 || suppr.priv_->matches_binary_name(filename));
4873 static const char *PRIVATE_TYPES_SUPPR_SPEC_NAME =
4874 "Artificial private types suppression specification";
4876 return PRIVATE_TYPES_SUPPR_SPEC_NAME;
4921 if (!s.priv_->matches_soname(fe.
dt_soname()))
4928 if (!s.priv_->matches_binary_name(fe.
corpus_path()))
4952 const string& fn_name)
4967 else if (s.priv_->name_.empty())
4971 if (s.priv_->name_ != fn_name)
4991 suppression_matches_function_sym_name(
const fe_iface& fe,
4993 const string& fn_linkage_name)
5008 else if (s.priv_->symbol_name_.empty())
5012 if (s.priv_->symbol_name_ != fn_linkage_name)
5033 const string& var_name)
5056 const string& var_linkage_name)
5081 const string& type_name,
5110 symbol->get_name());
5113 symbol->get_name());
5133 const string& sym_name,
5165 const string& fn_name,
5166 const string& fn_linkage_name,
5167 bool require_drop_property)
5172 if (require_drop_property && !i->get_drops_artifact_from_ir())
5174 if (!fn_name.empty()
5175 && suppression_matches_function_name(fe, *suppr, fn_name))
5177 if (!fn_linkage_name.empty()
5178 && suppression_matches_function_sym_name(fe, *suppr,
5205 const string& var_name,
5206 const string& var_linkage_name,
5207 bool require_drop_property)
5212 if (require_drop_property && !i->get_drops_artifact_from_ir())
5214 if (!var_name.empty()
5217 if (!var_linkage_name.empty()
5248 const string& type_name,
5250 bool& type_is_private,
5251 bool require_drop_property)
5256 if (require_drop_property && !i->get_drops_artifact_from_ir())
5263 type_is_private =
true;
5269 type_is_private =
false;
5292 uint64_t range_begin = 0, range_end = 0;
5303 if (range_begin > range_end)
5318 if (dm_offset < range_begin || dm_offset > range_end)
bool is_type_suppressed(const fe_iface &fe, const string &type_name, const location &type_location, bool &type_is_private, bool require_drop_property)
Test if a type is matched by at least one suppression specification associated with a given front-end...
bool is_elf_symbol_suppressed(const fe_iface &fe, const elf_symbol_sptr &symbol)
Test if an ELF symbol is suppressed by at least one of the suppression specifications associated with...
shared_ptr< negated_suppression_base > negated_suppression_sptr
A convenience typedef for a shared pointer to negated_suppression_base.
void set_type_kind(type_kind k)
Setter of the kind of type this suppression is about.
const string_decl_base_sptr_map & inserted_data_members() const
Getter for the data members that got inserted.
const string & get_name_not_regex_str() const
Getter for the "name_not_regexp" property of the specification.
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
type_kind
The kind of the type the current type suppression is supposed to be about.
const string & get_name_not_regex_str() const
Getter for a regular expression of a family of names of functions the user wants the current specific...
const vector< string > & get_changed_enumerator_names() const
Getter of the vector of the changed enumerators that are supposed to be suppressed. Note that this will be "valid" only if the type suppression has the 'type_kind = enum' property.
suppr::suppressions_type & suppressions()
Getter of the vector of suppression specifications associated with the current front-end.
const string & get_parameter_type_name_regex_str() const
Getter for the regular expression that defines a set of type names for the parameter designated by th...
void set_name_not_regex_str(const string &)
Setter for a regular expression for a family of names of functions the user wants the current specifi...
const string_property_value_sptr & get_value() const
Getter for the string value of the property.
void set_consider_type_kind(bool f)
Setter of the property that says whether to consider the kind of type this suppression is about...
type_suppression_sptr is_type_suppression(suppression_sptr suppr)
Test if an instance of suppression is an instance of type_suppression.
bool suppression_can_match(const fe_iface &fe, const suppression_base &s)
Test if a given suppression specification can match an ABI artifact coming from the corpus being anal...
function_suppression_sptr is_function_suppression(const suppression_sptr suppr)
Test if an instance of suppression is an instance of function_suppression.
An insertion_range boundary that is expressed as function call expression. The (integer) value of tha...
const string & get_type_name_not_regex_str() const
Getter for the "type_name_not_regex_str" property of the type suppression specification.
This header declares filters for the diff trees resulting from comparing ABI Corpora.
The abstraction of a change between two ABI artifacts, a.k.a an artifact change.
const pointer_diff * is_pointer_diff(const diff *diff)
Test if a diff node is about differences between two pointers.
void set_name(const string &)
Setter for the name of the function the user wants the current specification to designate. This might be empty, in which case it's ignored at evaluation time.
bool suppresses_variable_symbol(const elf_symbol *sym, change_kind k, const diff_context_sptr cxt) const
Evaluate the current variable suppression specification on a given elf_symbol and say if a report abo...
const string & get_file_name_regex_str() const
Getter for the "file_name_regex" property of the current instance of suppression_base.
static insertion_range::fn_call_expr_boundary_sptr create_fn_call_expr_boundary(ini::function_call_expr_sptr)
Create a function call expression boundary.
void set_return_type_regex_str(const string &r)
Setter for a regular expression for a family of return type names for functions the user wants the cu...
class_decl_sptr second_class_decl() const
Getter of the second class involved in the diff.
bool variable_is_suppressed(const suppr::suppressions_type &supprs, const string &var_name, const string &var_linkage_name, bool require_drop_property)
Test if a given variable is suppressed by at least one suppression specification among a vector of su...
const function_decl_sptr first_function_decl() const
const string & str() const
Getter for the version name.
insertion_range()
Default Constructor of type_suppression::insertion_range.
const type_decl * is_type_decl(const type_or_decl_base *t)
Test whether a type is a type_decl (a builtin type).
bool read_config(istream &input, config &conf)
Parse an ini config file from an input stream.
An insertion_range boundary that is expressed as a named constant that is to be evaluated later in th...
string build_qualified_name(const scope_decl *scope, const string &name)
Build and return a qualified name from a name and its scope.
bool suppression_matches_type_location(const type_suppression &s, const location &loc)
Test if a type suppression matches a source location.
bool is_variable() const
Test if the current instance of elf_symbol is a variable symbol or not.
The type diff has been reached (from a function or variable change) through a reference; you know...
shared_ptr< string_property_value > string_property_value_sptr
A convenience typedef for a shared_ptr to string_property_value.
This file contains the declarations for the fe_iface a.k.a "Front End Interface". ...
shared_ptr< list_property_value > list_property_value_sptr
A convenience typedef for a shared_ptr to list_property_value.
The base class of all libabigail front-ends: The Front End Interface.
void set_consider_reach_kind(bool f)
Set a flag saying if the current type suppression specification suggests to consider how the matching...
shared_ptr< suppression_base > suppression_sptr
Convenience typedef for a shared pointer to a suppression.
static insertion_range::named_boundary_sptr create_named_boundary(const string &)
Create a named boundary.
bool is_class_type(const type_or_decl_base &t)
Test whether a type is a class.
Abstraction of a suppression specification to avoid loading a file.
The type diff has been reached (from a function or variable change) through a pointer.
shared_ptr< function_type > function_type_sptr
Convenience typedef for a shared pointer on a function_type.
change_kind get_change_kind() const
Getter of the "change_king" property.
regex_t_sptr compile(const std::string &str)
Compile a regex from a string.
The type of the private data of the function_suppression type.
bool suppression_matches_type_name(const suppr::type_suppression &s, const string &type_name)
Test if a type suppression specification matches a type name.
This file contains the declarations for the ini file reader used in the libabigail library...
size_t get_index() const
Getter for the index of the parameter designated by this specification.
void set_name(const string &)
Setter for the name of the variable the user wants the current specification to designate. This property might be empty, in which case it's ignored at evaluation time.
virtual ~file_suppression()
Destructor of file_suppression.
void set_symbol_name(const string &)
Setter for the name of the symbol of the variable the user wants the current specification to designa...
type_suppression::insertion_range::fn_call_expr_boundary_sptr is_fn_call_expr_boundary(type_suppression::insertion_range::boundary_sptr b)
Tests if a given instance of type_suppression::insertion_range::boundary is actually a function call ...
const function_type_sptr get_type() const
Return the type of the current instance of function_decl.
A declaration that introduces a scope.
bool is_negated_suppression(const suppression_base &s)
Test if a suppression specification is a negated suppression.
This type abstracts changes for a class_decl.
The type diff has been reached (from a function or variable change) through either a reference or a p...
const string & get_name_regex_str() const
Getter for the regular expression for a family of names of variables the user wants the current speci...
static change_kind parse_change_kind(const string &)
Parses a string containing the content of the "change-kind" property and returns the an instance of v...
type_or_decl_base_sptr first_subject() const
Getter of the first subject of the diff.
negated_type_suppression(const string &label, const string &type_name_regexp, const string &type_name)
Constructor for negated_type_suppression.
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using function_decl::set_sy...
shared_ptr< function_call_expr > function_call_expr_sptr
Convenience typedef for a shared pointer to function_call_expr.
bool has_file_name_related_property() const
Test if the current suppression has a property related to file name.
void set_is_artificial(bool)
Set a flag saying if the suppression specification is artificial or not.
const string & get_soname_not_regex_str() const
Getter of the "soname_not_regex_str property of the current instance of suppression_base.
shared_ptr< diff_context > diff_context_sptr
Convenience typedef for a shared pointer of diff_context.
const corpus_diff_sptr & get_corpus_diff() const
Get the corpus diff for the current context.
bool get_drops_artifact_from_ir() const
Tests if the current suppression specification is to avoid adding the matched ABI artifact to the int...
static bool eval_boundary(const boundary_sptr boundary, const class_or_union *context, uint64_t &value)
Evaluate an insertion range boundary to get a resulting integer value.
const var_diff * is_var_diff(const diff *diff)
Test if a diff node is about differences between variables.
void set_source_location_to_keep_regex_str(const string &)
Setter of the regular expression string that designates the source location paths of types that shoul...
bool suppression_matches_type(const suppr::type_suppression &s, const string &type_name)
Test if a type suppression matches a type designated by its fully qualified name. ...
const string & get_symbol_name() const
Getter for the name of symbol of the function the user wants this specification to designate...
The variable was deleted from the second subject of the diff.
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
class_or_union_sptr first_class_or_union() const
The private data for type_suppression.
const string_enumerator_map & deleted_enumerators() const
const vector< regex::regex_t_sptr > & get_changed_enumerators_regexp() const
Getter of the vector of the regular expression strings for changed enumerators that are supposed to b...
void set_soname_not_regex_str(const string ®exp)
Setter of the "soname_not_regex_str property of the current instance of suppression_base.
shared_ptr< property > property_sptr
Convenience typefef for shared_ptr to property.
shared_ptr< file_suppression > file_suppression_sptr
A convenience typedef for a shared_ptr to file_suppression.
simple_property * is_simple_property(const property *p)
Tests if a property is a simple property.
bool get_is_artificial() const
Test is the suppression specification is artificial.
file_suppression_sptr is_file_suppression(const suppression_sptr s)
Test if a given suppression specification is a file suppression specification.
bool get_allow_other_aliases() const
Getter for the "allow_other_aliases" property of the function suppression specification.
const string & get_name_regex_str() const
Getter for a regular expression for a family of names of functions the user wants the current specifi...
virtual ~boundary()
Destructor of type_suppression::insertion_range::boundary.
tuple_property * is_tuple_property(const property *p)
Test if an instance of property is an instance of tuple_property.
Abstraction of a diff between two function_decl.
const string & get_type_name_regex_str() const
Getter for the "type_name_regex" property of the type suppression specification.
const string & get_name() const
Getter for the name of the elf_symbol.
bool suppression_matches_type_name_or_location(const type_suppression &s, const string &type_name, const location &type_location)
Test if a type suppression matches a type name and location.
void set_change_kind(change_kind k)
Setter of the "change_kind" property.
The abstraction of the boundary of an insertion_range, in the context of a type_suppression.
const enum_type_decl_sptr first_enum() const
void set_type_name(const string &name)
Setter for the name of the type about which diff reports should be suppressed.
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using var_decl::set_symbol(...
static insertion_range::integer_boundary_sptr create_integer_boundary(int value)
Create an integer boundary.
const string & get_symbol_version_regex_str() const
Getter of the regular expression for a family of versions of symbol for the variables the user wants ...
virtual bool suppresses_diff(const diff *diff) const
Evaluate this suppression specification on a given diff node and say if the diff node should be suppr...
void set_symbol_version(const string &)
Setter for the name of the version of the symbol of the function the user wants this specification to...
shared_ptr< type_suppression > type_suppression_sptr
Convenience typedef for a shared pointer to type_suppression.
void set_index(size_t)
Setter for the index of the parameter designated by this specification.
Abstraction of a diff between two enums.
bool suppression_matches_variable_name(const suppr::variable_suppression &s, const string &var_name)
Test if a variable suppression matches a variable denoted by its name.
Abstracts a variable declaration.
bool is_data_member_offset_in_range(const var_decl_sptr &dm, const type_suppression::insertion_range_sptr &range, const class_or_union *context)
Test if a data memer offset is in a given insertion range.
virtual bool suppresses_diff(const diff *diff) const
Evaluate this suppression specification on a given diff node and say if the diff node should be suppr...
void set_symbol_version(const string &)
Setter for the version of the symbol of the variable the user wants the current specification to desi...
void set_return_type_name(const string &)
Setter for the name of the return type of the function the user wants this specification to designate...
The base class of diff between types.
bool is_variable_suppressed(const fe_iface &fe, const string &var_name, const string &var_linkage_name, bool require_drop_property)
Test if a variable is matched by at least one suppression specification associated with a given front...
static bool boundary_value_is_end(uint64_t value)
Test if a given value supposed to be inside an insertion range represents the end of the range...
const function_decl_sptr second_function_decl() const
bool suppresses_function_symbol(const elf_symbol *sym, change_kind k, const diff_context_sptr ctxt)
Evaluate the current function suppression specification on a given elf_symbol and say if a report abo...
bool elf_symbol_is_function(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
This is the base class of class_diff and union_diff.
ini::function_call_expr_sptr as_function_call_expr() const
Returns the function call expression value of the current boundary.
const string & get_potential_data_member_names_regex_str() const
Getter of the "potential_data_member_names_regex" string.
void set_potential_data_member_names_regex_str(const string &) const
Setter of the "potential_data_member_names_regex" string.
bool suppresses_function(const function_decl *fn, change_kind k, const diff_context_sptr ctxt) const
Evaluate the current function suppression specification on a given function_decl and say if a report ...
const string & get_symbol_version() const
Getter for the name of the version of the symbol of the function the user wants this specification to...
void set_type_name_regex_str(const string &name_regex_str)
Setter for the "type_name_regex" property of the type suppression specification.
void expand(std::string &path, unsigned &line, unsigned &column) const
Expand the current location into a tripplet file path, line and column number.
const string & get_symbol_name() const
Getter for the name of the symbol of the variable the user wants the current specification to designa...
typedef_decl_sptr is_typedef(const type_or_decl_base_sptr t)
Test whether a type is a typedef.
shared_ptr< insertion_range > insertion_range_sptr
A convenience typedef for a shared pointer to insertion_range.
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
Toplevel namespace for libabigail.
The variable was added to the second second subject of the diff.
bool get_consider_reach_kind() const
Test if the current type suppression specification suggests to consider how the matching diff node is...
const unordered_set< string > & get_source_locations_to_keep() const
Getter for the array of source location paths of types that should *NOT* be suppressed.
change_kind get_change_kind() const
Getter of the "change-kind" property.
const string & get_type_name_regex_str() const
Getter for the regular expression for a family of type names of variables the user wants the current ...
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
The type of the private data of the variable_suppression type.
bool elf_symbol_is_variable(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
const enum_type_decl * is_enum_type(const type_or_decl_base *d)
Test if a decl is an enum_type_decl.
boundary_sptr begin() const
Getter for the beginning of the range.
reach_kind
The different ways through which the type diff has been reached.
virtual const interned_string & get_qualified_name(bool internal=false) const
Get the qualified name of a given variable or data member.
shared_ptr< config > config_sptr
A convenience typedef for a shared pointer to config.
const string & get_symbol_name_not_regex_str() const
Getter for a regular expression for a family of names of symbols of functions the user wants this spe...
type_suppression::insertion_range::named_boundary_sptr is_named_boundary(type_suppression::insertion_range::boundary_sptr b)
Test if a given instance of type_suppression::insertion_range::boundary is actually a named boundary...
bool suppression_matches_variable_sym_name(const suppr::variable_suppression &s, const string &var_linkage_name)
Test if a variable suppression matches a variable denoted by its symbol name.
void set_symbol_version_regex_str(const string &)
Setter for a regular expression for a family of versions of symbols of functions the user wants the c...
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
const string & get_symbol_name_not_regex_str() const
Getter for a regular expression for a family of names of symbols of variables the user wants this spe...
The type diff has been reached (from a function or variable change) directly.
tuple_property_value * is_tuple_property_value(const property_value *v)
Test if a given instance of property_value is an instance of tuple_property_value too...
void set_source_locations_to_keep(const unordered_set< string > &)
Setter for the array of source location paths of types that should *NOT* be suppressed.
shared_ptr< simple_property > simple_property_sptr
Convenience typedef for a shared_ptr to an simple_property.
void set_changed_enumerator_names(const vector< string > &)
Setter of the vector of changed enumerators that are supposed to be suppressed. Note that this will b...
Abstraction for a function declaration.
list_property * is_list_property(const property *p)
Test if an instance of a property is actually an instance of list_property.
type_kind get_type_kind() const
Getter of the kind of type this suppression is about.
const string & get_return_type_name() const
Getter for the name of the return type of the function the user wants this specification to designate...
vector< insertion_range_sptr > insertion_ranges
A convenience typedef for a vector of insertion_range_sptr.
A change in a sub-type of the variable.
bool suppresses_type(const type_base_sptr &type, const diff_context_sptr &ctxt) const
Test if the current instance of type_suppression suppresses a change reports about a given type...
class_decl_sptr first_class_decl() const
The context of the diff. This type holds various bits of information that is going to be used through...
The base type of class_decl and union_decl.
The abstraction of a diff between two references.
type
The type of a symbol.
const decl_base * get_type_declaration(const type_base *t)
Get the declaration for a given type.
The source location of a token.
void set_symbol_version_regex_str(const string &)
Setter of the regular expression for a family of versions of symbol for the variables the user wants ...
string_property_value * is_string_property_value(const property_value *v)
Test if a given property value is a string property value.
location get_location(const type_base_sptr &type)
Get the location of the declaration of a given type.
const string & get_soname_regex_str() const
Getter of the "soname_regex_str property of the current instance of suppression_base.
~integer_boundary()
Destructor of type_suppression::insertion_range::integer_boundary.
boundary_sptr end() const
Getter for the end of the range.
The abstraction of a diff between two pointers.
Abstraction of an elf symbol.
bool get_next_data_member_offset(const class_or_union *klass, const var_decl_sptr &dm, uint64_t &offset)
Get the offset of the non-static data member that comes after a given one.
void set_symbol_name_not_regex_str(const string &)
Setter for a regular expression for a family of names of symbols of functions the user wants this spe...
void set_parameter_type_name(const string &)
Setter for the type name of the parameter designated by this specification.
The function was deleted from the second subject of the diff.
const function_decl_diff * is_function_decl_diff(const diff *diff)
Test if a diff node is about differences between functions.
shared_ptr< named_boundary > named_boundary_sptr
Convenience typedef for a shared_ptr to a named_boundary.
This contains the private implementation of the suppression engine of libabigail. ...
function_suppression::change_kind operator|(function_suppression::change_kind l, function_suppression::change_kind r)
The bitwise 'or' operator for the enum function_suppression::change_kind.
bool suppresses_diff(const diff *d) const
Evaluate this suppression specification on a given diff node and say if the diff node should be suppr...
boundary()
Default constructor of type_suppression::insertion_range::boundary.
void set_type_name(const string &)
Setter for the name of the type of the variable the user wants the current specification to designate...
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
std::shared_ptr< regex_t > regex_t_sptr
A convenience typedef for a shared pointer of regex_t.
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects...
function_suppression()
Default constructor for the function_suppression type.
virtual ~negated_type_suppression()
Destructor of the negated_type_suppression type.
Base type of a direct suppression specifications types.
virtual ~negated_suppression_base()
Destructor of the negated_suppression_base.
type_suppression::insertion_range::integer_boundary_sptr is_integer_boundary(type_suppression::insertion_range::boundary_sptr b)
Tests if a given instance of type_suppression::insertion_range::boundary is actually an integer bound...
bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
const diff * peel_qualified_diff(const diff *dif)
If a diff node is about changes between two qualified types, get the diff node about changes between ...
change_kind
The kind of change the current function suppression should apply to.
void set_allow_other_aliases(bool f)
Setter for the "allow_other_aliases" property of the function suppression specification.
const string & get_symbol_version() const
Getter for the version of the symbol of the variable the user wants the current specification to desi...
var_decl_sptr find_first_data_member_matching_regexp(const class_or_union &t, const regex::regex_t_sptr &r)
Find the first data member of a class or union which name matches a regular expression.
vector< suppression_sptr > suppressions_type
Convenience typedef for a vector of suppression_sptr.
variable_suppression_sptr is_variable_suppression(const suppression_sptr s)
Test if an instance of suppression is an instance of variable_suppression.
bool is_union_type(const type_or_decl_base &t)
Test if a type is a union_decl.
shared_ptr< parameter_spec > parameter_spec_sptr
Convenience typedef for shared_ptr of parameter_spec.
const string & get_symbol_name_regex_str() const
Getter of the regular expression for a family of symbol names of the variables this specification is ...
void append_parameter_specs(const parameter_spec_sptr)
Append a specification of a parameter of the function specification.
var_decl_sptr find_last_data_member_matching_regexp(const class_or_union &t, const regex::regex_t_sptr ®ex)
Find the last data member of a class or union which name matches a regular expression.
function_decl * is_function_decl(const type_or_decl_base *d)
Test whether a declaration is a function_decl.
const type_base_sptr get_type() const
Getter of the type of the variable.
void set_data_member_insertion_ranges(const insertion_ranges &r)
Setter for the vector of data member insertion ranges that specifies where a data member is inserted ...
void set_potential_data_member_names(const string_set_type &) const
Setter of the "potential_data_member_names" property.
bool suppression_matches_soname_or_filename(const string &soname, const string &filename, const suppression_base &suppr)
Test if a given SONAME or file name is matched by a given suppression specification.
virtual bool suppresses_diff(const diff *diff) const
Test if instances of this file_suppression suppresses a certain instance of diff. ...
bool read_function_call_expr(std::istream &input, function_call_expr_sptr &expr)
Read a function call expression and build its representation.
const string & get_file_name_not_regex_str() const
Getter for the "file_name_not_regex" property of the current instance of suppression_base.
static change_kind parse_change_kind(const string &)
Parses a string containing the content of the "change-kind" property and returns the an instance of f...
change_kind
The kind of change the current variable suppression should apply to.
shared_ptr< tuple_property_value > tuple_property_value_sptr
Convenience typedef for a shared_ptr to a tuple_property_value.
const string & get_name() const
Get the name of the section.
virtual bool suppresses_diff(const diff *diff) const
Evaluate this suppression specification on a given diff node and say if the diff node should be suppr...
shared_ptr< tuple_property > tuple_property_sptr
Convenience typedef for a shared_ptr of tuple_property.
const string & get_type_name() const
Getter for the name of the type of the variable the user wants the current specification to designate...
vector< parameter_spec_sptr > parameter_specs_type
Convenience typedef for vector of parameter_spec_sptr.
array_type_def * is_array_type(const type_or_decl_base *type)
Test if a type is an array_type_def.
bool suppresses_variable(const var_decl *var, change_kind k, const diff_context_sptr cxt) const
Evaluate the current variable suppression specification on a given var_decl and say if a report about...
The function was added to the second subject of the diff.
Abstraction of a type suppression specification.
shared_ptr< list_property > list_property_sptr
A convenience typedef for a shared_ptr to a list_property.
shared_ptr< fn_call_expr_boundary > fn_call_expr_boundary_sptr
Convenience typedef for a shared_ptr to a fn_call_expr_boundary.
void set_name_not_regex_str(const string &)
Setter for the "name_not_regexp" property of the specification.
file_suppression_sptr file_is_suppressed(const string &file_path, const suppressions_type &sprs)
Test if a given file path is "suppressed" by at least one file suppression specification among a vect...
void set_reach_kind(reach_kind k)
Setter of the way the diff node matching the current suppression specification is to be reached...
bool is_function() const
Test if the current instance of elf_symbol is a function symbol or not.
const string & get_type_name() const
Getter for the name of the type about which diff reports should be suppressed.
const string & get_name() const
Getter for the name of the named boundary.
virtual ~variable_suppression()
Virtual destructor for the variable_suppression type. variable_suppression type. ...
bool check_sufficient_props(const char *const *names, size_t count, const ini::config::section §ion)
Check if a section has at least one of the given properties.
void set_symbol_name(const string &n)
Setter for the name of symbol of the function the user wants this specification to designate...
const parameter_specs_type & get_parameter_specs() const
Getter for a vector of parameter specifications to specify properties of the parameters of the functi...
void set_change_kind(change_kind k)
Setter of the "change-kind" property.
shared_ptr< class_decl > class_decl_sptr
Convenience typedef for a shared pointer on a class_decl.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Compute the qualified name of the decl.
const string_changed_enumerator_map & changed_enumerators() const
const insertion_ranges & get_data_member_insertion_ranges() const
Getter for the vector of data member insertion range that specifiers where a data member is inserted ...
bool get_has_size_change() const
Getter of the "has_size_change" property.
bool suppression_matches_soname(const string &soname, const suppression_base &suppr)
Test if a given SONAME is matched by a given suppression specification.
const string get_label() const
Getter for the label associated to this suppression specification.
version & get_version() const
Getter for the version of the current instanc of elf_symbol.
void set_has_size_change(bool flag)
Setter of the "has_size_change" property.
string get_name(const type_or_decl_base *tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type or a decl...
void set_parameter_specs(parameter_specs_type &)
Setter for a vector of parameter specifications to specify properties of the parameters of the functi...
bool match(const regex_t_sptr &r, const std::string &str)
See if a string matches a regex.
bool suppresses_file(const string &file_path)
Test if a instances of this file_suppression suppresses a given file.
This represents all the changes possibly described by this enum. It's a logical 'OR' of all the chang...
The private data of suppression_base.
void set_label(const string &)
Setter for the label associated to this suppression specification.
Abstraction of a function suppression specification.
Abstracts a diff between two instances of var_decl.
const std::string & corpus_path() const
Getter of the path to the file which an ABI corpus is to be created for.
shared_ptr< boundary > boundary_sptr
Convenience typedef for a shared_ptr to boundary.
const char * get_private_types_suppr_spec_label()
list_property_value * is_list_property_value(const property_value *v)
Test if an instance of is a list_property_value.
void set_drops_artifact_from_ir(bool)
Set the flag that says whether the current suppression specification is to avoid adding the matched A...
The abstraction of a variable suppression specification.
const string & get_source_location_to_keep_regex_str() const
Getter of the regular expression string that designates the source location paths of types that shoul...
property_sptr find_property(const string &prop_name) const
Find a property that has a given name.
const class_or_union_diff * is_class_or_union_diff(const diff *d)
Test if a diff node is a class_or_union_diff node.
const string & get_return_type_regex_str() const
Getter for a regular expression for a family of return type names for functions the user wants the cu...
An insertion_range boundary that is expressed as an integer value. That integer value is usually a bi...
The abstraction of one section of the .ini config.
const reference_diff * is_reference_diff(const diff *diff)
Test if a diff node is about differences between two references.
void set_parameter_type_name_regex_str(const string &)
Setter for the regular expression that defines a set of type names for the parameter designated by th...
~fn_call_expr_boundary()
Destructor of type_suppression::insertion_range::fn_call_expr_boundary.
uint64_t as_integer() const
Return the integer value of the current instance of type_suppression::insertion_range::integer_bounda...
void set_type_name_regex_str(const string &)
Setter for the regular expression for a family of type names of variables the user wants the current ...
const diff * get_typedef_diff_underlying_type_diff(const diff *diff)
Return the leaf underlying diff node of a typedef_diff node.
const string & dt_soname() const
Getter for the SONAME of the analyzed binary.
variable_suppression(const string &label="", const string &name="", const string &name_regex_str="", const string &symbol_name="", const string &symbol_name_regex_str="", const string &symbol_version="", const string &symbol_version_regex_str="", const string &type_name="", const string &type_name_regex_str="")
Constructor for the variable_suppression type.
const type_diff_base * is_type_diff(const diff *diff)
Test if a diff node is about differences between types.
The base class of suppression specifications that are defined by the negation of matching clauses...
const data_members & get_data_members() const
Get the data members of this class_or_union.
shared_ptr< variable_suppression > variable_suppression_sptr
A convenience typedef for a shared pointer to variable_suppression.
const string & get_name() const
Getter for the name of the variable the user wants the current specification to designate. This property might be empty, in which case it's ignored at evaluation time.
void set_soname_regex_str(const string ®exp)
Setter of the "soname_regex_str property of the current instance of suppression_base.
shared_ptr< integer_boundary > integer_boundary_sptr
Convenience typedef for a shared_ptr to a integer_boundary.
bool is_private_type_suppr_spec(const type_suppression &s)
Test if a type suppression specification represents a private type suppression automatically generate...
void set_file_name_regex_str(const string ®exp)
Setter for the "file_name_regex" property of the current instance of suppression_base.
void set_symbol_name_regex_str(const string &)
Setter of the regular expression for a family of symbol names of the variables this specification is ...
shared_ptr< function_suppression > function_suppression_sptr
Convenience typedef for a shared pointer to function_suppression.
var_decl_sptr get_last_data_member(const class_or_union &klass)
Get the last data member of a class type.
void set_file_name_not_regex_str(const string ®exp)
Setter for the "file_name_not_regex" property of the current instance of suppression_base.
const string & get_symbol_name_regex_str() const
Getter for a regular expression for a family of names of symbols of functions the user wants this spe...
A change in a sub-type of the function.
type_or_decl_base_sptr second_subject() const
Getter of the second subject of the diff.
void set_type_name_not_regex_str(const string &name_regex_str)
Setter for the "type_name_not_regex_str" property of the type suppression specification.
const string & get_symbol_version_regex_str() const
Getter for a regular expression for a family of versions of symbols of functions the user wants the c...
reach_kind get_reach_kind() const
Getter of the way the diff node matching the current suppression specification is to be reached...
void set_name_regex_str(const string &)
Setter for a regular expression for a family of names of functions the user wants the current specifi...
var_decl_sptr has_flexible_array_data_member(const class_decl &klass)
Test if the last data member of a class is an array with non-finite data member.
const string & get_name() const
Getter for the name of the function the user wants the current specification to designate. This might be empty, in which case it's ignored at evaluation time.
void set_changed_enumerators_regexp(const vector< regex::regex_t_sptr > &)
Setter of the vector of the regular expression strings for changed enumerators that are supposed to b...
void set_symbol_name_regex_str(const string &)
Setter for a regular expression for a family of names of symbols of functions the user wants this spe...
method_type_sptr is_method_type(const type_or_decl_base_sptr &t)
Test whether a type is a method_type.
const string_set_type & get_potential_data_member_names() const
Getter of the "potential_data_member_names" property.
bool get_consider_type_kind() const
Getter of the property that says whether to consider the kind of type this suppression is about...
type_base_sptr peel_typedef_type(const type_base_sptr &type)
Return the leaf underlying type node of a typedef_decl node.
void set_symbol_name_not_regex_str(const string &)
Setter for a regular expression for a family of names of symbols of variables the user wants this spe...
const diff_context_sptr context() const
Getter of the context of the current diff.
function_suppression::change_kind operator&(function_suppression::change_kind l, function_suppression::change_kind r)
The bitwise 'and' operator for the enum function_suppression::change_kind.
bool has_soname_related_property() const
Test if the current suppression has a property related to SONAMEs.
This represents all the changes possibly described by this enum. It's a logical 'OR' of all the chang...
const enum_type_decl_sptr second_enum() const
const string & get_parameter_type_name() const
Getter for the type name of the parameter designated by this specification.
negated_suppression_base()
Constructor of the negated_suppression_base.
const unsigned_var_diff_sptr_map & changed_data_members() const
Getter of the map of data members that got replaced by another data member. The key of the map is the...
bool is_function_suppressed(const fe_iface &fe, const string &fn_name, const string &fn_linkage_name, bool require_drop_property)
Test if a function is matched by at least one suppression specification associated with a given front...
void set_name_regex_str(const string &)
Setter for the regular expression for a family of names of variables the user wants the current speci...