20#include "abg-reporter-priv.h" 
  115  for (string_enumerator_map::const_iterator i = enumerators_map.begin();
 
  116       i != enumerators_map.end();
 
  118    sorted.push_back(i->second);
 
  120  std::sort(sorted.begin(), sorted.end(), comp);
 
  132  for (string_changed_enumerator_map::const_iterator i =
 
  133     enumerators_map.begin();
 
  134       i != enumerators_map.end();
 
  136    sorted.push_back(i->second);
 
  139  std::sort(sorted.begin(), sorted.end(), comp);
 
  149          vector<decl_base_sptr>& sorted)
 
  151  sorted.reserve(data_members.size());
 
  152  for (string_decl_base_sptr_map::const_iterator i = data_members.begin();
 
  153       i != data_members.end();
 
  155    sorted.push_back(i->second);
 
  158  std::sort(sorted.begin(), sorted.end(), comp);
 
  168  std::sort(to_sort.begin(), to_sort.end(), comp);
 
  179                 vector<const function_decl*>& sorted)
 
  181  sorted.reserve(map.size());
 
  182  for (string_function_ptr_map::const_iterator i = map.begin();
 
  185    sorted.push_back(i->second);
 
  188  std::sort(sorted.begin(), sorted.end(), comp);
 
  202  sorted.reserve(map.size());
 
  203  for (string_member_function_sptr_map::const_iterator i = map.begin();
 
  206    sorted.push_back(i->second);
 
  209  std::sort(sorted.begin(), sorted.end(), comp);
 
  225  sorted.reserve(map.size());
 
  226  for (string_function_decl_diff_sptr_map::const_iterator i = map.begin();
 
  229    sorted.push_back(i->second);
 
  231  std::sort(sorted.begin(), sorted.end(), comp);
 
  244  sorted.reserve(map.size());
 
  245  for (string_var_diff_sptr_map::const_iterator i = map.begin();
 
  248    sorted.push_back(i->second);
 
  251  std::sort(sorted.begin(), sorted.end(), comp);
 
  265               vector<elf_symbol_sptr>& sorted)
 
  267  for (string_elf_symbol_map::const_iterator i = map.begin();
 
  270    sorted.push_back(i->second);
 
  273  std::sort(sorted.begin(), sorted.end(), comp);
 
  286            vector<const var_decl*>& sorted)
 
  288  for (string_var_ptr_map::const_iterator i = map.begin();
 
  291    sorted.push_back(i->second);
 
  294  std::sort(sorted.begin(), sorted.end(), comp);
 
  307  sorted.reserve(map.size());
 
  308  for (string_var_diff_sptr_map::const_iterator i = map.begin();
 
  311    sorted.push_back(i->second);
 
  313  std::sort(sorted.begin(), sorted.end(), comp);
 
  326  sorted.reserve(map.size());
 
  327  for (unsigned_var_diff_sptr_map::const_iterator i = map.begin();
 
  330    sorted.push_back(i->second);
 
  332  std::sort(sorted.begin(), sorted.end(), comp);
 
  348  sorted.reserve(map.size());
 
  349  for (string_function_decl_diff_sptr_map::const_iterator i = map.begin();
 
  352    sorted.push_back(i->second);
 
  355  sort(sorted.begin(), sorted.end(), comp);
 
  369  sorted.reserve(map.size());
 
  370  for (string_diff_sptr_map::const_iterator i = map.begin();
 
  373    sorted.push_back(i->second);
 
  376  sort(sorted.begin(), sorted.end(), comp);
 
  390  sorted.reserve(map.size());
 
  391  for (string_diff_ptr_map::const_iterator i = map.begin();
 
  394    sorted.push_back(i->second);
 
  397  sort(sorted.begin(), sorted.end(), comp);
 
  411  for (string_base_diff_sptr_map::const_iterator i = map.begin();
 
  414    sorted.push_back(i->second);
 
  416  sort(sorted.begin(), sorted.end(), comp);
 
  425  for (string_base_sptr_map::const_iterator i = m.begin();
 
  428    sorted.push_back(i->second);
 
  431  std::sort(sorted.begin(), sorted.end(), comp);
 
  443                  vector<fn_parm_diff_sptr>&        sorted)
 
  445  sorted.reserve(map.size());
 
  446  for (unsigned_fn_parm_diff_sptr_map::const_iterator i = map.begin();
 
  449    sorted.push_back(i->second);
 
  452  std::sort(sorted.begin(), sorted.end(), comp);
 
  464                  vector<fn_parm_diff_sptr>&        sorted)
 
  466  sorted.reserve(map.size());
 
  467  for (string_fn_parm_diff_sptr_map::const_iterator i = map.begin();
 
  470    sorted.push_back(i->second);
 
  473  std::sort(sorted.begin(), sorted.end(), comp);
 
  484             vector<function_decl::parameter_sptr>& sorted)
 
  486  for (string_parm_map::const_iterator i = map.begin();
 
  489    sorted.push_back(i->second);
 
  492  std::sort(sorted.begin(), sorted.end(), comp);
 
  504           vector<type_or_decl_base_sptr>& sorted)
 
  507  for (artifact_sptr_set_type::const_iterator it = set.begin();
 
  510    sorted.push_back(*it);
 
  513  std::sort(sorted.begin(), sorted.end(), comp);
 
  528                   vector<type_base_sptr>& sorted)
 
  530  for (string_type_base_sptr_map::const_iterator i = map.begin();
 
  533    sorted.push_back(i->second);
 
  536  std::sort(sorted.begin(), sorted.end(), comp);
 
  548    return type_base_sptr();
 
  550  type_base_sptr ut = t->get_underlying_type();
 
  551  qualified_type_def_sptr qut = dynamic_pointer_cast<qualified_type_def>(ut);
 
  579  if (decl_base_sptr decl = 
is_decl(first))
 
  596                   | 
static_cast<unsigned>(r));}
 
  603                    & 
static_cast<unsigned>(r));
 
  609{
return static_cast<visiting_kind>(~static_cast<unsigned>(l));}
 
  683    if (dif->first_class_or_union()->get_is_anonymous())
 
  739    if (d->has_local_changes())
 
  913diff_context::diff_context()
 
  929diff_context::~diff_context() = 
default;
 
  936{
return priv_->do_log_;}
 
  950{priv_->corpus_diff_ = d;}
 
  957{
return priv_->corpus_diff_;}
 
  966  if (priv_->corpus_diff_)
 
  967    return priv_->corpus_diff_->first_corpus();
 
  968  return corpus_sptr();
 
  979  if (priv_->corpus_diff_)
 
  980    return priv_->corpus_diff_->second_corpus();
 
  981  return corpus_sptr();
 
  990  if (!priv_->reporter_)
 
  998  return priv_->reporter_;
 
 1006{priv_->reporter_ = r;}
 
 1020  types_or_decls_diff_map_type::const_iterator i =
 
 1021    priv_->types_or_decls_diff_map.find(std::make_pair(first, second));
 
 1022  if (i != priv_->types_or_decls_diff_map.end())
 
 1036diff_context::has_diff_for_types(
const type_base_sptr first,
 
 1037                  const type_base_sptr second)
 const 
 1038{
return has_diff_for(first, second);}
 
 1046diff_context::has_diff_for(
const diff* d)
 const 
 1047{
return has_diff_for(d->first_subject(), d->second_subject()).get();}
 
 1055diff_context::has_diff_for(
const diff_sptr d)
 const 
 1056{
return has_diff_for(d->first_subject(), d->second_subject());}
 
 1065{
return priv_->allowed_category_;}
 
 1074{priv_->allowed_category_ = c;}
 
 1087{priv_->allowed_category_ = priv_->allowed_category_ | c;}
 
 1098{priv_->allowed_category_ = priv_->allowed_category_ & ~c;}
 
 1114{priv_->types_or_decls_diff_map[std::make_pair(first, second)] = d;}
 
 1120diff_context::add_diff(
const diff* d)
 
 1133diff_context::add_diff(
const diff_sptr d)
 
 1136      add_diff(d->first_subject(), d->second_subject(), d);
 
 1153{
return has_diff_for(first, second);}
 
 1165{
return has_diff_for(d);}
 
 1181  if (!has_diff_for(first, second))
 
 1183      add_diff(first, second, d);
 
 1184      priv_->canonical_diffs.push_back(d);
 
 1209      canonical = canonical_diff;
 
 1210      set_canonical_diff_for(first, second, canonical);
 
 1253{priv_->live_diffs_.insert(d);}
 
 1266  size_t ptr_value = 
reinterpret_cast<size_t>(canonical);
 
 1267  pointer_map::iterator it = priv_->visited_diff_nodes_.find(ptr_value);
 
 1268  if (it != priv_->visited_diff_nodes_.end())
 
 1269    return reinterpret_cast<diff*
>(it->second);
 
 1302   size_t canonical_ptr_value = 
reinterpret_cast<size_t>(canonical);
 
 1303   size_t diff_ptr_value = 
reinterpret_cast<size_t>(d);
 
 1304   priv_->visited_diff_nodes_[canonical_ptr_value] = diff_ptr_value;
 
 1310{priv_->visited_diff_nodes_.clear();}
 
 1320{priv_->forbid_visiting_a_node_twice_ = f;}
 
 1330{priv_->reset_visited_diffs_for_each_interface_ = f;}
 
 1338{
return priv_->forbid_visiting_a_node_twice_;}
 
 1352  return (priv_->forbid_visiting_a_node_twice_
 
 1353      && priv_->reset_visited_diffs_for_each_interface_);
 
 1361{
return priv_->filters_;}
 
 1369{priv_->filters_.push_back(f);}
 
 1387  for (filtering::filters::const_iterator i = 
diff_filters().begin();
 
 1394      std::cerr << 
"applying a filter to diff '" 
 1405      std::cerr << 
"filter applied!:" << t << 
"\n";
 
 1407      std::cerr << 
"propagating categories for the same diff node ... \n";
 
 1416      std::cerr << 
"category propagated!: " << t << 
"\n";
 
 1437  for (filtering::filters::const_iterator i = 
diff_filters().begin();
 
 1452{
return priv_->suppressions_;}
 
 1463  priv_->negated_suppressions_.clear();
 
 1464  priv_->direct_suppressions_.clear();
 
 1465  return priv_->suppressions_;
 
 1484  if (priv_->negated_suppressions_.empty())
 
 1487    priv_->negated_suppressions_.push_back(s);
 
 1489  return priv_->negated_suppressions_;
 
 1507   if (priv_->direct_suppressions_.empty())
 
 1511      priv_->direct_suppressions_.push_back(s);
 
 1513   return priv_->direct_suppressions_;
 
 1524  priv_->suppressions_.push_back(suppr);
 
 1527  priv_->negated_suppressions_.clear();
 
 1528  priv_->direct_suppressions_.clear();
 
 1539  priv_->suppressions_.insert(priv_->suppressions_.end(),
 
 1540                  supprs.begin(), supprs.end());
 
 1549{
return priv_->perform_change_categorization_;}
 
 1556{priv_->perform_change_categorization_ = f;}
 
 1570  priv_->leaf_changes_only_ = f;
 
 1580{
return priv_->leaf_changes_only_;}
 
 1590{
return priv_->hex_values_;}
 
 1600{priv_->hex_values_ = f;}
 
 1609{
return priv_->show_offsets_sizes_in_bits_;}
 
 1618{priv_->show_offsets_sizes_in_bits_ = f;}
 
 1627{priv_->show_relative_offset_changes_ = f;}
 
 1636{
return priv_->show_relative_offset_changes_;}
 
 1644{priv_->show_stats_only_ = f;}
 
 1652{
return priv_->show_stats_only_;}
 
 1660{priv_->show_soname_change_ = f;}
 
 1668{
return priv_->show_soname_change_;}
 
 1676{priv_->show_architecture_change_ = f;}
 
 1684{
return priv_->show_architecture_change_;}
 
 1691{priv_->show_deleted_fns_ = f;}
 
 1697{
return priv_->show_deleted_fns_;}
 
 1704{priv_->show_changed_fns_ = f;}
 
 1709{
return priv_->show_changed_fns_;}
 
 1716{priv_->show_added_fns_ = f;}
 
 1722{
return priv_->show_added_fns_;}
 
 1729{priv_->show_deleted_vars_ = f;}
 
 1735{
return priv_->show_deleted_vars_;}
 
 1742{priv_->show_changed_vars_ = f;}
 
 1747{
return priv_->show_changed_vars_;}
 
 1754{priv_->show_added_vars_ = f;}
 
 1760{
return priv_->show_added_vars_;}
 
 1763diff_context::show_linkage_names()
 const 
 1764{
return priv_->show_linkage_names_;}
 
 1767diff_context::show_linkage_names(
bool f)
 
 1768{priv_->show_linkage_names_= f;}
 
 1775{priv_->show_locs_= f;}
 
 1781{
return priv_->show_locs_;}
 
 1790{
return priv_->show_redundant_changes_;}
 
 1799{priv_->show_redundant_changes_ = f;}
 
 1807{
return priv_->show_syms_unreferenced_by_di_;}
 
 1815{priv_->show_syms_unreferenced_by_di_ = f;}
 
 1824{
return priv_->show_added_syms_unreferenced_by_di_;}
 
 1833{priv_->show_added_syms_unreferenced_by_di_ = f;}
 
 1842{priv_->show_unreachable_types_ = f;}
 
 1851{
return priv_->show_unreachable_types_;}
 
 1862{
return priv_->show_impacted_interfaces_;}
 
 1873{priv_->show_impacted_interfaces_ = f;}
 
 1882{priv_->default_output_stream_ = o;}
 
 1891{
return priv_->default_output_stream_;}
 
 1899{priv_->error_output_stream_ = o;}
 
 1907{
return priv_->error_output_stream_;}
 
 1916{
return priv_->dump_diff_tree_;}
 
 1925{priv_->dump_diff_tree_ = f;}
 
 1964  : priv_(new priv(first_subject, second_subject,
 
 1986  : priv_(new priv(first_subject, second_subject,
 
 2025  if (priv_->canonical_diff_)
 
 2026    priv_->canonical_diff_->priv_->traversing_ = 
true;
 
 2027  priv_->traversing_ = 
true;
 
 2044  if (priv_->canonical_diff_)
 
 2045    return priv_->canonical_diff_->priv_->traversing_;
 
 2046  return priv_->traversing_;
 
 2060  if (priv_->canonical_diff_)
 
 2061    priv_->canonical_diff_->priv_->traversing_ = 
false;
 
 2062  priv_->traversing_ = 
false;
 
 2078  if (diff::priv_->finished_)
 
 2081  diff::priv_->finished_ = 
true;
 
 2089{
return dynamic_pointer_cast<type_or_decl_base>(priv_->first_subject_);}
 
 2096{
return dynamic_pointer_cast<type_or_decl_base>(priv_->second_subject_);}
 
 2103{
return priv_->children_;}
 
 2110{
return priv_->parent_;}
 
 2123{
return priv_->canonical_diff_;}
 
 2131{priv_->canonical_diff_ = d;}
 
 2144  context()->keep_diff_alive(d);
 
 2151  priv_->children_.push_back(d.get());
 
 2153  d->priv_->parent_ = 
this;
 
 2161{
return priv_->get_context();}
 
 2178  if (priv_->canonical_diff_)
 
 2179    return priv_->canonical_diff_->priv_->currently_reporting_;
 
 2180  return priv_->currently_reporting_;
 
 2191  if (priv_->canonical_diff_)
 
 2192    priv_->canonical_diff_->priv_->currently_reporting_ = f;
 
 2193  priv_->currently_reporting_ = f;
 
 2204  return priv_->canonical_diff_->priv_->reported_once_;
 
 2264  bool already_visited = 
false;
 
 2265  if (
context()->visiting_a_node_twice_is_forbidden()
 
 2266      && 
context()->diff_has_been_visited(
this))
 
 2267    already_visited = 
true;
 
 2269  bool mark_visited_nodes_as_traversed =
 
 2272  if (!already_visited && !v.
visit(
this, 
true))
 
 2275      if (mark_visited_nodes_as_traversed)
 
 2276    context()->mark_diff_as_visited(
this);
 
 2282      && !already_visited)
 
 2289      if (!(*i)->traverse(v))
 
 2292          if (mark_visited_nodes_as_traversed)
 
 2293        context()->mark_diff_as_visited(
this);
 
 2301  if (!v.
visit(
this, 
false))
 
 2304      if (mark_visited_nodes_as_traversed)
 
 2305    context()->mark_diff_as_visited(
this);
 
 2310  if (!already_visited && mark_visited_nodes_as_traversed)
 
 2311    context()->mark_diff_as_visited(
this);
 
 2325  priv_->canonical_diff_->priv_->reported_once_ = f;
 
 2326  priv_->reported_once_ = f;
 
 2338{
return priv_->local_category_;}
 
 2364{
return priv_->category_;}
 
 2379  priv_->category_ = priv_->category_ | c;
 
 2380  return priv_->category_;
 
 2394  priv_->local_category_ = priv_->local_category_ | c;
 
 2395  return priv_->local_category_;
 
 2423  priv_->category_ = priv_->category_ & ~c;
 
 2424  return priv_->category_;
 
 2438  priv_->local_category_ = priv_->local_category_ & ~c;
 
 2439  return priv_->local_category_;
 
 2449{priv_->category_ = c;}
 
 2456{priv_->local_category_ = c;}
 
 2481    && !canonical->is_allowed_by_specific_negated_suppression()
 
 2482    && !canonical->has_descendant_allowed_by_specific_negated_suppression()
 
 2483    && !canonical->has_parent_allowed_by_specific_negated_suppression())
 
 2524    return priv_->is_filtered_out(c);
 
 2535  bool is_private = 
false;
 
 2564  bool do_suppress = !
context()->negated_suppressions().empty();
 
 2568  for (
auto n : 
context()->negated_suppressions())
 
 2569    if (!n->suppresses_diff(
this))
 
 2571    do_suppress = 
false;
 
 2578  for (
auto d : 
context()->direct_suppressions())
 
 2579    if (d->suppresses_diff(
this))
 
 2583      is_private_type = 
true;
 
 2623  for (suppressions_type::const_iterator i = suppressions.begin();
 
 2624       i != suppressions.end();
 
 2628      && !(*i)->suppresses_diff(
this))
 
 2668  if (priv_->pretty_representation_.empty())
 
 2669    priv_->pretty_representation_ = 
"empty_diff";
 
 2670  return priv_->pretty_representation_;
 
 2697type_diff_base::type_diff_base(type_base_sptr   first_subject,
 
 2698                   type_base_sptr   second_subject,
 
 2700  : 
diff(first_subject, second_subject, ctxt),
 
 2704type_diff_base::~type_diff_base()
 
 2720                   decl_base_sptr   second_subject,
 
 2722  : 
diff(first_subject, second_subject, ctxt),
 
 2726decl_diff_base::~decl_diff_base()
 
 2737  if (diff::priv_->pretty_representation_.empty())
 
 2739      std::ostringstream o;
 
 2740      o << 
"distinct_diff[";
 
 2751      diff::priv_->pretty_representation_ = o.str();
 
 2753  return diff::priv_->pretty_representation_;
 
 2786  : 
diff(first, second, ctxt),
 
 2820  if (!priv_->compatible_child_diff)
 
 2832  return priv_->compatible_child_diff;
 
 2857  return typeid(f) != 
typeid(s);
 
 2875  return NO_CHANGE_KIND;
 
 2886  context()->get_reporter()->report(*
this, out, indent);
 
 2909  ctxt->initialize_canonical_diff(result);
 
 2934template<
typename DiffType>
 
 2940  if (shared_ptr<DiffType> f =
 
 2941      dynamic_pointer_cast<DiffType>(first))
 
 2943      shared_ptr<DiffType> s =
 
 2944    dynamic_pointer_cast<DiffType>(second);
 
 2970      dynamic_pointer_cast<class_decl>(first))
 
 2976      if (f->get_is_declaration_only())
 
 2983      if (s->get_is_declaration_only())
 
 3038  ((d = try_to_diff<type_decl>(f, s, ctxt))
 
 3039   ||(d = try_to_diff<enum_type_decl>(f, s, ctxt))
 
 3040   ||(d = try_to_diff<union_decl>(f, s,ctxt))
 
 3042   ||(d = try_to_diff<pointer_type_def>(f, s, ctxt))
 
 3043   ||(d = try_to_diff<reference_type_def>(f, s, ctxt))
 
 3044   ||(d = try_to_diff<ptr_to_mbr_type>(f, s, ctxt))
 
 3045   ||(d = try_to_diff<array_type_def::subrange_type>(f, s, ctxt))
 
 3046   ||(d = try_to_diff<array_type_def>(f, s, ctxt))
 
 3047   ||(d = try_to_diff<qualified_type_def>(f, s, ctxt))
 
 3048   ||(d = try_to_diff<typedef_decl>(f, s, ctxt))
 
 3049   ||(d = try_to_diff<function_type>(f, s, ctxt))
 
 3050   ||(d = try_to_diff_distinct_kinds(f, s, ctxt)));
 
 3060                   | 
static_cast<unsigned>(c2));}
 
 3079                   ^ 
static_cast<unsigned>(c2));}
 
 3084                   & 
static_cast<unsigned>(c2));}
 
 3088{
return static_cast<diff_category>(~static_cast<unsigned>(c));}
 
 3140  bool emitted_a_category = 
false;
 
 3144      o << 
"NO_CHANGE_CATEGORY";
 
 3145      emitted_a_category = 
true;
 
 3150      if (emitted_a_category)
 
 3152      o << 
"ACCESS_CHANGE_CATEGORY";
 
 3153      emitted_a_category |= 
true;
 
 3158      if (emitted_a_category)
 
 3160      o << 
"COMPATIBLE_TYPE_CHANGE_CATEGORY";
 
 3161      emitted_a_category |= 
true;
 
 3166      if (emitted_a_category)
 
 3168      o << 
"HARMLESS_DECL_NAME_CHANGE_CATEGORY";
 
 3169      emitted_a_category |= 
true;
 
 3174      if (emitted_a_category)
 
 3176      o << 
"NON_VIRT_MEM_FUN_CHANGE_CATEGORY";
 
 3177      emitted_a_category |= 
true;
 
 3182      if (emitted_a_category)
 
 3184      o << 
"STATIC_DATA_MEMBER_CHANGE_CATEGORY";
 
 3185      emitted_a_category |= 
true;
 
 3190      if (emitted_a_category)
 
 3192      o << 
"HARMLESS_ENUM_CHANGE_CATEGORY";
 
 3193      emitted_a_category |= 
true;
 
 3198      if (emitted_a_category)
 
 3200      o << 
"HARMLESS_DATA_MEMBER_CHANGE_CATEGORY";
 
 3201      emitted_a_category |= 
true;
 
 3206      if (emitted_a_category)
 
 3208      o << 
"HARMLESS_SYMBOL_ALIAS_CHANGE_CATEGORY";
 
 3209      emitted_a_category |= 
true;
 
 3214      if (emitted_a_category)
 
 3216      o << 
"HARMLESS_UNION_CHANGE_CATEGORY";
 
 3217      emitted_a_category |= 
true;
 
 3222      if (emitted_a_category)
 
 3224      o << 
"SUPPRESSED_CATEGORY";
 
 3225      emitted_a_category |= 
true;
 
 3230      if (emitted_a_category)
 
 3232      o << 
"PRIVATE_TYPE_CATEGORY";
 
 3233      emitted_a_category |= 
true;
 
 3238      if (emitted_a_category)
 
 3240      o << 
"SIZE_OR_OFFSET_CHANGE_CATEGORY";
 
 3241      emitted_a_category |= 
true;
 
 3246      if (emitted_a_category)
 
 3248      o << 
"VIRTUAL_MEMBER_CHANGE_CATEGORY";
 
 3249      emitted_a_category |= 
true;
 
 3254      if (emitted_a_category)
 
 3256      o << 
"REDUNDANT_CATEGORY";
 
 3257      emitted_a_category |= 
true;
 
 3262      if (emitted_a_category)
 
 3264      o << 
"TYPE_DECL_ONLY_DEF_CHANGE_CATEGORY";
 
 3265      emitted_a_category |= 
true;
 
 3270      if (emitted_a_category)
 
 3272      o << 
"FN_PARM_TYPE_TOP_CV_CHANGE_CATEGORY";
 
 3273      emitted_a_category |= 
true;
 
 3278      if (emitted_a_category)
 
 3280      o << 
"FN_PARM_TYPE_CV_CHANGE_CATEGORY";
 
 3281      emitted_a_category |= 
true;
 
 3286      if (emitted_a_category)
 
 3288      o << 
"FN_RETURN_TYPE_CV_CHANGE_CATEGORY";
 
 3289      emitted_a_category |= 
true;
 
 3294      if (emitted_a_category)
 
 3296      o << 
"FN_PARM_ADD_REMOVE_CHANGE_CATEGORY";
 
 3297      emitted_a_category |= 
true;
 
 3302      if (emitted_a_category)
 
 3304      o << 
"VAR_TYPE_CV_CHANGE_CATEGORY";
 
 3305      emitted_a_category |= 
true;
 
 3310      if (emitted_a_category)
 
 3312      o << 
"VOID_PTR_TO_PTR_CHANGE_CATEGORY";
 
 3313      emitted_a_category |= 
true;
 
 3318      if (emitted_a_category)
 
 3320      o << 
"BENIGN_INFINITE_ARRAY_CHANGE_CATEGORY";
 
 3321      emitted_a_category |= 
true;
 
 3326      if (emitted_a_category)
 
 3328      o << 
"HAS_ALLOWED_CHANGE_CATEGORY";
 
 3329      emitted_a_category |= 
true;
 
 3334      if (emitted_a_category)
 
 3336      o << 
"HAS_DESCENDANT_WITH_ALLOWED_CHANGE_CATEGORY";
 
 3337      emitted_a_category |= 
true;
 
 3342      if (emitted_a_category)
 
 3344      o << 
"HAS_PARENT_WITH_ALLOWED_CHANGE_CATEGORY";
 
 3345      emitted_a_category |= 
true;
 
 3368compute_diff_for_decls(
const decl_base_sptr first,
 
 3369               const decl_base_sptr second,
 
 3375  ((d = try_to_diff<function_decl>(first, second, ctxt))
 
 3376   || (d = try_to_diff<var_decl>(first, second, ctxt))
 
 3377   || (d = try_to_diff_distinct_kinds(first, second, ctxt)));
 
 3400         const decl_base_sptr   second,
 
 3403  if (!first || !second)
 
 3408    d = compute_diff_for_types(first, second, ctxt);
 
 3410    d = compute_diff_for_decls(first, second, ctxt);
 
 3430         const type_base_sptr   second,
 
 3436  diff_sptr d = compute_diff_for_types(f,s, ctxt);
 
 3451  string prefix= 
"diff of ";
 
 3471  if (diff::priv_->pretty_representation_.empty())
 
 3473      std::ostringstream o;
 
 3479      diff::priv_->pretty_representation_ = o.str();
 
 3481  return diff::priv_->pretty_representation_;
 
 3524  if (
diff_sptr result = priv_->type_diff_.lock())
 
 3531      context()->keep_diff_alive(result);
 
 3532      priv_->type_diff_ = result;
 
 3553  return ir::NO_CHANGE_KIND;
 
 3565  context()->get_reporter()->report(*
this, out, indent);
 
 3586  ctxt->initialize_canonical_diff(d);
 
 3616    priv_(new 
priv(underlying))
 
 3624{
return dynamic_pointer_cast<pointer_type_def>(
first_subject());}
 
 3631{
return dynamic_pointer_cast<pointer_type_def>(
second_subject());}
 
 3638  if (diff::priv_->pretty_representation_.empty())
 
 3640      std::ostringstream o;
 
 3641      o << 
"pointer_diff[" 
 3646      diff::priv_->pretty_representation_ = o.str();
 
 3648  return diff::priv_->pretty_representation_;
 
 3667  return ir::NO_CHANGE_KIND;
 
 3676{
return priv_->underlying_type_diff_;}
 
 3685{priv_->underlying_type_diff_ = d;}
 
 3696  context()->get_reporter()->report(*
this, out, indent);
 
 3716  diff_sptr d = compute_diff_for_types(first->get_pointed_to_type(),
 
 3717                       second->get_pointed_to_type(),
 
 3720  ctxt->initialize_canonical_diff(result);
 
 3745    priv_(new 
priv(underlying_type_diff))
 
 3773{
return priv_->underlying_type_diff_;}
 
 3782    if (diff::priv_->pretty_representation_.empty())
 
 3784      std::ostringstream o;
 
 3785      o << 
"subrange_diff[" 
 3790      diff::priv_->pretty_representation_ = o.str();
 
 3792    return diff::priv_->pretty_representation_;
 
 3814  return ir::NO_CHANGE_KIND;
 
 3824{
context()->get_reporter()->report(*
this, out, indent);}
 
 3852  diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
 
 3853                       second->get_underlying_type(),
 
 3857  ctxt->initialize_canonical_diff(result);
 
 3890    priv_(new 
priv(element_type_diff))
 
 3898{
return dynamic_pointer_cast<array_type_def>(
first_subject());}
 
 3912{
return priv_->element_type_diff_;}
 
 3919{priv_->element_type_diff_ = d;}
 
 3926  if (diff::priv_->pretty_representation_.empty())
 
 3928      std::ostringstream o;
 
 3934      diff::priv_->pretty_representation_ = o.str();
 
 3936  return diff::priv_->pretty_representation_;
 
 3953  if (f->get_name() != s->get_name())
 
 3955  if (f->get_size_in_bits() != s->get_size_in_bits())
 
 3957  if (f->get_alignment_in_bits() != s->get_alignment_in_bits())
 
 3977  return ir::NO_CHANGE_KIND;
 
 3988  context()->get_reporter()->report(*
this, out, indent);
 
 4006  diff_sptr d = compute_diff_for_types(first->get_element_type(),
 
 4007                       second->get_element_type(),
 
 4010  ctxt->initialize_canonical_diff(result);
 
 4038    priv_(new 
priv(underlying))
 
 4046{
return dynamic_pointer_cast<reference_type_def>(
first_subject());}
 
 4053{
return dynamic_pointer_cast<reference_type_def>(
second_subject());}
 
 4061{
return priv_->underlying_type_diff_;}
 
 4069  priv_->underlying_type_diff_ = d;
 
 4070  return priv_->underlying_type_diff_;
 
 4078  if (diff::priv_->pretty_representation_.empty())
 
 4080      std::ostringstream o;
 
 4081      o << 
"reference_diff[" 
 4086      diff::priv_->pretty_representation_ = o.str();
 
 4088  return diff::priv_->pretty_representation_;
 
 4109  return ir::NO_CHANGE_KIND;
 
 4120  context()->get_reporter()->report(*
this, out, indent);
 
 4138  diff_sptr d = compute_diff_for_types(first->get_pointed_to_type(),
 
 4139                       second->get_pointed_to_type(),
 
 4142  ctxt->initialize_canonical_diff(result);
 
 4169    priv_(new 
priv(member_type_diff, containing_type_diff))
 
 4179{
return dynamic_pointer_cast<ptr_to_mbr_type>(
first_subject());}
 
 4197{
return priv_->member_type_diff_;}
 
 4206{
return priv_->containing_type_diff_;}
 
 4226  return ir::NO_CHANGE_KIND;
 
 4236  if (diff::priv_->pretty_representation_.empty())
 
 4238      std::ostringstream o;
 
 4239      o << 
"ptr_to_mbr_diff[" 
 4244      diff::priv_->pretty_representation_ = o.str();
 
 4246  return diff::priv_->pretty_representation_;
 
 4252  context()->get_reporter()->report(*
this, out, indent);
 
 4289         is_type(second->get_member_type()),
 
 4294         is_type(second->get_containing_type()),
 
 4299                          containing_type_diff,
 
 4301  ctxt->initialize_canonical_diff(result);
 
 4326                     qualified_type_def_sptr    second,
 
 4330    priv_(new 
priv(under))
 
 4336const qualified_type_def_sptr
 
 4338{
return dynamic_pointer_cast<qualified_type_def>(
first_subject());}
 
 4343const qualified_type_def_sptr
 
 4345{
return dynamic_pointer_cast<qualified_type_def>(
second_subject());}
 
 4354{
return priv_->underlying_type_diff;}
 
 4364  if (!priv_->leaf_underlying_type_diff)
 
 4365    priv_->leaf_underlying_type_diff
 
 4370  return priv_->leaf_underlying_type_diff;
 
 4380{priv_->underlying_type_diff = d;}
 
 4387  if (diff::priv_->pretty_representation_.empty())
 
 4389      std::ostringstream o;
 
 4390      o << 
"qualified_type_diff[" 
 4395      diff::priv_->pretty_representation_ = o.str();
 
 4397  return diff::priv_->pretty_representation_;
 
 4416  return ir::NO_CHANGE_KIND;
 
 4427  context()->get_reporter()->report(*
this, out, indent);
 
 4440qualified_type_diff_sptr
 
 4442         const qualified_type_def_sptr  second,
 
 4445  diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
 
 4446                       second->get_underlying_type(),
 
 4450  ctxt->initialize_canonical_diff(result);
 
 4463enum_diff::clear_lookup_tables()
 
 4465  priv_->deleted_enumerators_.clear();
 
 4466  priv_->inserted_enumerators_.clear();
 
 4467  priv_->changed_enumerators_.clear();
 
 4474enum_diff::lookup_tables_empty()
 const 
 4476  return (priv_->deleted_enumerators_.empty()
 
 4477      && priv_->inserted_enumerators_.empty()
 
 4478      && priv_->changed_enumerators_.empty());
 
 4484enum_diff::ensure_lookup_tables_populated()
 
 4486  if (!lookup_tables_empty())
 
 4490    edit_script e = priv_->enumerators_changes_;
 
 4492    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 4493     it != e.deletions().end();
 
 4496    unsigned i = it->index();
 
 4497    const enum_type_decl::enumerator& n =
 
 4499    const string& name = n.get_name();
 
 4500    ABG_ASSERT(priv_->deleted_enumerators_.find(n.get_name())
 
 4501           == priv_->deleted_enumerators_.end());
 
 4502    priv_->deleted_enumerators_[name] = n;
 
 4505    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 4506     it != e.insertions().end();
 
 4509    for (vector<unsigned>::const_iterator iit =
 
 4510           it->inserted_indexes().begin();
 
 4511         iit != it->inserted_indexes().end();
 
 4515        const enum_type_decl::enumerator& n =
 
 4517        const string& name = n.get_name();
 
 4518        ABG_ASSERT(priv_->inserted_enumerators_.find(n.get_name())
 
 4519           == priv_->inserted_enumerators_.end());
 
 4520        string_enumerator_map::const_iterator j =
 
 4521          priv_->deleted_enumerators_.find(name);
 
 4522        if (j == priv_->deleted_enumerators_.end())
 
 4523          priv_->inserted_enumerators_[name] = n;
 
 4527          priv_->changed_enumerators_[j->first] =
 
 4528            std::make_pair(j->second, n);
 
 4529        priv_->deleted_enumerators_.erase(j);
 
 4560    priv_(new 
priv(underlying_type_diff))
 
 4566{
return dynamic_pointer_cast<enum_type_decl>(
first_subject());}
 
 4576{
return priv_->underlying_type_diff_;}
 
 4581{
return priv_->deleted_enumerators_;}
 
 4586{
return priv_->inserted_enumerators_;}
 
 4591{
return priv_->changed_enumerators_;}
 
 4598  if (diff::priv_->pretty_representation_.empty())
 
 4600      std::ostringstream o;
 
 4606      diff::priv_->pretty_representation_ = o.str();
 
 4608  return diff::priv_->pretty_representation_;
 
 4627  return ir::NO_CHANGE_KIND;
 
 4638  context()->get_reporter()->report(*
this, out, indent);
 
 4660  diff_sptr ud = compute_diff_for_types(first->get_underlying_type(),
 
 4661                    second->get_underlying_type(),
 
 4663  enum_diff_sptr d(
new enum_diff(first, second, ud, ctxt));
 
 4664  if (first != second)
 
 4667           first->get_enumerators().end(),
 
 4668           second->get_enumerators().begin(),
 
 4669           second->get_enumerators().end(),
 
 4670           d->priv_->enumerators_changes_);
 
 4671      d->ensure_lookup_tables_populated();
 
 4673  ctxt->initialize_canonical_diff(d);
 
 4695  string qname = d->get_qualified_name();
 
 4696  string_diff_sptr_map::const_iterator it =
 
 4697    changed_member_types_.find(qname);
 
 4699  return ((it == changed_member_types_.end())
 
 4701      : it->second->second_subject());
 
 4718  string qname = d->get_qualified_name();
 
 4719  string_var_diff_sptr_map::const_iterator it =
 
 4720    subtype_changed_dm_.find(qname);
 
 4722  if (it == subtype_changed_dm_.end())
 
 4723    return decl_base_sptr();
 
 4724  return it->second->second_var();
 
 4742  string qname = d->get_qualified_name();
 
 4743  string_diff_sptr_map::const_iterator it =
 
 4744    changed_member_class_tmpls_.find(qname);
 
 4746  return ((it == changed_member_class_tmpls_.end())
 
 4748      : dynamic_pointer_cast<decl_base>(it->second->second_subject()));
 
 4759  for (string_decl_base_sptr_map::const_iterator i =
 
 4760     deleted_data_members_.begin();
 
 4761       i != deleted_data_members_.end();
 
 4778  for (string_decl_base_sptr_map::const_iterator i =
 
 4779     inserted_data_members_.begin();
 
 4780       i != inserted_data_members_.end();
 
 4800  size_t num_filtered= 0;
 
 4801  for (var_diff_sptrs_type::const_iterator i =
 
 4802     sorted_subtype_changed_dm_.begin();
 
 4803       i != sorted_subtype_changed_dm_.end();
 
 4808      if ((*i)->has_changes()
 
 4809          && !(*i)->has_local_changes_to_be_reported())
 
 4814      if ((*i)->is_filtered_out())
 
 4818  return num_filtered;
 
 4832  size_t num_filtered= 0;
 
 4834  for (unsigned_var_diff_sptr_map::const_iterator i = changed_dm_.begin();
 
 4835       i != changed_dm_.end();
 
 4851  return num_filtered;
 
 4860#define SKIP_MEM_FN_IF_VIRTUALITY_DISALLOWED                \ 
 4862    if (get_member_function_is_virtual(f)                   \ 
 4863    || get_member_function_is_virtual(s))               \ 
 4865    if (!(allowed_category | VIRTUAL_MEMBER_CHANGE_CATEGORY))   \ 
 4870    if (!(allowed_category | NON_VIRT_MEM_FUN_CHANGE_CATEGORY)) \ 
 4885  diff_category allowed_category = ctxt->get_allowed_category();
 
 4887  for (function_decl_diff_sptrs_type::const_iterator i =
 
 4888     sorted_changed_member_functions_.begin();
 
 4889       i != sorted_changed_member_functions_.end();
 
 4892      method_decl_sptr f =
 
 4893    dynamic_pointer_cast<method_decl>
 
 4894    ((*i)->first_function_decl());
 
 4897      method_decl_sptr s =
 
 4898    dynamic_pointer_cast<method_decl>
 
 4899    ((*i)->second_function_decl());
 
 4905      ctxt->maybe_apply_filters(
diff);
 
 4924  diff_category allowed_category = ctxt->get_allowed_category();
 
 4926  for (string_member_function_sptr_map::const_iterator i =
 
 4927     inserted_member_functions_.begin();
 
 4928       i != inserted_member_functions_.end();
 
 4931      method_decl_sptr f = i->second,
 
 4937      ctxt->maybe_apply_filters(
diff);
 
 4957  diff_category allowed_category = ctxt->get_allowed_category();
 
 4959  for (string_member_function_sptr_map::const_iterator i =
 
 4960     deleted_member_functions_.begin();
 
 4961       i != deleted_member_functions_.end();
 
 4964      method_decl_sptr f = i->second,
 
 4970      ctxt->maybe_apply_filters(
diff);
 
 4987  priv_->deleted_member_types_.clear();
 
 4988  priv_->inserted_member_types_.clear();
 
 4989  priv_->changed_member_types_.clear();
 
 4990  priv_->deleted_data_members_.clear();
 
 4991  priv_->inserted_data_members_.clear();
 
 4992  priv_->subtype_changed_dm_.clear();
 
 4993  priv_->deleted_member_functions_.clear();
 
 4994  priv_->inserted_member_functions_.clear();
 
 4995  priv_->changed_member_functions_.clear();
 
 4996  priv_->deleted_member_class_tmpls_.clear();
 
 4997  priv_->inserted_member_class_tmpls_.clear();
 
 4998  priv_->changed_member_class_tmpls_.clear();
 
 5007  return (priv_->deleted_member_types_.empty()
 
 5008      && priv_->inserted_member_types_.empty()
 
 5009      && priv_->changed_member_types_.empty()
 
 5010      && priv_->deleted_data_members_.empty()
 
 5011      && priv_->inserted_data_members_.empty()
 
 5012      && priv_->subtype_changed_dm_.empty()
 
 5013      && priv_->inserted_member_functions_.empty()
 
 5014      && priv_->deleted_member_functions_.empty()
 
 5015      && priv_->changed_member_functions_.empty()
 
 5016      && priv_->deleted_member_class_tmpls_.empty()
 
 5017      && priv_->inserted_member_class_tmpls_.empty()
 
 5018      && priv_->changed_member_class_tmpls_.empty());
 
 5029    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 5030     it != e.deletions().end();
 
 5033    unsigned i = it->index();
 
 5037    if (record_type && record_type->get_is_declaration_only())
 
 5039    string name = d->get_name();
 
 5040    priv_->deleted_member_types_[name] = d;
 
 5043    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 5044     it != e.insertions().end();
 
 5047    for (vector<unsigned>::const_iterator iit =
 
 5048           it->inserted_indexes().begin();
 
 5049         iit != it->inserted_indexes().end();
 
 5056        if (record_type && record_type->get_is_declaration_only())
 
 5058        string name = d->get_name();
 
 5059        string_decl_base_sptr_map::const_iterator j =
 
 5060          priv_->deleted_member_types_.find(name);
 
 5061        if (j != priv_->deleted_member_types_.end())
 
 5063        if (*j->second != *d)
 
 5064          priv_->changed_member_types_[name] =
 
 5067        priv_->deleted_member_types_.erase(j);
 
 5070          priv_->inserted_member_types_[name] = d;
 
 5078    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 5079     it != e.deletions().end();
 
 5082    unsigned i = it->index();
 
 5085    string name = data_member->get_anon_dm_reliable_name();
 
 5087    ABG_ASSERT(priv_->deleted_data_members_.find(name)
 
 5088           == priv_->deleted_data_members_.end());
 
 5089    priv_->deleted_data_members_[name] = data_member;
 
 5092    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 5093     it != e.insertions().end();
 
 5096    for (vector<unsigned>::const_iterator iit =
 
 5097           it->inserted_indexes().begin();
 
 5098         iit != it->inserted_indexes().end();
 
 5105        string name = added_dm->get_anon_dm_reliable_name();
 
 5106        ABG_ASSERT(priv_->inserted_data_members_.find(name)
 
 5107               == priv_->inserted_data_members_.end());
 
 5109        bool ignore_added_anonymous_data_member = 
false;
 
 5147        bool added_anon_dm_changes_dm = 
false;
 
 5150        vector<var_decl_sptr> dms_replaced_by_anon_dm;
 
 5159        for (string_decl_base_sptr_map::const_iterator it =
 
 5160               priv_->deleted_data_members_.begin();
 
 5161             it != priv_->deleted_data_members_.end();
 
 5170            string deleted_dm_name = it->second->get_name();
 
 5186            size_t replaced_dm_offset =
 
 5188            replacing_dm_offset =
 
 5191            if (replaced_dm_offset != replacing_dm_offset)
 
 5199                added_anon_dm_changes_dm = 
true;
 
 5203            if (replaced_dm->get_type()->get_size_in_bits()
 
 5204                == replaced_dm->get_type()->get_size_in_bits())
 
 5205              dms_replaced_by_anon_dm.push_back(replaced_dm);
 
 5208                added_anon_dm_changes_dm = 
true;
 
 5217        if (!added_anon_dm_changes_dm
 
 5218            && !dms_replaced_by_anon_dm.empty())
 
 5221            type_base_sptr added_dm_type = added_dm->get_type();
 
 5237            ignore_added_anonymous_data_member = 
true;
 
 5238            for (vector<var_decl_sptr>::const_iterator i =
 
 5239                   dms_replaced_by_anon_dm.begin();
 
 5240                 i != dms_replaced_by_anon_dm.end();
 
 5243                string n = (*i)->get_name();
 
 5244                priv_->dms_replaced_by_adms_[n] =
 
 5246                priv_->deleted_data_members_.erase(n);
 
 5252        if (!ignore_added_anonymous_data_member)
 
 5265        string_decl_base_sptr_map::const_iterator j =
 
 5266          priv_->deleted_data_members_.find(name);
 
 5267        if (j != priv_->deleted_data_members_.end())
 
 5269            if (*j->second != *d)
 
 5272            priv_->subtype_changed_dm_[name]=
 
 5275            priv_->deleted_data_members_.erase(j);
 
 5278          priv_->inserted_data_members_[name] = d;
 
 5286    for (string_decl_base_sptr_map::const_iterator i =
 
 5287       priv_->deleted_data_members_.begin();
 
 5288     i != priv_->deleted_data_members_.end();
 
 5292    priv_->deleted_dm_by_offset_[offset] = i->second;
 
 5295    for (string_decl_base_sptr_map::const_iterator i =
 
 5296       priv_->inserted_data_members_.begin();
 
 5297     i != priv_->inserted_data_members_.end();
 
 5301    priv_->inserted_dm_by_offset_[offset] = i->second;
 
 5304    for (unsigned_decl_base_sptr_map::const_iterator i =
 
 5305       priv_->inserted_dm_by_offset_.begin();
 
 5306     i != priv_->inserted_dm_by_offset_.end();
 
 5309    unsigned_decl_base_sptr_map::const_iterator j =
 
 5310      priv_->deleted_dm_by_offset_.find(i->first);
 
 5311    if (j != priv_->deleted_dm_by_offset_.end())
 
 5315        priv_->changed_dm_[i->first] =
 
 5320    for (unsigned_var_diff_sptr_map::const_iterator i =
 
 5321       priv_->changed_dm_.begin();
 
 5322     i != priv_->changed_dm_.end();
 
 5325    priv_->deleted_dm_by_offset_.erase(i->first);
 
 5326    priv_->inserted_dm_by_offset_.erase(i->first);
 
 5327    priv_->deleted_data_members_.erase
 
 5328      (i->second->first_var()->get_anon_dm_reliable_name());
 
 5329    priv_->inserted_data_members_.erase
 
 5330      (i->second->second_var()->get_anon_dm_reliable_name());
 
 5334                    priv_->sorted_subtype_changed_dm_);
 
 5336                      priv_->sorted_changed_dm_);
 
 5339    edit_script& e = priv_->member_class_tmpls_changes_;
 
 5341    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 5342     it != e.deletions().end();
 
 5345    unsigned i = it->index();
 
 5349    string name = d->get_name();
 
 5350    ABG_ASSERT(priv_->deleted_member_class_tmpls_.find(name)
 
 5351           == priv_->deleted_member_class_tmpls_.end());
 
 5352    priv_->deleted_member_class_tmpls_[name] = d;
 
 5355    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 5356     it != e.insertions().end();
 
 5359    for (vector<unsigned>::const_iterator iit =
 
 5360           it->inserted_indexes().begin();
 
 5361         iit != it->inserted_indexes().end();
 
 5368        string name = d->get_name();
 
 5369        ABG_ASSERT(priv_->inserted_member_class_tmpls_.find(name)
 
 5370           == priv_->inserted_member_class_tmpls_.end());
 
 5371        string_decl_base_sptr_map::const_iterator j =
 
 5372          priv_->deleted_member_class_tmpls_.find(name);
 
 5373        if (j != priv_->deleted_member_class_tmpls_.end())
 
 5375        if (*j->second != *d)
 
 5376          priv_->changed_member_types_[name]=
 
 5378        priv_->deleted_member_class_tmpls_.erase(j);
 
 5381          priv_->inserted_member_class_tmpls_[name] = d;
 
 5386                priv_->sorted_changed_member_types_);
 
 5395    priv_.reset(
new priv);
 
 5406                     class_or_union_sptr second_scope,
 
 5424const class_or_union_diff::priv_ptr&
 
 5437  return canonical->priv_;
 
 5459{
return get_priv()->member_types_changes_;}
 
 5465{
return get_priv()->member_types_changes_;}
 
 5471{
return get_priv()->data_members_changes_;}
 
 5477{
return get_priv()->data_members_changes_;}
 
 5484{
return get_priv()->inserted_data_members_;}
 
 5491{
return get_priv()->deleted_data_members_;}
 
 5497{
return get_priv()->member_fns_changes_;}
 
 5506{
return get_priv()->sorted_changed_member_functions_;}
 
 5512{
return get_priv()->member_fns_changes_;}
 
 5517{
return get_priv()->deleted_member_functions_;}
 
 5522{
return get_priv()->inserted_member_functions_;}
 
 5540{
return get_priv()->sorted_changed_dm_;}
 
 5548{
return get_priv()->count_filtered_changed_dm(local);}
 
 5555{
return get_priv()->sorted_subtype_changed_dm_;}
 
 5562{
return get_priv()->count_filtered_subtype_changed_dm(local);}
 
 5574{
return get_priv()->dms_replaced_by_adms_;}
 
 5586  if (priv_->dms_replaced_by_adms_ordered_.empty())
 
 5588      for (string_decl_base_sptr_map::const_iterator it =
 
 5589         priv_->dms_replaced_by_adms_.begin();
 
 5590       it != priv_->dms_replaced_by_adms_.end();
 
 5597      priv_->dms_replaced_by_adms_ordered_.push_back(changed_dm);
 
 5602  return priv_->dms_replaced_by_adms_ordered_;
 
 5609{
return get_priv()->member_fn_tmpls_changes_;}
 
 5615{
return get_priv()->member_fn_tmpls_changes_;}
 
 5621{
return get_priv()->member_class_tmpls_changes_;}
 
 5627{
return get_priv()->member_class_tmpls_changes_;}
 
 5643  return ir::NO_CHANGE_KIND;
 
 5656  context()->get_reporter()->report(*
this, out, indent);
 
 5668  for (var_diff_sptrs_type::const_iterator i =
 
 5669     get_priv()->sorted_subtype_changed_dm_.begin();
 
 5670       i != 
get_priv()->sorted_subtype_changed_dm_.end();
 
 5675  for (var_diff_sptrs_type::const_iterator i =
 
 5676     get_priv()->sorted_changed_dm_.begin();
 
 5677       i != 
get_priv()->sorted_changed_dm_.end();
 
 5683  for (diff_sptrs_type::const_iterator i =
 
 5684     get_priv()->sorted_changed_member_types_.begin();
 
 5685       i != 
get_priv()->sorted_changed_member_types_.end();
 
 5691  for (function_decl_diff_sptrs_type::const_iterator i =
 
 5692     get_priv()->sorted_changed_member_functions_.begin();
 
 5693       i != 
get_priv()->sorted_changed_member_functions_.end();
 
 5708class_diff::clear_lookup_tables(
void)
 
 5710  priv_->deleted_bases_.clear();
 
 5711  priv_->inserted_bases_.clear();
 
 5712  priv_->changed_bases_.clear();
 
 5719class_diff::lookup_tables_empty(
void)
 const 
 5721  return (priv_->deleted_bases_.empty()
 
 5722      && priv_->inserted_bases_.empty()
 
 5723      && priv_->changed_bases_.empty());
 
 5733static string_member_function_sptr_map::const_iterator
 
 5736  for (string_member_function_sptr_map::const_iterator i = map.begin();
 
 5750class_diff::ensure_lookup_tables_populated(
void)
 const 
 5754  if (!lookup_tables_empty())
 
 5758    edit_script& e = get_priv()->base_changes_;
 
 5760    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 5761     it != e.deletions().end();
 
 5764    unsigned i = it->index();
 
 5767    string name = b->get_base_class()->get_qualified_name();
 
 5768    ABG_ASSERT(get_priv()->deleted_bases_.find(name)
 
 5769           == get_priv()->deleted_bases_.end());
 
 5770    get_priv()->deleted_bases_[name] = b;
 
 5773    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 5774     it != e.insertions().end();
 
 5777    for (vector<unsigned>::const_iterator iit =
 
 5778           it->inserted_indexes().begin();
 
 5779         iit != it->inserted_indexes().end();
 
 5785        string name = b->get_base_class()->get_qualified_name();
 
 5786        ABG_ASSERT(get_priv()->inserted_bases_.find(name)
 
 5787           == get_priv()->inserted_bases_.end());
 
 5788        string_base_sptr_map::const_iterator j =
 
 5789          get_priv()->deleted_bases_.find(name);
 
 5790        if (j != get_priv()->deleted_bases_.end())
 
 5793          get_priv()->changed_bases_[name] =
 
 5799          get_priv()->moved_bases_.push_back(b);
 
 5800        get_priv()->deleted_bases_.erase(j);
 
 5803          get_priv()->inserted_bases_[name] = b;
 
 5809                get_priv()->sorted_deleted_bases_);
 
 5811                get_priv()->sorted_inserted_bases_);
 
 5813                 get_priv()->sorted_changed_bases_);
 
 5818    edit_script& e = p->member_fns_changes_;
 
 5820    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 5821     it != e.deletions().end();
 
 5824    unsigned i = it->index();
 
 5825    method_decl_sptr mem_fn =
 
 5827    string name = mem_fn->get_linkage_name();
 
 5829      name = mem_fn->get_pretty_representation();
 
 5831    if (p->deleted_member_functions_.find(name)
 
 5832        != p->deleted_member_functions_.end())
 
 5834    p->deleted_member_functions_[name] = mem_fn;
 
 5837    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 5838     it != e.insertions().end();
 
 5841    for (vector<unsigned>::const_iterator iit =
 
 5842           it->inserted_indexes().begin();
 
 5843         iit != it->inserted_indexes().end();
 
 5848        method_decl_sptr mem_fn =
 
 5850        string name = mem_fn->get_linkage_name();
 
 5852          name = mem_fn->get_pretty_representation();
 
 5854        if (p->inserted_member_functions_.find(name)
 
 5855        != p->inserted_member_functions_.end())
 
 5857        string_member_function_sptr_map::const_iterator j =
 
 5858          p->deleted_member_functions_.find(name);
 
 5860        if (j != p->deleted_member_functions_.end())
 
 5862        if (*j->second != *mem_fn)
 
 5863          p->changed_member_functions_[name] =
 
 5864            compute_diff(static_pointer_cast<function_decl>(j->second),
 
 5865                 static_pointer_cast<function_decl>(mem_fn),
 
 5867        p->deleted_member_functions_.erase(j);
 
 5870          p->inserted_member_functions_[name] = mem_fn;
 
 5917    vector<string> to_delete;
 
 5918    corpus_sptr f = 
context()->get_first_corpus(),
 
 5919      s = 
context()->get_second_corpus();
 
 5921      for (string_member_function_sptr_map::const_iterator i =
 
 5940            find_virtual_dtor_in_map(p->inserted_member_functions_);
 
 5941          if (it != p->inserted_member_functions_.end())
 
 5949            (!i->second->get_linkage_name().empty())
 
 5950            ? i->second->get_linkage_name()
 
 5951            : i->second->get_pretty_representation();
 
 5952              to_delete.push_back(name);
 
 5953              p->inserted_member_functions_.erase(it);
 
 5960      if (!i->second->get_symbol()
 
 5961          || s->lookup_function_symbol(*i->second->get_symbol()))
 
 5962        to_delete.push_back(i->first);
 
 5966    for (vector<string>::const_iterator i = to_delete.begin();
 
 5967     i != to_delete.end();
 
 5969      p->deleted_member_functions_.erase(*i);
 
 5974      for (string_member_function_sptr_map::const_iterator i =
 
 5983      if (!i->second->get_symbol()
 
 5984          || f->lookup_function_symbol(*i->second->get_symbol()))
 
 5985        to_delete.push_back(i->first);
 
 5988    for (vector<string>::const_iterator i = to_delete.begin();
 
 5989     i != to_delete.end();
 
 5991      p->inserted_member_functions_.erase(*i);
 
 5994                     p->sorted_deleted_member_functions_);
 
 5997                     p->sorted_inserted_member_functions_);
 
 6000      (p->changed_member_functions_,
 
 6001       p->sorted_changed_member_functions_);
 
 6008class_diff::allocate_priv_data()
 
 6012    priv_.reset(
new priv);
 
 6025  string qname = d->get_base_class()->get_qualified_name();
 
 6026  string_base_diff_sptr_map::const_iterator it =
 
 6027    changed_bases_.find(qname);
 
 6029  return (it == changed_bases_.end())
 
 6031    : it->second->second_base();
 
 6042  size_t num_filtered = 0;
 
 6043  for (base_diff_sptrs_type::const_iterator i = sorted_changed_bases_.begin();
 
 6044       i != sorted_changed_bases_.end();
 
 6051  return num_filtered;
 
 6065  for (base_diff_sptrs_type::const_iterator i =
 
 6066     get_priv()->sorted_changed_bases_.begin();
 
 6067       i != get_priv()->sorted_changed_bases_.end();
 
 6092class_diff::~class_diff()
 
 6106const class_diff::priv_ptr&
 
 6107class_diff::get_priv()
 const 
 6119  return canonical->priv_;
 
 6127  if (diff::priv_->pretty_representation_.empty())
 
 6129      std::ostringstream o;
 
 6135      diff::priv_->pretty_representation_ = o.str();
 
 6137  return diff::priv_->pretty_representation_;
 
 6156  return ir::NO_CHANGE_KIND;
 
 6160shared_ptr<class_decl>
 
 6167shared_ptr<class_decl>
 
 6174{
return get_priv()->base_changes_;}
 
 6182{
return get_priv()->deleted_bases_;}
 
 6190{
return get_priv()->inserted_bases_;}
 
 6197{
return get_priv()->sorted_changed_bases_;}
 
 6205const vector<class_decl::base_spec_sptr>&
 
 6207{
return get_priv()->moved_bases_;}
 
 6212{
return get_priv()->base_changes_;}
 
 6223  context()->get_reporter()->report(*
this, out, indent);
 
 6248  ctxt->initialize_canonical_diff(changes);
 
 6251  if (!ctxt->get_canonical_diff_for(first, second))
 
 6255      diff_sptr canonical_diff = ctxt->get_canonical_diff_for(changes);
 
 6257      ctxt->set_canonical_diff_for(first, second, canonical_diff);
 
 6273  if (
is_class_diff(changes->get_canonical_diff()) == changes.get())
 
 6276    changes->allocate_priv_data();
 
 6288           f->get_base_specifiers().end(),
 
 6289           s->get_base_specifiers().begin(),
 
 6290           s->get_base_specifiers().end(),
 
 6291           changes->base_changes());
 
 6297           f->get_member_types().end(),
 
 6298           s->get_member_types().begin(),
 
 6299           s->get_member_types().end(),
 
 6300           changes->member_types_changes());
 
 6305           f->get_non_static_data_members().end(),
 
 6306           s->get_non_static_data_members().begin(),
 
 6307           s->get_non_static_data_members().end(),
 
 6308           changes->data_members_changes());
 
 6312           f->get_virtual_mem_fns().end(),
 
 6313           s->get_virtual_mem_fns().begin(),
 
 6314           s->get_virtual_mem_fns().end(),
 
 6315           changes->member_fns_changes());
 
 6318  compute_diff(f->get_member_function_templates().begin(),
 
 6319           f->get_member_function_templates().end(),
 
 6320           s->get_member_function_templates().begin(),
 
 6321           s->get_member_function_templates().end(),
 
 6322           changes->member_fn_tmpls_changes());
 
 6327           f->get_member_class_templates().end(),
 
 6328           s->get_member_class_templates().begin(),
 
 6329           s->get_member_class_templates().end(),
 
 6330           changes->member_class_tmpls_changes());
 
 6333  changes->ensure_lookup_tables_populated();
 
 6363  : 
diff(first, second, ctxt),
 
 6364    priv_(new 
priv(underlying))
 
 6372{
return dynamic_pointer_cast<class_decl::base_spec>(
first_subject());}
 
 6379{
return dynamic_pointer_cast<class_decl::base_spec>(
second_subject());}
 
 6388{
return priv_->underlying_class_diff_;}
 
 6397{priv_->underlying_class_diff_ = d;}
 
 6404  if (diff::priv_->pretty_representation_.empty())
 
 6406      std::ostringstream o;
 
 6412      diff::priv_->pretty_representation_ = o.str();
 
 6414  return diff::priv_->pretty_representation_;
 
 6433  return ir::NO_CHANGE_KIND;
 
 6444  context()->get_reporter()->report(*
this, out, indent);
 
 6466                    second->get_base_class(),
 
 6470  ctxt->initialize_canonical_diff(changes);
 
 6485union_diff::clear_lookup_tables(
void)
 
 6492union_diff::lookup_tables_empty(
void)
 const 
 6498union_diff::ensure_lookup_tables_populated(
void)
 const 
 6504union_diff::allocate_priv_data()
 
 6517               union_decl_sptr second_union,
 
 6540  if (diff::priv_->pretty_representation_.empty())
 
 6542      std::ostringstream o;
 
 6548      diff::priv_->pretty_representation_ = o.str();
 
 6550  return diff::priv_->pretty_representation_;
 
 6562  context()->get_reporter()->report(*
this, out, indent);
 
 6577         const union_decl_sptr  second,
 
 6580  union_diff_sptr changes(
new union_diff(first, second, ctxt));
 
 6582  ctxt->initialize_canonical_diff(changes);
 
 6598  if (
is_union_diff(changes->get_canonical_diff()) ==  changes.get())
 
 6601    changes->allocate_priv_data();
 
 6612  compute_diff(first->get_non_static_data_members().begin(),
 
 6613           first->get_non_static_data_members().end(),
 
 6614           second->get_non_static_data_members().begin(),
 
 6615           second->get_non_static_data_members().end(),
 
 6616           changes->data_members_changes());
 
 6621           first->get_mem_fns().end(),
 
 6622           second->get_mem_fns().begin(),
 
 6623           second->get_mem_fns().end(),
 
 6624           changes->member_fns_changes());
 
 6627  compute_diff(first->get_member_function_templates().begin(),
 
 6628           first->get_member_function_templates().end(),
 
 6629           second->get_member_function_templates().begin(),
 
 6630           second->get_member_function_templates().end(),
 
 6631           changes->member_fn_tmpls_changes());
 
 6634  changes->ensure_lookup_tables_populated();
 
 6648scope_diff::clear_lookup_tables()
 
 6650  priv_->deleted_types_.clear();
 
 6651  priv_->deleted_decls_.clear();
 
 6652  priv_->inserted_types_.clear();
 
 6653  priv_->inserted_decls_.clear();
 
 6654  priv_->changed_types_.clear();
 
 6655  priv_->changed_decls_.clear();
 
 6656  priv_->removed_types_.clear();
 
 6657  priv_->removed_decls_.clear();
 
 6658  priv_->added_types_.clear();
 
 6659  priv_->added_decls_.clear();
 
 6669scope_diff::lookup_tables_empty()
 const 
 6671  return (priv_->deleted_types_.empty()
 
 6672      && priv_->deleted_decls_.empty()
 
 6673      && priv_->inserted_types_.empty()
 
 6674      && priv_->inserted_decls_.empty()
 
 6675      && priv_->changed_types_.empty()
 
 6676      && priv_->changed_decls_.empty()
 
 6677      && priv_->removed_types_.empty()
 
 6678      && priv_->removed_decls_.empty()
 
 6679      && priv_->added_types_.empty()
 
 6680      && priv_->added_decls_.empty());
 
 6686scope_diff::ensure_lookup_tables_populated()
 
 6688  if (!lookup_tables_empty())
 
 6691  edit_script& e = priv_->member_changes_;
 
 6694  for (
const auto& deletion : e.deletions())
 
 6696      unsigned i = deletion.index();
 
 6698      string qname = decl->get_qualified_name();
 
 6702      if (klass_decl && klass_decl->get_is_declaration_only())
 
 6713         == priv_->deleted_types_.end());
 
 6714      priv_->deleted_types_[qname] = decl;
 
 6719             == priv_->deleted_decls_.end());
 
 6720      priv_->deleted_decls_[qname] = decl;
 
 6726  for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 6727       it != e.insertions().end();
 
 6730      for (vector<unsigned>::const_iterator i = it->inserted_indexes().begin();
 
 6731       i != it->inserted_indexes().end();
 
 6735      string qname = decl->get_qualified_name();
 
 6739        dynamic_pointer_cast<class_decl>(decl);
 
 6740          if (klass_decl && klass_decl->get_is_declaration_only())
 
 6750          ABG_ASSERT(priv_->inserted_types_.find(qname)
 
 6751             == priv_->inserted_types_.end());
 
 6752          string_decl_base_sptr_map::const_iterator j =
 
 6753        priv_->deleted_types_.find(qname);
 
 6754          if (j != priv_->deleted_types_.end())
 
 6756          if (*j->second != *decl)
 
 6757            priv_->changed_types_[qname] =
 
 6759          priv_->deleted_types_.erase(j);
 
 6762        priv_->inserted_types_[qname] = decl;
 
 6766          ABG_ASSERT(priv_->inserted_decls_.find(qname)
 
 6767             == priv_->inserted_decls_.end());
 
 6768          string_decl_base_sptr_map::const_iterator j =
 
 6769        priv_->deleted_decls_.find(qname);
 
 6770          if (j != priv_->deleted_decls_.end())
 
 6772          if (*j->second != *decl)
 
 6773            priv_->changed_decls_[qname] =
 
 6775          priv_->deleted_decls_.erase(j);
 
 6778        priv_->inserted_decls_[qname] = decl;
 
 6784                priv_->sorted_changed_decls_);
 
 6786                priv_->sorted_changed_types_);
 
 6789  for (string_decl_base_sptr_map::const_iterator i =
 
 6790     priv_->deleted_types_.begin();
 
 6791       i != priv_->deleted_types_.end();
 
 6794      string_decl_base_sptr_map::const_iterator r =
 
 6795    priv_->inserted_types_.find(i->first);
 
 6796      if (r == priv_->inserted_types_.end())
 
 6797    priv_->removed_types_[i->first] = i->second;
 
 6799  for (string_decl_base_sptr_map::const_iterator i =
 
 6800     priv_->deleted_decls_.begin();
 
 6801       i != priv_->deleted_decls_.end();
 
 6804      string_decl_base_sptr_map::const_iterator r =
 
 6805    priv_->inserted_decls_.find(i->first);
 
 6806      if (r == priv_->inserted_decls_.end())
 
 6807    priv_->removed_decls_[i->first] = i->second;
 
 6811  for (string_decl_base_sptr_map::const_iterator i =
 
 6812     priv_->inserted_types_.begin();
 
 6813       i != priv_->inserted_types_.end();
 
 6816      string_decl_base_sptr_map::const_iterator r =
 
 6817    priv_->deleted_types_.find(i->first);
 
 6818      if (r == priv_->deleted_types_.end())
 
 6819    priv_->added_types_[i->first] = i->second;
 
 6821  for (string_decl_base_sptr_map::const_iterator i =
 
 6822     priv_->inserted_decls_.begin();
 
 6823       i != priv_->inserted_decls_.end();
 
 6826      string_decl_base_sptr_map::const_iterator r =
 
 6827    priv_->deleted_decls_.find(i->first);
 
 6828      if (r == priv_->deleted_decls_.end())
 
 6829    priv_->added_decls_[i->first] = i->second;
 
 6841  for (diff_sptrs_type::const_iterator i = 
changed_types().begin();
 
 6847  for (diff_sptrs_type::const_iterator i = 
changed_decls().begin();
 
 6867  : 
diff(first_scope, second_scope, ctxt),
 
 6905{
return priv_->member_changes_;}
 
 6927{
return priv_->member_changes_;}
 
 6942 return scope->get_member_decls()[i];
 
 6973  return scope->get_member_decls()[i];
 
 6994{
return priv_->sorted_changed_types_;}
 
 7000{
return priv_->sorted_changed_decls_;}
 
 7003scope_diff::removed_types()
 const 
 7004{
return priv_->removed_types_;}
 
 7007scope_diff::removed_decls()
 const 
 7008{
return priv_->removed_decls_;}
 
 7011scope_diff::added_types()
 const 
 7012{
return priv_->added_types_;}
 
 7015scope_diff::added_decls()
 const 
 7016{
return priv_->added_decls_;}
 
 7023  if (diff::priv_->pretty_representation_.empty())
 
 7025      std::ostringstream o;
 
 7031      diff::priv_->pretty_representation_ = o.str();
 
 7033  return diff::priv_->pretty_representation_;
 
 7055  return ir::NO_CHANGE_KIND;
 
 7066  context()->get_reporter()->report(*
this, out, indent);
 
 7092  ABG_ASSERT(d->first_scope() == first && d->second_scope() == second);
 
 7095           first->get_member_decls().end(),
 
 7096           second->get_member_decls().begin(),
 
 7097           second->get_member_decls().end(),
 
 7098           d->member_changes());
 
 7100  d->ensure_lookup_tables_populated();
 
 7126  ctxt->initialize_canonical_diff(d);
 
 7150  ABG_ASSERT(first->get_index() == second->get_index());
 
 7163{
return dynamic_pointer_cast<function_decl::parameter>(
first_subject());}
 
 7171{
return dynamic_pointer_cast<function_decl::parameter>(
second_subject());}
 
 7181{
return priv_->type_diff;}
 
 7191  if (diff::priv_->pretty_representation_.empty())
 
 7193      std::ostringstream o;
 
 7194      o << 
"function_parameter_diff[" 
 7199      diff::priv_->pretty_representation_ = o.str();
 
 7201  return diff::priv_->pretty_representation_;
 
 7222  return ir::NO_CHANGE_KIND;
 
 7233  context()->get_reporter()->report(*
this, out, indent);
 
 7267  if (!first || !second)
 
 7271  ctxt->initialize_canonical_diff(result);
 
 7280function_type_diff::ensure_lookup_tables_populated()
 
 7282  priv_->return_type_diff_ =
 
 7289  for (vector<deletion>::const_iterator i =
 
 7290     priv_->parm_changes_.deletions().begin();
 
 7291       i != priv_->parm_changes_.deletions().end();
 
 7296      parm_name = parm->get_name_id();
 
 7300      priv_->deleted_parms_[parm_name] = parm;
 
 7301      priv_->deleted_parms_by_id_[parm->get_index()] = parm;
 
 7304  for (vector<insertion>::const_iterator i =
 
 7305     priv_->parm_changes_.insertions().begin();
 
 7306       i != priv_->parm_changes_.insertions().end();
 
 7309      for (vector<unsigned>::const_iterator j =
 
 7310         i->inserted_indexes().begin();
 
 7311       j != i->inserted_indexes().end();
 
 7315      parm_name = parm->get_name_id();
 
 7320        string_parm_map::const_iterator k =
 
 7321          priv_->deleted_parms_.find(parm_name);
 
 7322        if (k != priv_->deleted_parms_.end())
 
 7324        if (*k->second != *parm)
 
 7325          priv_->subtype_changed_parms_[parm_name] =
 
 7327        priv_->deleted_parms_.erase(parm_name);
 
 7330          priv_->added_parms_[parm_name] = parm;
 
 7333        unsigned_parm_map::const_iterator k =
 
 7334          priv_->deleted_parms_by_id_.find(parm->get_index());
 
 7335        if (k != priv_->deleted_parms_by_id_.end())
 
 7337        if (*k->second != *parm
 
 7338            && (k->second->get_name_id() != parm_name))
 
 7339          priv_->changed_parms_by_id_[parm->get_index()] =
 
 7341        priv_->added_parms_.erase(parm_name);
 
 7342        priv_->deleted_parms_.erase(k->second->get_name_id());
 
 7343        priv_->deleted_parms_by_id_.erase(parm->get_index());
 
 7346          priv_->added_parms_by_id_[parm->get_index()] = parm;
 
 7352                    priv_->sorted_subtype_changed_parms_);
 
 7354                    priv_->sorted_changed_parms_by_id_);
 
 7356               priv_->sorted_deleted_parms_);
 
 7359               priv_->sorted_added_parms_);
 
 7369function_type_diff::deleted_parameter_at(
int i)
 const 
 7375const vector<function_decl::parameter_sptr>&
 
 7377{
return priv_->sorted_deleted_parms_;}
 
 7382const vector<function_decl::parameter_sptr>&
 
 7384{
return priv_->sorted_added_parms_;}
 
 7393function_type_diff::inserted_parameter_at(
int i)
 const 
 7421{
return dynamic_pointer_cast<function_type>(
first_subject());}
 
 7437{
return priv_->return_type_diff_;}
 
 7444{
return priv_->subtype_changed_parms_;}
 
 7451{
return priv_->deleted_parms_;}
 
 7458{
return priv_->added_parms_;}
 
 7468  if (diff::priv_->pretty_representation_.empty())
 
 7470      std::ostringstream o;
 
 7471      o << 
"function_type_diff[" 
 7476      diff::priv_->pretty_representation_ = o.str();
 
 7478  return diff::priv_->pretty_representation_;
 
 7502  return ir::NO_CHANGE_KIND;
 
 7514  context()->get_reporter()->report(*
this, out, indent);
 
 7528  for (vector<fn_parm_diff_sptr>::const_iterator i =
 
 7529     priv_->sorted_subtype_changed_parms_.begin();
 
 7530       i != priv_->sorted_subtype_changed_parms_.end();
 
 7535  for (vector<fn_parm_diff_sptr>::const_iterator i =
 
 7536     priv_->sorted_changed_parms_by_id_.begin();
 
 7537       i != priv_->sorted_changed_parms_by_id_.end();
 
 7560  if (!first || !second)
 
 7569               first->get_parameters().end(),
 
 7570               second->get_first_parm(),
 
 7571               second->get_parameters().end(),
 
 7572               result->priv_->parm_changes_);
 
 7574  result->ensure_lookup_tables_populated();
 
 7576  ctxt->initialize_canonical_diff(result);
 
 7586function_decl_diff::ensure_lookup_tables_populated()
 
 7623{
return dynamic_pointer_cast<function_decl>(
first_subject());}
 
 7631function_decl_diff::type_diff()
 const 
 7632{
return priv_->type_diff_;}
 
 7639  if (diff::priv_->pretty_representation_.empty())
 
 7641      std::ostringstream o;
 
 7642      o << 
"function_diff[" 
 7647      diff::priv_->pretty_representation_ = o.str();
 
 7649  return diff::priv_->pretty_representation_;
 
 7668  return ir::NO_CHANGE_KIND;
 
 7680  context()->get_reporter()->report(*
this, out, indent);
 
 7700  if (!first || !second)
 
 7712  result->priv_->type_diff_ = type_diff;
 
 7714  result->ensure_lookup_tables_populated();
 
 7716  ctxt->initialize_canonical_diff(result);
 
 7760  if (diff::priv_->pretty_representation_.empty())
 
 7762      std::ostringstream o;
 
 7763      o << 
"type_decl_diff[" 
 7768      diff::priv_->pretty_representation_ = o.str();
 
 7770  return diff::priv_->pretty_representation_;
 
 7788  return ir::NO_CHANGE_KIND;
 
 7799  context()->get_reporter()->report(*
this, out, indent);
 
 7837  ctxt->initialize_canonical_diff(result);
 
 7874    priv_(new 
priv(underlying))
 
 7882{
return dynamic_pointer_cast<typedef_decl>(
first_subject());}
 
 7898{
return priv_->underlying_type_diff_;}
 
 7907{priv_->underlying_type_diff_ = d;}
 
 7914  if (diff::priv_->pretty_representation_.empty())
 
 7916      std::ostringstream o;
 
 7917      o << 
"typedef_diff[" 
 7922      diff::priv_->pretty_representation_ = o.str();
 
 7924  return diff::priv_->pretty_representation_;
 
 7946  return ir::NO_CHANGE_KIND;
 
 7958  context()->get_reporter()->report(*
this, out, indent);
 
 7978  diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
 
 7979                       second->get_underlying_type(),
 
 7983  ctxt->initialize_canonical_diff(result);
 
 8035    priv_(new 
priv(first, second))
 
 8044{
return priv_->first_;}
 
 8051{
return priv_->second_;}
 
 8065{
return ir::NO_CHANGE_KIND;}
 
 8104  compute_diff(static_pointer_cast<scope_decl>(first->get_global_scope()),
 
 8105           static_pointer_cast<scope_decl>(second->get_global_scope()),
 
 8109  ctxt->initialize_canonical_diff(tu_diff);
 
 8119struct diff_maps::priv
 
 8142diff_maps::~diff_maps() = 
default;
 
 8149{
return priv_->type_decl_diff_map_;}
 
 8156{
return priv_->type_decl_diff_map_;}
 
 8163{
return priv_->enum_diff_map_;}
 
 8170{
return priv_->enum_diff_map_;}
 
 8177{
return priv_->class_diff_map_;}
 
 8184{
return priv_->class_diff_map_;}
 
 8191{
return priv_->union_diff_map_;}
 
 8198{
return priv_->union_diff_map_;}
 
 8205{
return priv_->typedef_diff_map_;}
 
 8212{
return priv_->typedef_diff_map_;}
 
 8219{
return priv_->subrange_diff_map_;}
 
 8226{
return priv_->subrange_diff_map_;}
 
 8233{
return priv_->array_diff_map_;}
 
 8240{
return priv_->array_diff_map_;}
 
 8247{
return priv_->reference_diff_map_;}
 
 8254{{
return priv_->reference_diff_map_;}}
 
 8261{
return priv_->fn_parm_diff_map_;}
 
 8268{
return priv_->fn_parm_diff_map_;}
 
 8275{
return priv_->function_type_diff_map_;}
 
 8282{
return priv_->function_type_diff_map_;}
 
 8289{
return priv_->function_decl_diff_map_;}
 
 8296{
return priv_->function_decl_diff_map_;}
 
 8303{
return priv_->var_decl_diff_map_;}
 
 8310{
return priv_->var_decl_diff_map_;}
 
 8317{
return priv_->distinct_diff_map_;}
 
 8324{
return priv_->distinct_diff_map_;}
 
 8382      diff_artifact_set_map_type::iterator i =
 
 8383    priv_->impacted_artifacts_map_.find(dif);
 
 8385      if (i == priv_->impacted_artifacts_map_.end())
 
 8388      set.insert(impacted_iface);
 
 8389      priv_->impacted_artifacts_map_[dif] = set;
 
 8392    i->second.insert(impacted_iface);
 
 8406  diff_artifact_set_map_type::iterator i =
 
 8407    priv_->impacted_artifacts_map_.find(d);
 
 8409  if (i == priv_->impacted_artifacts_map_.end())
 
 8425  : priv_(new 
priv(ctxt))
 
 8433{
return priv_->num_func_removed;}
 
 8440{priv_->num_func_removed = n;}
 
 8450  if (priv_->ctxt() && !priv_->ctxt()->show_deleted_fns())
 
 8451    return num_func_removed();
 
 8452  return priv_->num_removed_func_filtered_out;
 
 8461{priv_->num_removed_func_filtered_out = t;}
 
 8472  ABG_ASSERT(num_func_removed() >= num_removed_func_filtered_out());
 
 8473  return num_func_removed() - num_removed_func_filtered_out();
 
 8481{
return priv_->num_func_added;}
 
 8488{priv_->num_func_added = n;}
 
 8496  if (priv_->ctxt() && !priv_->ctxt()->show_added_fns())
 
 8497    return num_func_added();
 
 8498  return priv_->num_added_func_filtered_out;
 
 8507{priv_->num_added_func_filtered_out = n;}
 
 8519  ABG_ASSERT(num_func_added() >= num_added_func_filtered_out());
 
 8520  return num_func_added() - num_added_func_filtered_out();
 
 8530{
return priv_->num_func_changed;}
 
 8539{priv_->num_func_changed = n;}
 
 8548{
return priv_->num_changed_func_filtered_out;}
 
 8557{priv_->num_changed_func_filtered_out = n;}
 
 8565{
return priv_->num_func_with_virt_offset_changes;}
 
 8574{priv_->num_func_with_virt_offset_changes = n;}
 
 8585{
return num_func_changed() - num_changed_func_filtered_out();}
 
 8592{
return priv_->num_vars_removed;}
 
 8599{priv_->num_vars_removed = n;}
 
 8608  if (priv_->ctxt() && !priv_->ctxt()->show_deleted_vars())
 
 8609    return num_vars_removed();
 
 8610  return priv_->num_removed_vars_filtered_out;
 
 8619{priv_->num_removed_vars_filtered_out = n;}
 
 8631  ABG_ASSERT(num_vars_removed() >= num_removed_vars_filtered_out());
 
 8632  return num_vars_removed() - num_removed_vars_filtered_out();
 
 8640{
return priv_->num_vars_added;}
 
 8647{priv_->num_vars_added = n;}
 
 8656  if (priv_->ctxt() && !priv_->ctxt()->show_added_vars())
 
 8657    return num_vars_added();
 
 8658  return priv_->num_added_vars_filtered_out;
 
 8667{priv_->num_added_vars_filtered_out = n;}
 
 8679  ABG_ASSERT(num_vars_added() >= num_added_vars_filtered_out());
 
 8680  return num_vars_added() - num_added_vars_filtered_out();
 
 8690{
return priv_->num_vars_changed;}
 
 8699{priv_->num_vars_changed = n;}
 
 8708{
return priv_->num_changed_vars_filtered_out;}
 
 8717{priv_->num_changed_vars_filtered_out = n;}
 
 8728{
return num_vars_changed() - num_changed_vars_filtered_out();}
 
 8737{
return priv_->num_func_syms_removed;}
 
 8746{priv_->num_func_syms_removed = n;}
 
 8757      && !priv_->ctxt()->show_symbols_unreferenced_by_debug_info())
 
 8758    return num_func_syms_removed();
 
 8759  return priv_->num_removed_func_syms_filtered_out;
 
 8769{priv_->num_removed_func_syms_filtered_out = n;}
 
 8784  ABG_ASSERT(num_func_syms_removed() >= num_removed_func_syms_filtered_out());
 
 8785  return num_func_syms_removed() - num_removed_func_syms_filtered_out();
 
 8795{
return priv_->num_func_syms_added;}
 
 8804{priv_->num_func_syms_added = n;}
 
 8815      && !(priv_->ctxt()->show_added_symbols_unreferenced_by_debug_info()
 
 8816       && priv_->ctxt()->show_symbols_unreferenced_by_debug_info()))
 
 8817    return num_func_syms_added();
 
 8818  return priv_->num_added_func_syms_filtered_out;
 
 8828{priv_->num_added_func_syms_filtered_out = n;}
 
 8843  ABG_ASSERT(num_func_syms_added() >= num_added_func_syms_filtered_out());
 
 8844  return num_func_syms_added()- num_added_func_syms_filtered_out();
 
 8854{
return priv_->num_var_syms_removed;}
 
 8863{priv_->num_var_syms_removed = n;}
 
 8874      && !priv_->ctxt()->show_symbols_unreferenced_by_debug_info())
 
 8875    return num_var_syms_removed();
 
 8876  return priv_->num_removed_var_syms_filtered_out;
 
 8886{priv_->num_removed_var_syms_filtered_out = n;}
 
 8901  ABG_ASSERT(num_var_syms_removed() >= num_removed_var_syms_filtered_out());
 
 8902  return num_var_syms_removed() - num_removed_var_syms_filtered_out();
 
 8912{
return priv_->num_var_syms_added;}
 
 8921{priv_->num_var_syms_added = n;}
 
 8932      && !(priv_->ctxt()->show_added_symbols_unreferenced_by_debug_info()
 
 8933       && priv_->ctxt()->show_symbols_unreferenced_by_debug_info()))
 
 8934    return num_var_syms_added();
 
 8935  return priv_->num_added_var_syms_filtered_out;
 
 8945{priv_->num_added_var_syms_filtered_out = n;}
 
 8960  ABG_ASSERT(num_var_syms_added() >= num_added_var_syms_filtered_out());
 
 8961  return num_var_syms_added() - num_added_var_syms_filtered_out();
 
 8969{
return priv_->num_leaf_changes;}
 
 8976{priv_->num_leaf_changes = n;}
 
 8984{
return priv_->num_leaf_changes_filtered_out;}
 
 8993{priv_->num_leaf_changes_filtered_out = n;}
 
 9006  ABG_ASSERT(num_leaf_changes() >= num_leaf_changes_filtered_out());
 
 9007  return num_leaf_changes() - num_leaf_changes_filtered_out();
 
 9015{
return priv_->num_leaf_type_changes;}
 
 9022{priv_->num_leaf_type_changes = n;}
 
 9029{
return priv_->num_leaf_type_changes_filtered_out;}
 
 9035{priv_->num_leaf_type_changes_filtered_out = n;}
 
 9045{
return num_leaf_type_changes() - num_leaf_type_changes_filtered_out();}
 
 9052{
return priv_->num_leaf_func_changes;}
 
 9059{priv_->num_leaf_func_changes = n;}
 
 9068{
return priv_->num_leaf_func_changes_filtered_out;}
 
 9077{priv_->num_leaf_func_changes_filtered_out = n;}
 
 9088{
return num_leaf_func_changes() - num_leaf_func_changes_filtered_out();}
 
 9095{
return priv_->num_leaf_var_changes;}
 
 9102{priv_->num_leaf_var_changes = n;}
 
 9114{
return priv_->num_added_unreachable_types;}
 
 9127{priv_->num_added_unreachable_types = n;}
 
 9138{
return priv_->num_added_unreachable_types_filtered_out;}
 
 9149{priv_->num_added_unreachable_types_filtered_out = n;}
 
 9163         num_added_unreachable_types_filtered_out());
 
 9165  return (num_added_unreachable_types()
 
 9167      num_added_unreachable_types_filtered_out());
 
 9180{
return priv_->num_removed_unreachable_types;}
 
 9192{priv_->num_removed_unreachable_types = n;}
 
 9203{
return priv_->num_removed_unreachable_types_filtered_out;}
 
 9214{priv_->num_removed_unreachable_types_filtered_out = n;}
 
 9228         num_removed_unreachable_types_filtered_out());
 
 9230  return (num_removed_unreachable_types()
 
 9232      num_removed_unreachable_types_filtered_out());
 
 9245{
return priv_->num_changed_unreachable_types;}
 
 9257{priv_->num_changed_unreachable_types = n;}
 
 9268{
return priv_->num_changed_unreachable_types_filtered_out;}
 
 9279{priv_->num_changed_unreachable_types_filtered_out = n;}
 
 9293         num_changed_unreachable_types_filtered_out());
 
 9295  return (num_changed_unreachable_types()
 
 9297      num_changed_unreachable_types_filtered_out());
 
 9307{
return priv_->num_leaf_var_changes_filtered_out;}
 
 9316{priv_->num_leaf_var_changes_filtered_out = n;}
 
 9327{
return num_leaf_var_changes() - num_leaf_var_changes_filtered_out();}
 
 9337{
return ctxt_.lock();}
 
 9345  return (deleted_fns_.empty()
 
 9346      && added_fns_.empty()
 
 9347      && changed_fns_map_.empty()
 
 9348      && deleted_vars_.empty()
 
 9349      && added_vars_.empty()
 
 9350      && changed_vars_map_.empty());
 
 9357  deleted_fns_.clear();
 
 9359  changed_fns_map_.clear();
 
 9360  deleted_vars_.clear();
 
 9361  added_vars_.clear();
 
 9362  changed_vars_map_.clear();
 
 9370  if (!lookup_tables_empty())
 
 9378    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 9379     it != e.deletions().end();
 
 9382    unsigned i = it->index();
 
 9383    ABG_ASSERT(i < first_->get_functions().size());
 
 9385    const function_decl* deleted_fn = first_->get_functions()[i];
 
 9392    deleted_fns_[n] = deleted_fn;
 
 9395    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 9396     it != e.insertions().end();
 
 9399    for (vector<unsigned>::const_iterator iit =
 
 9400           it->inserted_indexes().begin();
 
 9401         iit != it->inserted_indexes().end();
 
 9405        const function_decl* added_fn = second_->get_functions()[i];
 
 9412        string_function_ptr_map::const_iterator j =
 
 9413          deleted_fns_.find(n);
 
 9414        if (j != deleted_fns_.end())
 
 9421        if (*j->second != *added_fn)
 
 9422          changed_fns_map_[j->first] = d;
 
 9423        deleted_fns_.erase(j);
 
 9426          added_fns_[n] = added_fn;
 
 9435    vector<string> to_delete;
 
 9436    for (string_function_ptr_map::const_iterator i = deleted_fns_.begin();
 
 9437     i != deleted_fns_.end();
 
 9439      if (second_->lookup_function_symbol(*i->second->get_symbol()))
 
 9440    to_delete.push_back(i->first);
 
 9442    for (vector<string>::const_iterator i = to_delete.begin();
 
 9443     i != to_delete.end();
 
 9445      deleted_fns_.erase(*i);
 
 9450    for (string_function_ptr_map::const_iterator i = added_fns_.begin();
 
 9451     i != added_fns_.end();
 
 9454    if (first_->lookup_function_symbol(*i->second->get_symbol()))
 
 9455      to_delete.push_back(i->first);
 
 9456    else if (! i->second->get_symbol()->get_version().is_empty()
 
 9457         && i->second->get_symbol()->get_version().is_default())
 
 9465        if (first_->lookup_function_symbol(i->second->get_symbol()->get_name(),
 
 9467          to_delete.push_back(i->first);
 
 9471    for (vector<string>::const_iterator i = to_delete.begin();
 
 9472     i != to_delete.end();
 
 9474      added_fns_.erase(*i);
 
 9480    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 9481     it != e.deletions().end();
 
 9484    unsigned i = it->index();
 
 9485    ABG_ASSERT(i < first_->get_variables().size());
 
 9487    const var_decl* deleted_var = first_->get_variables()[i];
 
 9488    string n = deleted_var->
get_id();
 
 9490    ABG_ASSERT(deleted_vars_.find(n) == deleted_vars_.end());
 
 9491    deleted_vars_[n] = deleted_var;
 
 9494    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 9495     it != e.insertions().end();
 
 9498    for (vector<unsigned>::const_iterator iit =
 
 9499           it->inserted_indexes().begin();
 
 9500         iit != it->inserted_indexes().end();
 
 9504        const var_decl* added_var = second_->get_variables()[i];
 
 9505        string n = added_var->
get_id();
 
 9508          string_var_ptr_map::const_iterator k = added_vars_.find(n);
 
 9509          if ( k != added_vars_.end())
 
 9516        string_var_ptr_map::const_iterator j =
 
 9517          deleted_vars_.find(n);
 
 9518        if (j != deleted_vars_.end())
 
 9520        if (*j->second != *added_var)
 
 9528        deleted_vars_.erase(j);
 
 9531          added_vars_[n] = added_var;
 
 9535                  sorted_changed_vars_);
 
 9541    vector<string> to_delete;
 
 9542    for (string_var_ptr_map::const_iterator i = deleted_vars_.begin();
 
 9543     i != deleted_vars_.end();
 
 9545      if (second_->lookup_variable_symbol(*i->second->get_symbol()))
 
 9546    to_delete.push_back(i->first);
 
 9548    for (vector<string>::const_iterator i = to_delete.begin();
 
 9549     i != to_delete.end();
 
 9551      deleted_vars_.erase(*i);
 
 9556    for (string_var_ptr_map::const_iterator i = added_vars_.begin();
 
 9557     i != added_vars_.end();
 
 9559      if (first_->lookup_variable_symbol(*i->second->get_symbol()))
 
 9560    to_delete.push_back(i->first);
 
 9561      else if (! i->second->get_symbol()->get_version().is_empty()
 
 9562         && i->second->get_symbol()->get_version().is_default())
 
 9570      if (first_->lookup_variable_symbol(i->second->get_symbol()->get_name(),
 
 9572        to_delete.push_back(i->first);
 
 9575    for (vector<string>::const_iterator i = to_delete.begin();
 
 9576     i != to_delete.end();
 
 9578      added_vars_.erase(*i);
 
 9586    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 9587     it != e.deletions().end();
 
 9590    unsigned i = it->index();
 
 9591    ABG_ASSERT(i < first_->get_unreferenced_function_symbols().size());
 
 9593      first_->get_unreferenced_function_symbols()[i];
 
 9594    if (!second_->lookup_function_symbol(*deleted_sym))
 
 9595      deleted_unrefed_fn_syms_[deleted_sym->get_id_string()] = deleted_sym;
 
 9598    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 9599     it != e.insertions().end();
 
 9602    for (vector<unsigned>::const_iterator iit =
 
 9603           it->inserted_indexes().begin();
 
 9604         iit != it->inserted_indexes().end();
 
 9608        ABG_ASSERT(i < second_->get_unreferenced_function_symbols().size());
 
 9610          second_->get_unreferenced_function_symbols()[i];
 
 9611        if ((deleted_unrefed_fn_syms_.find(added_sym->get_id_string())
 
 9612         == deleted_unrefed_fn_syms_.end()))
 
 9614        if (!first_->lookup_function_symbol(*added_sym))
 
 9617            if (! added_sym->get_version().is_empty()
 
 9618            && added_sym->get_version().is_default())
 
 9626            if (first_->lookup_function_symbol(added_sym->get_name(),
 
 9632              added_unrefed_fn_syms_[added_sym->get_id_string()] =
 
 9637          deleted_unrefed_fn_syms_.erase(added_sym->get_id_string());
 
 9647    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 9648     it != e.deletions().end();
 
 9651    unsigned i = it->index();
 
 9652    ABG_ASSERT(i < first_->get_unreferenced_variable_symbols().size());
 
 9654      first_->get_unreferenced_variable_symbols()[i];
 
 9655    if (!second_->lookup_variable_symbol(*deleted_sym))
 
 9656      deleted_unrefed_var_syms_[deleted_sym->get_id_string()] = deleted_sym;
 
 9659    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 9660     it != e.insertions().end();
 
 9663    for (vector<unsigned>::const_iterator iit =
 
 9664           it->inserted_indexes().begin();
 
 9665         iit != it->inserted_indexes().end();
 
 9669        ABG_ASSERT(i < second_->get_unreferenced_variable_symbols().size());
 
 9671          second_->get_unreferenced_variable_symbols()[i];
 
 9672        if (deleted_unrefed_var_syms_.find(added_sym->get_id_string())
 
 9673        == deleted_unrefed_var_syms_.end())
 
 9675        if (!first_->lookup_variable_symbol(*added_sym))
 
 9678            if (! added_sym->get_version().is_empty()
 
 9679            && added_sym->get_version().is_default())
 
 9687            if (first_->lookup_variable_symbol(added_sym->get_name(),
 
 9693              added_unrefed_var_syms_[added_sym->get_id_string()] =
 
 9698          deleted_unrefed_var_syms_.erase(added_sym->get_id_string());
 
 9709    for (vector<deletion>::const_iterator it = e.deletions().begin();
 
 9710     it != e.deletions().end();
 
 9713    unsigned i = it->index();
 
 9715      (first_->get_types_not_reachable_from_public_interfaces()[i]);
 
 9722    deleted_unreachable_types_[repr] = t;
 
 9727    for (vector<insertion>::const_iterator it = e.insertions().begin();
 
 9728     it != e.insertions().end();
 
 9731    for (vector<unsigned>::const_iterator iit =
 
 9732           it->inserted_indexes().begin();
 
 9733         iit != it->inserted_indexes().end();
 
 9738          (second_->get_types_not_reachable_from_public_interfaces()[i]);
 
 9757        string_type_base_sptr_map::const_iterator j =
 
 9758          deleted_unreachable_types_.find(repr);
 
 9759        if (j != deleted_unreachable_types_.end())
 
 9764        decl_base_sptr old_type = 
is_decl(j->second);
 
 9765        decl_base_sptr new_type = 
is_decl(t);
 
 9766        if (old_type != new_type)
 
 9774            changed_unreachable_types_[repr]= d;
 
 9780        deleted_unreachable_types_.erase(j);
 
 9785          added_unreachable_types_[repr] = t;
 
 9798      std::set<type_base_sptr> deleted_anon_types;
 
 9799      std::set<type_base_sptr> added_anon_types;
 
 9801      for (
auto entry : deleted_unreachable_types_)
 
 9807      deleted_anon_types.insert(entry.second);
 
 9811      for (
auto entry : added_unreachable_types_)
 
 9816      added_anon_types.insert(entry.second);
 
 9821      class_or_union_sptr deleted_class;
 
 9826      for (
auto deleted: deleted_anon_types)
 
 9835          for (
auto enr : deleted_enum->get_enumerators())
 
 9837          bool this_enum_got_changed = 
false;
 
 9838          for (
auto t : added_anon_types)
 
 9855                changed_unreachable_types_[repr]= d;
 
 9856                this_enum_got_changed = 
true;
 
 9863                removed_anon_types_to_erase[r1] = deleted_enum;
 
 9864                added_anon_types_to_erase[r2] = added_enum;
 
 9868          if (this_enum_got_changed)
 
 9872      else if (deleted_class)
 
 9877          for (
auto dm : deleted_class->get_data_members())
 
 9879          bool this_class_got_changed = 
false;
 
 9880          for (
auto klass : added_anon_types)
 
 9882              if (class_or_union_sptr added_class =
 
 9901                changed_unreachable_types_[repr]= d;
 
 9902                this_class_got_changed = 
true;
 
 9909                removed_anon_types_to_erase[r1] = deleted_class;
 
 9910                added_anon_types_to_erase[r2] = added_class;
 
 9914          if (this_class_got_changed)
 
 9923      for (
auto entry : added_anon_types_to_erase)
 
 9924    added_unreachable_types_.erase(entry.first);
 
 9926      for (
auto entry : removed_anon_types_to_erase)
 
 9927    deleted_unreachable_types_.erase(entry.first);
 
 9956  return fn_suppr->suppresses_function(fn, k, ctxt);
 
 9975variable_is_suppressed(
const var_decl* var,
 
 9983  return var_suppr->suppresses_variable(var, k, ctxt);
 
 9995  for (suppressions_type::const_iterator i = suppressions.begin();
 
 9996       i != suppressions.end();
 
10003      for (string_function_ptr_map::const_iterator e = added_fns_.begin();
 
10004           e != added_fns_.end();
 
10006        if (function_is_suppressed(e->second, fn_suppr,
 
10009          suppressed_added_fns_[e->first] = e->second;
 
10012      for (string_function_ptr_map::const_iterator e = deleted_fns_.begin();
 
10013           e != deleted_fns_.end();
 
10015        if (function_is_suppressed(e->second, fn_suppr,
 
10018          suppressed_deleted_fns_[e->first] = e->second;
 
10021      for (string_elf_symbol_map::const_iterator e =
 
10022         added_unrefed_fn_syms_.begin();
 
10023           e != added_unrefed_fn_syms_.end();
 
10025        if (fn_suppr->suppresses_function_symbol(e->second,
 
10028          suppressed_added_unrefed_fn_syms_[e->first] = e->second;
 
10031      for (string_elf_symbol_map::const_iterator e =
 
10032         deleted_unrefed_fn_syms_.begin();
 
10033           e != deleted_unrefed_fn_syms_.end();
 
10035        if (fn_suppr->suppresses_function_symbol(e->second,
 
10038          suppressed_deleted_unrefed_fn_syms_[e->first] = e->second;
 
10046      for (string_function_ptr_map::const_iterator e = added_fns_.begin();
 
10047           e != added_fns_.end();
 
10056        if (type_suppr->suppresses_type(c, ctxt))
 
10057          suppressed_added_fns_[e->first] = e->second;
 
10060      for (string_function_ptr_map::const_iterator e = deleted_fns_.begin();
 
10061           e != deleted_fns_.end();
 
10070        if (type_suppr->suppresses_type(c, ctxt))
 
10071          suppressed_deleted_fns_[e->first] = e->second;
 
10076      for (string_type_base_sptr_map::const_iterator e =
 
10077         deleted_unreachable_types_.begin();
 
10078           e != deleted_unreachable_types_.end();
 
10080        if (type_suppr->suppresses_type(e->second, ctxt))
 
10081          suppressed_deleted_unreachable_types_[e->first] = e->second;
 
10085      for (string_type_base_sptr_map::const_iterator e =
 
10086         added_unreachable_types_.begin();
 
10087           e != added_unreachable_types_.end();
 
10089        if (type_suppr->suppresses_type(e->second, ctxt))
 
10090          suppressed_added_unreachable_types_[e->first] = e->second;
 
10097      for (string_var_ptr_map::const_iterator e = added_vars_.begin();
 
10098           e != added_vars_.end();
 
10100        if (variable_is_suppressed(e->second, var_suppr,
 
10103          suppressed_added_vars_[e->first] = e->second;
 
10106      for (string_var_ptr_map::const_iterator e = deleted_vars_.begin();
 
10107           e != deleted_vars_.end();
 
10109        if (variable_is_suppressed(e->second, var_suppr,
 
10112          suppressed_deleted_vars_[e->first] = e->second;
 
10115      for (string_elf_symbol_map::const_iterator e =
 
10116         added_unrefed_var_syms_.begin();
 
10117           e != added_unrefed_var_syms_.end();
 
10119        if (var_suppr->suppresses_variable_symbol(e->second,
 
10122          suppressed_added_unrefed_var_syms_[e->first] = e->second;
 
10125      for (string_elf_symbol_map::const_iterator e =
 
10126         deleted_unrefed_var_syms_.begin();
 
10127           e != deleted_unrefed_var_syms_.end();
 
10129        if (var_suppr->suppresses_variable_symbol(e->second,
 
10132          suppressed_deleted_unrefed_var_syms_[e->first] = e->second;
 
10150  string_function_ptr_map::const_iterator i =
 
10151    suppressed_deleted_fns_.find(fn->
get_id());
 
10153  return (i != suppressed_deleted_fns_.end());
 
10170  string_type_base_sptr_map::const_iterator i =
 
10171    suppressed_added_unreachable_types_.find(repr);
 
10172  if (i == suppressed_added_unreachable_types_.end())
 
10192  string_type_base_sptr_map::const_iterator i =
 
10193    suppressed_deleted_unreachable_types_.find(repr);
 
10194  if (i == suppressed_deleted_unreachable_types_.end())
 
10213  string_function_ptr_map::const_iterator i =
 
10214    suppressed_added_fns_.find(fn->
get_id());
 
10216  return (i != suppressed_added_fns_.end());
 
10232  string_var_ptr_map::const_iterator i =
 
10233    suppressed_deleted_vars_.find(var->
get_id());
 
10235  return (i != suppressed_deleted_vars_.end());
 
10251  string_var_ptr_map::const_iterator i =
 
10252    suppressed_added_vars_.find(var->
get_id());
 
10254  return (i != suppressed_added_vars_.end());
 
10270  string_elf_symbol_map::const_iterator i =
 
10271    suppressed_deleted_unrefed_fn_syms_.find(s->
get_id_string());
 
10273  return (i != suppressed_deleted_unrefed_fn_syms_.end());
 
10289  string_elf_symbol_map::const_iterator i =
 
10290    suppressed_added_unrefed_fn_syms_.find(s->
get_id_string());
 
10292  return (i != suppressed_added_unrefed_fn_syms_.end());
 
10308  string_elf_symbol_map::const_iterator i =
 
10309    suppressed_deleted_unrefed_var_syms_.find(s->
get_id_string());
 
10311  return (i != suppressed_deleted_unrefed_var_syms_.end());
 
10327  string_elf_symbol_map::const_iterator i =
 
10328    suppressed_added_unrefed_var_syms_.find(s->
get_id_string());
 
10330  return (i != suppressed_added_unrefed_var_syms_.end());
 
10333#ifdef do_count_diff_map_changes 
10334#undef do_count_diff_map_changes 
10336#define do_count_diff_map_changes(diff_map, n_changes, n_filtered)  \ 
10338    string_diff_ptr_map::const_iterator i;              \ 
10339    for (i = diff_map.begin();                      \ 
10340     i != diff_map.end();                       \ 
10343    if (const var_diff* d = is_var_diff(i->second))     \ 
10344      if (is_data_member(d->first_var()))               \ 
10347    if (i->second->has_local_changes())             \ 
10349    if (!i->second->get_canonical_diff()->to_be_reported())     \ 
10365  count_leaf_type_changes(num_changes, num_filtered);
 
10368  do_count_diff_map_changes(leaf_diffs_.get_function_decl_diff_map(),
 
10369    num_changes, num_filtered);
 
10370  do_count_diff_map_changes(leaf_diffs_.get_var_decl_diff_map(),
 
10371    num_changes, num_filtered);
 
10384                       size_t &num_filtered)
 
10386  do_count_diff_map_changes(leaf_diffs_.get_type_decl_diff_map(),
 
10387    num_changes, num_filtered);
 
10388  do_count_diff_map_changes(leaf_diffs_.get_enum_diff_map(),
 
10389    num_changes, num_filtered);
 
10390  do_count_diff_map_changes(leaf_diffs_.get_class_diff_map(),
 
10391    num_changes, num_filtered);
 
10392  do_count_diff_map_changes(leaf_diffs_.get_union_diff_map(),
 
10393    num_changes, num_filtered);
 
10394  do_count_diff_map_changes(leaf_diffs_.get_typedef_diff_map(),
 
10395    num_changes, num_filtered);
 
10396  do_count_diff_map_changes(leaf_diffs_.get_subrange_diff_map(),
 
10397                num_changes, num_filtered);
 
10398  do_count_diff_map_changes(leaf_diffs_.get_array_diff_map(),
 
10399    num_changes, num_filtered);
 
10400  do_count_diff_map_changes(leaf_diffs_.get_distinct_diff_map(),
 
10401    num_changes, num_filtered);
 
10402  do_count_diff_map_changes(leaf_diffs_.get_fn_parm_diff_map(),
 
10403                num_changes, num_filtered);
 
10431                       size_t &num_deleted,
 
10432                       size_t &num_changed,
 
10433                       size_t &num_filtered_added,
 
10434                       size_t &num_filtered_deleted,
 
10435                       size_t &num_filtered_changed)
 
10437  num_added = added_unreachable_types_.size();
 
10438  num_deleted = deleted_unreachable_types_.size();
 
10439  num_changed = changed_unreachable_types_.size();
 
10440  num_filtered_added = suppressed_added_unreachable_types_.size();
 
10441  num_filtered_deleted = suppressed_deleted_unreachable_types_.size();
 
10443  for (vector<diff_sptr>::const_iterator i =
 
10447    if (!(*i)->to_be_reported())
 
10448      ++num_filtered_changed;
 
10457{
return changed_unreachable_types_;}
 
10468const vector<diff_sptr>&
 
10471if (changed_unreachable_types_sorted_.empty())
 
10472  if (!changed_unreachable_types_.empty())
 
10474                  changed_unreachable_types_sorted_);
 
10476 return changed_unreachable_types_sorted_;
 
10511  if (ctxt->perform_change_categorization())
 
10513      if (get_context()->
do_log())
 
10515      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10516            << 
"applying filters to " 
10517            << changed_fns_.size()
 
10518            << 
" changed fns ...\n";
 
10524      for (function_decl_diff_sptrs_type::const_iterator i =
 
10525         changed_fns_.begin();
 
10526       i != changed_fns_.end();
 
10530      ctxt->maybe_apply_filters(
diff);
 
10533      if (get_context()->
do_log())
 
10536      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10537            << 
"filters to changed fn applied!:" << t << 
"\n";
 
10539      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10540            << 
"applying filters to " 
10541            << sorted_changed_vars_.size()
 
10542            << 
" changed vars ...\n";
 
10548      for (var_diff_sptrs_type::const_iterator i = sorted_changed_vars_.begin();
 
10549       i != sorted_changed_vars_.end();
 
10553      ctxt->maybe_apply_filters(
diff);
 
10556      if (get_context()->
do_log())
 
10559      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10560            << 
"filters to changed vars applied!:" << t << 
"\n";
 
10562      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10563            << 
"applying filters to unreachable types ...\n";
 
10570    ctxt->maybe_apply_filters(
diff);
 
10573    ctxt->maybe_apply_filters(entry.second);
 
10575      if (get_context()->
do_log())
 
10578      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10579            << 
"filters to unreachable types applied!:" << t << 
"\n";
 
10581      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10582            << 
"categorizing redundant changed sub nodes ...\n";
 
10586      categorize_redundant_changed_sub_nodes();
 
10588      if (get_context()->
do_log())
 
10591      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10592            << 
"redundant changed sub nodes categorized!:" << t << 
"\n";
 
10594      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10595            << 
"count changed fns ...\n";
 
10603  for (function_decl_diff_sptrs_type::const_iterator i =
 
10604     changed_fns_.begin();
 
10605       i != changed_fns_.end();
 
10608      if ((*i)->is_filtered_out())
 
10613      if ((*i)->has_local_changes())
 
10624      if ((*i)->has_local_changes())
 
10629  if (get_context()->
do_log())
 
10632      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10633        << 
"changed fn counted!:" << t << 
"\n";
 
10635      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10636        << 
"count changed vars ...\n";
 
10642  for (var_diff_sptrs_type ::const_iterator i = sorted_changed_vars_.begin();
 
10643       i != sorted_changed_vars_.end();
 
10646      if ((*i)->is_filtered_out())
 
10651      if ((*i)->has_local_changes())
 
10655      if ((*i)->has_local_changes())
 
10660  if (get_context()->
do_log())
 
10663      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10664        << 
"changed vars counted!:" << t << 
"\n";
 
10666      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10667        << 
"count leaf changed types ...\n";
 
10682    size_t num_type_changes = 0, num_type_filtered = 0;
 
10683    count_leaf_type_changes(num_type_changes, num_type_filtered);
 
10689  if (get_context()->
do_log())
 
10692      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10693        << 
"changed leaf types counted!:" << t << 
"\n";
 
10695      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10696        << 
"count leaf changed artefacts ...\n";
 
10702    size_t num_changes = 0, num_filtered = 0;
 
10703    count_leaf_changes(num_changes, num_filtered);
 
10709  if (get_context()->
do_log())
 
10712      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10713        << 
"changed leaf artefacts counted!:" << t << 
"\n";
 
10715      std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10716        << 
"count unreachable types ...\n";
 
10722    size_t num_added_unreachable_types = 0,
 
10723      num_changed_unreachable_types = 0,
 
10724      num_deleted_unreachable_types = 0,
 
10725      num_added_unreachable_types_filtered = 0,
 
10726      num_changed_unreachable_types_filtered = 0,
 
10727      num_deleted_unreachable_types_filtered = 0;
 
10729    count_unreachable_types(num_added_unreachable_types,
 
10730                num_deleted_unreachable_types,
 
10731                num_changed_unreachable_types,
 
10732                num_added_unreachable_types_filtered,
 
10733                num_deleted_unreachable_types_filtered,
 
10734                num_changed_unreachable_types_filtered);
 
10736    if (get_context()->
do_log())
 
10739    std::cerr << 
"in apply_filters_and_compute_diff_stats:" 
10740          << 
"unreachable types counted!:" << t << 
"\n";
 
10747      (num_added_unreachable_types_filtered);
 
10749      (num_deleted_unreachable_types_filtered);
 
10751      (num_changed_unreachable_types_filtered);
 
10767                   const string&    indent)
 
10770  size_t net_num_leaf_changes =
 
10783  if (!sonames_equal_)
 
10784    out << indent << 
"ELF SONAME changed\n";
 
10786  if (!architectures_equal_)
 
10787    out << indent << 
"ELF architecture changed\n";
 
10791  if (ctxt->show_leaf_changes_only())
 
10793      out << 
"Leaf changes summary: ";
 
10794      out << net_num_leaf_changes << 
" artifact";
 
10795      if (net_num_leaf_changes > 1)
 
10800    out << 
" (" << num_filtered << 
" filtered out)";
 
10803      out << indent << 
"Changed leaf types summary: " 
10807        << 
" filtered out)";
 
10808      out << 
" leaf type";
 
10811      out << 
" changed\n";
 
10814      out << indent << 
"Removed/Changed/Added functions summary: ";
 
10819        << 
" filtered out)";
 
10826        << 
" filtered out)";
 
10833    out << 
"functions";
 
10839      out << indent << 
"Removed/Changed/Added variables summary: ";
 
10843        << 
" filtered out)";
 
10850        << 
" filtered out)";
 
10857    out << 
"variables";
 
10860        << 
" filtered out)";
 
10869      out << indent << 
"Functions changes summary: ";
 
10874        << 
" filtered out)";
 
10885      if (total_nb_function_changes <= 1)
 
10886    out << 
" function";
 
10888    out << 
" functions";
 
10895      out << indent << 
"Variables changes summary: ";
 
10899        << 
" filtered out)";
 
10910        << 
" filtered out)";
 
10911      if (total_nb_variable_changes <= 1)
 
10912    out << 
" variable";
 
10914    out << 
" variables";
 
10920  if (ctxt->show_unreachable_types())
 
10922      size_t total_nb_unreachable_type_changes =
 
10928      out << indent << 
"Unreachable types summary: " 
10933        << 
" filtered out)";
 
10940        << 
" filtered out)";
 
10947        << 
" filtered out)";
 
10948      if (total_nb_unreachable_type_changes <= 1)
 
10955  if (ctxt->show_symbols_unreferenced_by_debug_info()
 
10963      if (!ctxt->show_added_symbols_unreferenced_by_debug_info()
 
10973          << 
"Function symbols changes summary: " 
10977        << 
" filtered out)";
 
10982        << 
" filtered out)";
 
10983      out << 
" function symbol";
 
10986      out << 
" not referenced by debug info\n";
 
10991      if (!ctxt->show_added_symbols_unreferenced_by_debug_info()
 
11001          << 
"Variable symbols changes summary: " 
11005        << 
" filtered out)";
 
11010        << 
" filtered out)";
 
11011      out << 
" variable symbol";
 
11014      out << 
" not referenced by debug info\n";
 
11028  ctxt->forget_visited_diffs();
 
11029  for (function_decl_diff_sptrs_type::const_iterator i =
 
11030     changed_fns_.begin();
 
11031       i!= changed_fns_.end();
 
11038  for (var_diff_sptrs_type::const_iterator i = sorted_changed_vars_.begin();
 
11039       i!= sorted_changed_vars_.end();
 
11046  for (diff_sptrs_type::const_iterator i =
 
11062  for (function_decl_diff_sptrs_type::const_iterator i = changed_fns_.begin();
 
11063       i!= changed_fns_.end();
 
11070  for (var_diff_sptrs_type::const_iterator i = sorted_changed_vars_.begin();
 
11071       i!= sorted_changed_vars_.end();
 
11089  if (!ctxt->dump_diff_tree()
 
11090      || ctxt->error_output_stream() == 0)
 
11093  if (!changed_fns_.empty())
 
11095      *ctxt->error_output_stream() << 
"changed functions diff tree: \n\n";
 
11096      for (function_decl_diff_sptrs_type::const_iterator i =
 
11097         changed_fns_.begin();
 
11098       i != changed_fns_.end();
 
11106  if (!sorted_changed_vars_.empty())
 
11108      *ctxt->error_output_stream() << 
"\nchanged variables diff tree: \n\n";
 
11109      for (var_diff_sptrs_type::const_iterator i =
 
11110         sorted_changed_vars_.begin();
 
11111       i != sorted_changed_vars_.end();
 
11121      *ctxt->error_output_stream() << 
"\nchanged unreachable " 
11122    "types diff tree: \n\n";
 
11123      for (vector<diff_sptr>::const_iterator i =
 
11141  for (function_decl_diff_sptrs_type::const_iterator i =
 
11160             corpus_sptr second,
 
11162  : priv_(new 
priv(first, second, ctxt))
 
11165corpus_diff::~corpus_diff() = 
default;
 
11171  if (priv_->finished_)
 
11174  priv_->finished_ = 
true;
 
11194{
return priv_->first_;}
 
11199{
return priv_->second_;}
 
11202const vector<diff*>&
 
11204{
return priv_->children_;}
 
11222  bool inserted = 
false;
 
11223  for (vector<diff*>::iterator i = priv_->children_.begin();
 
11224       i != priv_->children_.end();
 
11227    if (!is_less_than(d.get(), *i))
 
11229    context()->keep_diff_alive(d);
 
11230    priv_->children_.insert(i, d.get());
 
11239      context()->keep_diff_alive(d);
 
11243      priv_->children_.push_back(d.get());
 
11251{
return priv_->fns_edit_script_;}
 
11257{
return priv_->vars_edit_script_;}
 
11264{
return !priv_->sonames_equal_;}
 
11271{
return !priv_->architectures_equal_;}
 
11278{
return priv_->deleted_fns_;}
 
11285{
return priv_->added_fns_;}
 
11297{
return priv_->changed_fns_map_;}
 
11306{
return priv_->changed_fns_;}
 
11314{
return priv_->deleted_vars_;}
 
11321{
return priv_->added_vars_;}
 
11329{
return priv_->changed_vars_map_;}
 
11337{
return priv_->sorted_changed_vars_;}
 
11346{
return priv_->deleted_unrefed_fn_syms_;}
 
11355{
return priv_->added_unrefed_fn_syms_;}
 
11364{
return priv_->deleted_unrefed_var_syms_;}
 
11373{
return priv_->added_unrefed_var_syms_;}
 
11382{
return priv_->deleted_unreachable_types_;}
 
11390const vector<type_base_sptr>&
 
11393  if (priv_->deleted_unreachable_types_sorted_.empty())
 
11394    if (!priv_->deleted_unreachable_types_.empty())
 
11396                     priv_->deleted_unreachable_types_sorted_);
 
11398  return priv_->deleted_unreachable_types_sorted_;
 
11408{
return priv_->added_unreachable_types_;}
 
11416const vector<type_base_sptr>&
 
11419  if (priv_->added_unreachable_types_sorted_.empty())
 
11420    if (!priv_->added_unreachable_types_.empty())
 
11422                     priv_->added_unreachable_types_sorted_);
 
11424  return priv_->added_unreachable_types_sorted_;
 
11434{
return priv_->changed_unreachable_types_;}
 
11442const vector<diff_sptr>&
 
11444{
return priv_->changed_unreachable_types_sorted();}
 
11451{
return priv_->get_context();}
 
11458  if (priv_->pretty_representation_.empty())
 
11460      std::ostringstream o;
 
11461      o << 
"corpus_diff[" 
11466      priv_->pretty_representation_ = o.str();
 
11468  return priv_->pretty_representation_;
 
11479      || !(priv_->deleted_fns_.empty()
 
11480           && priv_->added_fns_.empty()
 
11481           && priv_->changed_fns_map_.empty()
 
11482           && priv_->deleted_vars_.empty()
 
11483           && priv_->added_vars_.empty()
 
11484           && priv_->changed_vars_map_.empty()
 
11485           && priv_->added_unrefed_fn_syms_.empty()
 
11486           && priv_->deleted_unrefed_fn_syms_.empty()
 
11487           && priv_->added_unrefed_var_syms_.empty()
 
11488           && priv_->deleted_unrefed_var_syms_.empty()
 
11489           && priv_->deleted_unreachable_types_.empty()
 
11490           && priv_->added_unreachable_types_.empty()
 
11491           && priv_->changed_unreachable_types_.empty()));
 
11546      for (
auto &entry : priv_->changed_unreachable_types())
 
11590{
return  context()->get_reporter()->diff_has_net_changes(
this);}
 
11615  if (priv_->diff_stats_)
 
11616    return *priv_->diff_stats_;
 
11621      std::cerr << 
"Applying suppressions ...\n";
 
11630      std::cerr << 
"suppressions applied!:" << t << 
"\n";
 
11637      std::cerr << 
"Marking leaf nodes ...\n";
 
11646      std::cerr << 
"leaf nodes marked!:" << t << 
"\n";
 
11647      std::cerr << 
"Applying filters and computing diff stats ...\n";
 
11651  priv_->apply_filters_and_compute_diff_stats(*priv_->diff_stats_);
 
11656      std::cerr << 
"Filters applied and diff stats computed!: " << t << 
"\n";
 
11659  return *priv_->diff_stats_;
 
11681  visit_begin(
diff *d)
 
11726    const corpus_diff *corpus_diff_node = ctxt->get_corpus_diff().get();
 
11729    if (
diff *iface_diff = get_current_topmost_iface_diff())
 
11736          get_leaf_diffs().insert_diff_node(d, iface);
 
11754  if (!
context()->show_leaf_changes_only())
 
11757  leaf_diff_node_marker_visitor v;
 
11758  context()->forget_visited_diffs();
 
11759  bool s = 
context()->visiting_a_node_twice_is_forbidden();
 
11760  context()->forbid_visiting_a_node_twice(
true);
 
11761  if (
context()->show_impacted_interfaces())
 
11762    context()->forbid_visiting_a_node_twice_per_interface(
true);
 
11764  context()->forbid_visiting_a_node_twice(s);
 
11765  context()->forbid_visiting_a_node_twice_per_interface(
false);
 
11775{
return priv_->leaf_diffs_;}
 
11784{
return priv_->leaf_diffs_;}
 
11795  context()->get_reporter()->report(*
this, out, indent);
 
11810  if (!v.
visit(
this, 
true))
 
11816  for (function_decl_diff_sptrs_type::const_iterator i =
 
11824      if (ctxt->visiting_a_node_twice_is_forbidden_per_interface())
 
11825        ctxt->forget_visited_diffs();
 
11838  for (var_diff_sptrs_type::const_iterator i =
 
11846      if (ctxt->visiting_a_node_twice_is_forbidden_per_interface())
 
11847        ctxt->forget_visited_diffs();
 
11864  for (vector<diff_sptr>::const_iterator i =
 
11872      if (ctxt->visiting_a_node_twice_is_forbidden_per_interface())
 
11873        ctxt->forget_visited_diffs();
 
11901         const corpus_sptr  s,
 
11904  typedef corpus::functions::const_iterator fns_it_type;
 
11905  typedef corpus::variables::const_iterator vars_it_type;
 
11906  typedef elf_symbols::const_iterator symbols_it_type;
 
11908  typedef vector<type_base_wptr>::const_iterator type_base_wptr_it_type;
 
11917  ctxt->set_corpus_diff(r);
 
11919  if(ctxt->show_soname_change())
 
11920    r->priv_->sonames_equal_ = f->get_soname() == s->get_soname();
 
11922    r->priv_->sonames_equal_ = 
true;
 
11924  r->priv_->architectures_equal_ =
 
11925    f->get_architecture_name() == s->get_architecture_name();
 
11928  diff_utils::compute_diff<fns_it_type, eq_type>(f->get_functions().begin(),
 
11929                         f->get_functions().end(),
 
11930                         s->get_functions().begin(),
 
11931                         s->get_functions().end(),
 
11932                         r->priv_->fns_edit_script_);
 
11935  diff_utils::compute_diff<vars_it_type, eq_type>
 
11936    (f->get_variables().begin(), f->get_variables().end(),
 
11937     s->get_variables().begin(), s->get_variables().end(),
 
11938     r->priv_->vars_edit_script_);
 
11942  diff_utils::compute_diff<symbols_it_type, eq_type>
 
11943    (f->get_unreferenced_function_symbols().begin(),
 
11944     f->get_unreferenced_function_symbols().end(),
 
11945     s->get_unreferenced_function_symbols().begin(),
 
11946     s->get_unreferenced_function_symbols().end(),
 
11947     r->priv_->unrefed_fn_syms_edit_script_);
 
11951    diff_utils::compute_diff<symbols_it_type, eq_type>
 
11952    (f->get_unreferenced_variable_symbols().begin(),
 
11953     f->get_unreferenced_variable_symbols().end(),
 
11954     s->get_unreferenced_variable_symbols().begin(),
 
11955     s->get_unreferenced_variable_symbols().end(),
 
11956     r->priv_->unrefed_var_syms_edit_script_);
 
11958    if (ctxt->show_unreachable_types())
 
11961      diff_utils::compute_diff<type_base_wptr_it_type, eq_type>
 
11962    (f->get_types_not_reachable_from_public_interfaces().begin(),
 
11963     f->get_types_not_reachable_from_public_interfaces().end(),
 
11964     s->get_types_not_reachable_from_public_interfaces().begin(),
 
11965     s->get_types_not_reachable_from_public_interfaces().end(),
 
11966     r->priv_->unreachable_types_edit_script_);
 
11968  r->priv_->ensure_lookup_tables_populated();
 
11989         const corpus_group_sptr&   s,
 
11993  corpus_sptr c1 = f;
 
11994  corpus_sptr c2 = s;
 
12005struct diff_node_visitor::priv
 
12007  diff* topmost_interface_diff;
 
12011    : topmost_interface_diff(),
 
12016    : topmost_interface_diff(),
 
12026diff_node_visitor::~diff_node_visitor() = 
default;
 
12032  : priv_(new priv(k))
 
12042{
return priv_->kind;}
 
12062{priv_->kind = priv_->kind | v;}
 
12070{priv_->topmost_interface_diff = d;}
 
12078{
return priv_->topmost_interface_diff;}
 
12305    bool already_visited = d->
context()->diff_has_been_visited(d);
 
12313    bool update_canonical = !already_visited && canonical;
 
12315    for (vector<diff*>::const_iterator i = d->
children_nodes().begin();
 
12348    if (!already_visited && canonical)
 
12349      if (update_canonical)
 
12350        canonical->add_to_category(c);
 
12364  category_propagation_visitor v;
 
12365  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12366  diff_tree->
context()->forbid_visiting_a_node_twice(
true);
 
12367  diff_tree->
context()->forget_visited_diffs();
 
12369  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12391  category_propagation_visitor v;
 
12392  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12393  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
12395  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12420  visit_begin(
diff* d)
 
12422    bool is_private_type = 
false;
 
12433    if (canonical_diff != d)
 
12489    bool has_non_suppressed_child = 
false;
 
12490    bool has_non_empty_child = 
false;
 
12491    bool has_suppressed_child = 
false;
 
12492    bool has_non_private_child = 
false;
 
12493    bool has_private_child = 
false;
 
12494    bool has_descendant_with_allowed_change = 
false;
 
12527    && (!d->has_local_changes()
 
12552    for (vector<diff*>::const_iterator i = d->children_nodes().begin();
 
12553         i != d->children_nodes().end();
 
12557        if (child->has_changes())
 
12559        has_non_empty_child = 
true;
 
12561          has_suppressed_child = 
true;
 
12562        else if (child->get_class_of_equiv_category()
 
12568          has_non_suppressed_child = 
true;
 
12570        if (child->get_class_of_equiv_category()
 
12572          has_private_child = 
true;
 
12573        else if (child->get_class_of_equiv_category()
 
12579          has_non_private_child = 
true;
 
12583    if (has_non_empty_child
 
12584        && has_suppressed_child
 
12585        && !has_non_suppressed_child)
 
12591        if (canonical_diff != d)
 
12607    if (has_non_empty_child
 
12608        && has_private_child
 
12609        && !has_non_private_child)
 
12615        if (canonical_diff != d)
 
12625        && has_private_child
 
12626        && has_non_empty_child)
 
12632        if (canonical_diff != d)
 
12649        if (fn_type_diff->is_suppressed())
 
12655            if (canonical_diff != d)
 
12664    for (
auto child_node : d->children_nodes())
 
12670      has_descendant_with_allowed_change = 
true;
 
12672    if (has_descendant_with_allowed_change)
 
12675    d->add_to_category(c);
 
12676    d->get_canonical_diff()->add_to_category(c);
 
12690  if (diff_tree && !diff_tree->
context()->suppressions().empty())
 
12694      suppression_categorization_visitor v;
 
12695      diff_tree->
context()->forget_visited_diffs();
 
12696      bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12697      diff_tree->
context()->forbid_visiting_a_node_twice(
true);
 
12699      diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12722  if (diff_tree && !diff_tree->
context()->suppressions().empty())
 
12727      suppression_categorization_visitor v;
 
12728      diff_tree->
context()->forget_visited_diffs();
 
12729      bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12730      diff_tree->
context()->forbid_visiting_a_node_twice(
true);
 
12731      const_cast<corpus_diff*
>(diff_tree)->traverse(v);
 
12732      diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12738    apply_supprs_to_added_removed_fns_vars_unreachable_types();
 
12768  do_indent(
unsigned level)
 
12770    for (
unsigned i = 0; i < level; ++i)
 
12774  diff_node_printer(ostream& out)
 
12793  visit_begin(corpus_diff*)
 
12799  visit_end(corpus_diff*)
 
12805  visit(diff* d, 
bool pre)
 
12814    out_ << d->get_pretty_representation();
 
12818    do_indent(level_ + 1);
 
12819    out_ << 
"category: "<< d->get_category() << 
"\n";
 
12820    do_indent(level_ + 1);
 
12821    out_ << 
"@: " << std::hex << d << std::dec << 
"\n";
 
12822    do_indent(level_ + 1);
 
12823    out_ << 
"@-canonical: " << std::hex
 
12824     << d->get_canonical_diff()
 
12825     << std::dec << 
"\n";
 
12833  visit(corpus_diff* d, 
bool pre)
 
12842    for (
unsigned i = 0; i < level_; ++i)
 
12844    out_ << d->get_pretty_representation();
 
12863  diff_node_printer p(out);
 
12864  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12865  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
12867  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12881  diff_node_printer p(out);
 
12882  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
12883  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
12885  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
12924  bool skip_children_nodes_;
 
12926  redundancy_marking_visitor()
 
12927    : skip_children_nodes_()
 
12931  visit_begin(diff* d)
 
12933    if (d->to_be_reported())
 
12939    if ((d->context()->diff_has_been_visited(d)
 
12940         || d->get_canonical_diff()->is_traversing())
 
12941        && d->has_changes())
 
12956        bool redundant_with_sibling_node = 
false;
 
12961        if (p && 
dynamic_cast<const fn_parm_diff*
>(p))
 
12965          for (vector<diff*>::const_iterator s =
 
12966             p->children_nodes().begin();
 
12967           s != p->children_nodes().end();
 
12975          if (fn_parm_diff* f = 
dynamic_cast<fn_parm_diff*
>(*s))
 
12976            sib = f->type_diff().get();
 
12979          if (sib->get_canonical_diff() == d->get_canonical_diff()
 
12984              redundant_with_sibling_node = 
true;
 
12988        if (!redundant_with_sibling_node
 
13009        && (!d->get_canonical_diff()->is_filtered_out()
 
13010            || (d->get_canonical_diff()->get_category()
 
13017        && d->context()->diff_has_been_visited(d) != d
 
13039        skip_children_nodes_ = 
true;
 
13047    skip_children_nodes_ = 
true;
 
13052  visit_begin(corpus_diff*)
 
13059    if (skip_children_nodes_)
 
13066    skip_children_nodes_ = 
false;
 
13074        && (!d->has_local_changes_to_be_reported()
 
13100            && (!(d->has_local_changes()
 
13111            && (!(d->has_local_changes()
 
13118            && (!(d->has_local_changes()
 
13122        bool has_non_redundant_child = 
false;
 
13123        bool has_non_empty_child = 
false;
 
13124        for (vector<diff*>::const_iterator i =
 
13125           d->children_nodes().begin();
 
13126         i != d->children_nodes().end();
 
13129        if ((*i)->has_changes())
 
13131            has_non_empty_child = 
true;
 
13138            if ((*i)->to_be_reported()
 
13140              has_non_redundant_child = 
true;
 
13142        if (has_non_redundant_child)
 
13149        if (has_non_empty_child
 
13150        && !has_non_redundant_child)
 
13157  visit_end(corpus_diff*)
 
13166  visit(corpus_diff*, 
bool)
 
13174struct redundancy_clearing_visitor : 
public diff_node_visitor
 
13177  visit(corpus_diff*, 
bool)
 
13181  visit(diff* d, 
bool)
 
13185    c &= ~REDUNDANT_CATEGORY;
 
13186    d->set_category(c);
 
13198  if (diff_tree->
context()->show_redundant_changes())
 
13200  redundancy_marking_visitor v;
 
13201  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
13202  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
13204  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
13222  redundancy_marking_visitor v;
 
13223  diff_tree->
context()->forget_visited_diffs();
 
13224  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
13225  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
13227  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
13247  redundancy_clearing_visitor v;
 
13248  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
13249  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
13251  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
13252  diff_tree->
context()->forget_visited_diffs();
 
13270  redundancy_clearing_visitor v;
 
13271  bool s = diff_tree->
context()->visiting_a_node_twice_is_forbidden();
 
13272  diff_tree->
context()->forbid_visiting_a_node_twice(
false);
 
13274  diff_tree->
context()->forbid_visiting_a_node_twice(s);
 
13275  diff_tree->
context()->forget_visited_diffs();
 
13296  diff_tree->context()->maybe_apply_filters(diff_tree);
 
13314  if (t && t->get_environment().is_variadic_parameter_type(t))
 
13318  if (t && t->get_environment().is_variadic_parameter_type(t))
 
13383  if (allow_indirect_type)
 
13584has_local_type_change_only(
const diff *d)
 
13612    return (has_local_type_change_only(v)
 
13615    return (has_local_type_change_only(p)
 
13619    return (has_local_type_change_only(f)
 
The private data and functions of the abigail::ir::comparison types.
 
#define SKIP_MEM_FN_IF_VIRTUALITY_DISALLOWED
Skip the processing of the current member function if its virtual-ness is disallowed by the user.
 
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects,...
 
The abstraction of a diff between two arrays.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of array_diff.
 
const diff_sptr & element_type_diff() const
Getter for the diff between the two types of array elements.
 
array_diff(const array_type_def_sptr first, const array_type_def_sptr second, diff_sptr element_type_diff, diff_context_sptr ctxt=diff_context_sptr())
Constructor for array_diff.
 
const array_type_def_sptr second_array() const
Getter for the second array of the diff.
 
const array_type_def_sptr first_array() const
Getter for the first array of the diff.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Report the diff in a serialized form.
 
An abstraction of a diff between two instances of class_decl::base_spec.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of base_diff.
 
void set_underlying_class_diff(class_diff_sptr d)
Setter for the diff object for the diff of the underlyng base classes.
 
class_decl::base_spec_sptr second_base() const
Getter for the second base spec of the diff object.
 
base_diff(class_decl::base_spec_sptr first, class_decl::base_spec_sptr second, class_diff_sptr underlying, diff_context_sptr ctxt=diff_context_sptr())
 
const class_diff_sptr get_underlying_class_diff() const
Getter for the diff object for the diff of the underlying base classes.
 
class_decl::base_spec_sptr first_base() const
Getter for the first base spec of the diff object.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Generates a report for the current instance of base_diff.
 
This type abstracts changes for a class_decl.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of class_diff.
 
class_decl_sptr first_class_decl() const
 
const base_diff_sptrs_type & changed_bases()
Getter for the changed base classes of the diff.
 
const vector< class_decl::base_spec_sptr > & moved_bases() const
Getter for the vector of bases that "moved". That is, the vector of base types which position changed...
 
const string_base_sptr_map & inserted_bases() const
Getter for the inserted base classes of the diff.
 
const string_base_sptr_map & deleted_bases() const
Getter for the deleted base classes of the diff.
 
virtual enum change_kind has_local_changes() const
 
const edit_script & base_changes() const
 
virtual const string & get_pretty_representation() const
 
class_diff(class_decl_sptr first_scope, class_decl_sptr second_scope, diff_context_sptr ctxt=diff_context_sptr())
Constructor of class_diff.
 
friend class_diff_sptr compute_diff(const class_decl_sptr first, const class_decl_sptr second, diff_context_sptr ctxt)
Compute the set of changes between two instances of class_decl.
 
class_decl_sptr second_class_decl() const
Getter of the second class involved in the diff.
 
virtual void report(ostream &, const string &indent="") const
Produce a basic report about the changes between two class_decl.
 
This is the base class of class_diff and union_diff.
 
virtual bool has_changes() const
Test if the current diff node carries a change.
 
const edit_script & member_fn_tmpls_changes() const
 
size_t count_filtered_subtype_changed_data_members(bool local_only=false) const
Count the number of /filtered/ data members with a sub-type change.
 
const class_or_union_diff::priv_ptr & get_priv() const
Getter of the private data of the class_or_union_diff type.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of class_or_un...
 
const edit_script & member_class_tmpls_changes() const
 
void allocate_priv_data()
Allocate the memory for the priv_ pimpl data member of the class_or_union_diff class.
 
class_or_union_diff(class_or_union_sptr first_scope, class_or_union_sptr second_scope, diff_context_sptr ctxt=diff_context_sptr())
Constructor for the class_or_union_diff class.
 
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...
 
const edit_script & member_types_changes() const
 
const string_member_function_sptr_map & deleted_member_fns() const
 
class_or_union_sptr first_class_or_union() const
 
const var_diff_sptrs_type & sorted_subtype_changed_data_members() const
Getter of the sorted vector of data members with a (sub-)type change.
 
bool lookup_tables_empty(void) const
Tests if the lookup tables are empty.
 
const string_decl_base_sptr_map & data_members_replaced_by_adms() const
Get the map of data members that got replaced by anonymous data members.
 
void clear_lookup_tables(void)
Clear the lookup tables useful for reporting.
 
const string_decl_base_sptr_map & deleted_data_members() const
Getter for the data members that got deleted.
 
virtual ~class_or_union_diff()
Destructor of class_or_union_diff.
 
const string_decl_base_sptr_map & inserted_data_members() const
Getter for the data members that got inserted.
 
void ensure_lookup_tables_populated(void) const
If the lookup tables are not yet built, walk the differences and fill them.
 
const string_member_function_sptr_map & inserted_member_fns() const
 
const function_decl_diff_sptrs_type & changed_member_fns() const
Getter for the virtual members functions that have had a change in a sub-type, without having a chang...
 
const edit_script & data_members_changes() const
 
const changed_var_sptrs_type & ordered_data_members_replaced_by_adms() const
Get an ordered vector of of data members that got replaced by anonymous data members.
 
virtual enum change_kind has_local_changes() const
 
size_t count_filtered_changed_data_members(bool local_only=false) const
Count the number of /filtered/ data members that got replaced by another data member.
 
const edit_script & member_fns_changes() const
 
class_or_union_sptr second_class_or_union() const
 
const var_diff_sptrs_type & sorted_changed_data_members() const
Getter of the sorted vector of data members that got replaced by another data member.
 
virtual void report(ostream &, const string &indent="") const
Report the changes carried by the current class_or_union_diff node in a textual format.
 
This is a document class that aims to capture statistics about the changes carried by a corpus_diff t...
 
size_t num_changed_unreachable_types_filtered_out() const
Getter of the number of changed types that are unreachable from public interfaces and that have been ...
 
size_t num_func_removed() const
Getter for the number of functions removed.
 
size_t num_removed_unreachable_types_filtered_out() const
Getter of the number of removed types that are not reachable from public interfaces and that have bee...
 
size_t num_vars_changed() const
Getter for the number of variables that have a change in one of their sub-types.
 
size_t net_num_leaf_var_changes() const
Getter for the net number of leaf variable change diff nodes.
 
size_t num_vars_added() const
Getter for the number of variables added.
 
size_t num_removed_unreachable_types() const
Getter of the number of removed types that are unreachable from the public interface of the ABI corpu...
 
size_t num_changed_vars_filtered_out() const
Getter for the number of variables that have a change in one of their sub-types, and that have been f...
 
size_t num_changed_func_filtered_out() const
Getter for the number of functions that have a change in one of their sub-types, and that have been f...
 
size_t num_removed_vars_filtered_out() const
Getter for the number removed variables that have been filtered out.
 
size_t net_num_func_changed() const
Getter for the number of functions that have a change in their sub-types, minus the number of these f...
 
size_t net_num_vars_removed() const
Getter for the net number of removed variables.
 
size_t net_num_added_unreachable_types() const
Getter of the number of added types that are unreachable from public interfaces and that are *NOT* fi...
 
size_t num_removed_var_syms_filtered_out() const
Getter for the number of removed variable symbols, not referenced by any debug info,...
 
size_t net_num_added_func_syms() const
Getter of the net number of added function symbols that are not referenced by any debug info.
 
size_t num_added_var_syms_filtered_out() const
Getter for the number of added variable symbols, not referenced by any debug info,...
 
size_t num_added_unreachable_types() const
Getter of the number of added types that are unreachable from the public interface of the ABI corpus.
 
size_t net_num_removed_func_syms() const
Getter of the net number of removed function symbols that are not referenced by any debug info.
 
size_t num_var_syms_added() const
Getter for the number of variable symbols (not referenced by any debug info) that got added.
 
size_t num_leaf_var_changes() const
Getter for the number of leaf variable change diff nodes.
 
size_t net_num_removed_var_syms() const
Getter of the net number of removed variable symbols that are not referenced by any debug info.
 
size_t net_num_func_removed() const
Getter for the net number of function removed.
 
size_t net_num_func_added() const
Getter for the net number of added functions.
 
size_t net_num_removed_unreachable_types() const
Getter of the number of removed types that are not reachable from public interfaces and that have *NO...
 
size_t net_num_leaf_changes() const
Getter of the net number of leaf change diff nodes.
 
size_t num_removed_func_syms_filtered_out() const
Getter for the number of removed function symbols, not referenced by debug info, that have been filte...
 
size_t num_added_unreachable_types_filtered_out() const
Getter of the number of added types that are unreachable from public interfaces and that are filtered...
 
size_t num_added_func_filtered_out() const
Getter for the number of added function that have been filtered out.
 
size_t num_func_syms_added() const
Getter for the number of function symbols (not referenced by any debug info) that got added.
 
size_t net_num_leaf_type_changes() const
Getter for the net number of leaf type change diff nodes.
 
size_t num_func_added() const
Getter for the number of functions added.
 
size_t net_num_added_var_syms() const
Getter of the net number of added variable symbols that are not referenced by any debug info.
 
size_t num_leaf_type_changes() const
Getter for the number of leaf type change diff nodes.
 
size_t num_leaf_var_changes_filtered_out() const
Getter for the number of leaf variable changes diff nodes that have been filtered out.
 
size_t num_added_vars_filtered_out() const
Getter for the number of added variables that have been filtered out.
 
size_t num_func_with_virtual_offset_changes() const
Getter for the number of functions that carry virtual member offset changes.
 
size_t num_func_changed() const
Getter for the number of functions that have a change in one of their sub-types.
 
size_t num_removed_func_filtered_out() const
Getter for the number of removed functions that have been filtered out.
 
size_t net_num_vars_added() const
Getter for the net number of added variables.
 
size_t num_leaf_changes() const
Getter of the number of leaf type change diff nodes.
 
size_t num_leaf_func_changes_filtered_out() const
Getter for the number of leaf function change diff nodes that were filtered out.
 
size_t num_added_func_syms_filtered_out() const
Getter for the number of added function symbols, not referenced by any debug info,...
 
size_t num_leaf_type_changes_filtered_out() const
Getter for the number of filtered out leaf type change diff nodes.
 
size_t num_changed_unreachable_types() const
Getter of the number of changed types that are unreachable from the public interface of the ABI corpu...
 
size_t net_num_leaf_func_changes() const
Getter for the net number of leaf function change diff nodes.
 
size_t num_leaf_func_changes() const
Getter for the number of leaf function change diff nodes.
 
size_t net_num_changed_unreachable_types() const
Getter of the number of changed types that are unreachable from public interfaces and that have *NOT*...
 
size_t num_func_syms_removed() const
Getter for the number of function symbols (not referenced by any debug info) that got removed.
 
size_t num_leaf_changes_filtered_out() const
Getter of the number of leaf type change diff nodes that have been filtered out.
 
size_t num_vars_removed() const
Getter for the number of variables removed.
 
size_t num_var_syms_removed() const
Getter for the number of variable symbols (not referenced by any debug info) that got removed.
 
size_t net_num_vars_changed() const
Getter for the number of variables that have a change in their sub-types, minus the number of these v...
 
An abstraction of a diff between between two abi corpus.
 
bool has_incompatible_changes() const
Test if the current instance of corpus_diff carries changes that we are sure are incompatible....
 
bool has_changes() const
Return true iff the current corpus_diff node carries a change.
 
void finish_diff_type()
Finish building the current instance of corpus_diff.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the corpus_diff type.
 
const string_var_ptr_map & deleted_variables() const
Getter for the variables that got deleted from the first subject of the diff.
 
const vector< diff_sptr > & changed_unreachable_types_sorted() const
Getter of a sorted vector of changed types that are not reachable from global functions/variables.
 
bool soname_changed() const
Test if the soname of the underlying corpus has changed.
 
friend corpus_diff_sptr compute_diff(const corpus_sptr f, const corpus_sptr s, diff_context_sptr ctxt)
Compute the diff between two instances of corpus.
 
const vector< type_base_sptr > & deleted_unreachable_types_sorted() const
Getter of a sorted vector of deleted types that are not reachable from global functions/variables.
 
edit_script & function_changes() const
 
edit_script & variable_changes() const
 
const vector< diff * > & children_nodes() const
 
const string_diff_sptr_map & changed_unreachable_types() const
Getter for a map of changed types that are not reachable from global functions/variables.
 
const var_diff_sptrs_type & changed_variables_sorted()
Getter for the sorted vector of variables which signature didn't change but which do have some indire...
 
const string_elf_symbol_map & deleted_unrefed_function_symbols() const
Getter for function symbols not referenced by any debug info and that got deleted.
 
const string_elf_symbol_map & deleted_unrefed_variable_symbols() const
Getter for variable symbols not referenced by any debug info and that got deleted.
 
corpus_diff(corpus_sptr first, corpus_sptr second, diff_context_sptr ctxt=diff_context_sptr())
Constructor for corpus_diff.
 
corpus_sptr second_corpus() const
 
bool do_log() const
Test if logging was requested.
 
const string_elf_symbol_map & added_unrefed_function_symbols() const
Getter for function symbols not referenced by any debug info and that got added.
 
bool has_net_subtype_changes() const
Test if the current instance of corpus_diff carries subtype changes whose reports are not suppressed ...
 
const string_var_ptr_map & added_variables() const
Getter for the added variables of the diff.
 
diff_maps & get_leaf_diffs()
Get the set of maps that contain leaf nodes. A leaf node being a node with a local change.
 
const diff_context_sptr context() const
Getter of the diff context of this diff.
 
bool has_net_changes() const
Test if the current instance of corpus_diff carries changes whose reports are not suppressed by any s...
 
virtual bool traverse(diff_node_visitor &v)
Traverse the diff sub-tree under the current instance corpus_diff.
 
const diff_stats & apply_filters_and_suppressions_before_reporting()
Apply the different filters that are registered to be applied to the diff tree; that includes the cat...
 
const string_var_diff_sptr_map & changed_variables()
Getter for the non-sorted map of variables which signature didn't change but which do have some indir...
 
const string_function_ptr_map & added_functions()
Getter for the added functions of the diff.
 
void mark_leaf_diff_nodes()
Walks the diff nodes associated to the current corpus diff and mark those that carry local changes....
 
const string_type_base_sptr_map & deleted_unreachable_types() const
Getter for a map of deleted types that are not reachable from global functions/variables.
 
corpus_sptr first_corpus() const
 
const vector< type_base_sptr > & added_unreachable_types_sorted() const
Getter of a sorted vector of added types that are not reachable from global functions/variables.
 
virtual void report(ostream &out, const string &indent="") const
Report the diff in a serialized form.
 
const string_elf_symbol_map & added_unrefed_variable_symbols() const
Getter for variable symbols not referenced by any debug info and that got added.
 
const function_decl_diff_sptrs_type & changed_functions_sorted()
Getter for a sorted vector of functions which signature didn't change, but which do have some indirec...
 
const string & get_pretty_representation() const
 
const string_function_ptr_map & deleted_functions() const
Getter for the deleted functions of the diff.
 
void append_child_node(diff_sptr)
Append a new child node to the vector of children nodes for the current instance of corpus_diff node.
 
friend void apply_suppressions(const corpus_diff *diff_tree)
Walk a corpus_diff tree and appply the suppressions carried by the context. If the suppression applie...
 
const string_type_base_sptr_map & added_unreachable_types() const
Getter for a map of added types that are not reachable from global functions/variables.
 
const string_function_decl_diff_sptr_map & changed_functions()
Getter for the functions which signature didn't change, but which do have some indirect changes in th...
 
bool architecture_changed() const
Test if the architecture of the underlying corpus has changed.
 
The base class of diff between decls.
 
decl_diff_base(decl_base_sptr first_subject, decl_base_sptr second_subject, diff_context_sptr ctxt)
Constructor of decl_diff_base.
 
The default, initial, reporter of the libabigail comparison engine.
 
The context of the diff. This type holds various bits of information that is going to be used through...
 
bool show_deleted_vars() const
 
void add_suppressions(const suppr::suppressions_type &supprs)
Add new suppression specifications that specify which diff node reports should be dropped on the floo...
 
diff_category get_allowed_category() const
Getter for the bitmap that represents the set of categories that the user wants to see reported.
 
void forget_visited_diffs()
Unmark all the diff nodes that were marked as being traversed.
 
corpus_sptr get_first_corpus() const
Getter for the first corpus of the corpus diff of the current context.
 
bool show_architecture_change() const
Getter for the property that says if the comparison module should show the architecture changes in it...
 
bool show_offsets_sizes_in_bits() const
Get the flag that indicates if diff reports using this context should show sizes and offsets in bits,...
 
void forbid_visiting_a_node_twice(bool f)
This sets a flag that, if it's true, then during the traversing of a diff nodes tree each node is vis...
 
bool show_changed_fns() const
 
void initialize_canonical_diff(const diff_sptr diff)
Set the canonical diff node property of a given diff node appropriately.
 
bool show_redundant_changes() const
A getter for the flag that says if we should report about functions or variables diff nodes that have...
 
void forbid_visiting_a_node_twice_per_interface(bool)
This function sets a flag os that if forbid_visiting_a_node_twice() returns true, then each time the ...
 
void keep_diff_alive(diff_sptr &)
Add a diff node to the set of diff nodes that are kept alive for the life time of the current instanc...
 
diff * diff_has_been_visited(const diff *) const
Test if a diff node has been traversed.
 
bool visiting_a_node_twice_is_forbidden_per_interface() const
Return a flag that, if true, then during the traversing of a diff nodes tree each node is visited at ...
 
void set_corpus_diff(const corpus_diff_sptr &)
Set the corpus diff relevant to this context.
 
bool show_leaf_changes_only() const
Get the flag that indicates if the diff using this context should show only leaf changes or not.
 
bool perform_change_categorization() const
Test if it's requested to perform diff node categorization.
 
bool show_impacted_interfaces() const
Getter of the flag that indicates if the leaf reporter should display a summary of the interfaces imp...
 
bool show_soname_change() const
Getter for the property that says if the comparison module should show the soname changes in its repo...
 
reporter_base_sptr get_reporter() const
Getter of the reporter to be used in this context.
 
void add_diff_filter(filtering::filter_base_sptr)
Setter for the diff filters to apply to a given diff sub-tree.
 
bool do_log() const
Test if logging was requested.
 
const suppr::suppressions_type & direct_suppressions() const
Getter of the direct suppression specification (those that are not negated) comprised in the general ...
 
void maybe_apply_filters(diff_sptr diff)
Apply the diff filters to a given diff sub-tree.
 
bool show_added_fns() const
 
const suppr::suppressions_type & suppressions() const
Getter for the vector of suppressions that specify which diff node reports should be dropped on the f...
 
bool show_relative_offset_changes(void)
Get the flag saying if offset changes should be reported in a relative way. That is,...
 
bool visiting_a_node_twice_is_forbidden() const
Return a flag that, if true, then during the traversing of a diff nodes tree each node is visited at ...
 
void do_dump_diff_tree(const diff_sptr) const
Emit a textual representation of a diff tree to the error output stream of the current context,...
 
const suppr::suppressions_type & negated_suppressions() const
Getter of the negated suppression specifications that are comprised in the general vector of suppress...
 
void add_suppression(const suppr::suppression_sptr suppr)
Add a new suppression specification that specifies which diff node reports should be dropped on the f...
 
bool show_hex_values() const
Get the flag that indicates if the diff reports using this context should show sizes and offsets in a...
 
bool show_deleted_fns() const
 
void switch_categories_off(diff_category c)
Setter for the bitmap that represents the set of categories that the user wants to see reported.
 
bool show_stats_only() const
Test if the comparison module should only show the diff stats.
 
bool show_added_vars() const
 
const filtering::filters & diff_filters() const
Getter for the diff tree nodes filters to apply to diff sub-trees.
 
bool show_unreachable_types()
Getter for the flag that indicates if changes on types unreachable from global functions and variable...
 
const corpus_diff_sptr & get_corpus_diff() const
Get the corpus diff for the current context.
 
void mark_diff_as_visited(const diff *)
Mark a diff node as traversed by a traversing algorithm.
 
diff_sptr get_canonical_diff_for(const type_or_decl_base_sptr first, const type_or_decl_base_sptr second) const
Getter for the canonical diff node for the diff represented by their two subjects.
 
bool show_changed_vars() const
 
void switch_categories_on(diff_category c)
Setter for the bitmap that represents the set of categories that the user wants to see reported.
 
ostream * default_output_stream()
Getter for the default output stream used by code of the comparison engine. By default the default ou...
 
bool dump_diff_tree() const
Test if the comparison engine should dump the diff tree for the changed functions and variables it ha...
 
bool show_symbols_unreferenced_by_debug_info() const
Getter for the flag that indicates if symbols not referenced by any debug info are to be compared and...
 
bool show_added_symbols_unreferenced_by_debug_info() const
Getter for the flag that indicates if symbols not referenced by any debug info and that got added are...
 
corpus_sptr get_second_corpus() const
Getter for the second corpus of the corpus diff of the current context.
 
void set_allowed_category(diff_category c)
Setter for the bitmap that represents the set of categories that the user wants to see reported.
 
void set_reporter(reporter_base_sptr &)
Setter of the reporter to be used in this context.
 
ostream * error_output_stream() const
Getter for the errror output stream used by code of the comparison engine. By default the error outpu...
 
This type contains maps. Each map associates a type name to a diff of that type. Not all kinds of dif...
 
const string_diff_ptr_map & get_function_decl_diff_map() const
Getter of the map that contains function decl diffs.
 
const string_diff_ptr_map & get_var_decl_diff_map() const
Getter of the map that contains var decl diffs.
 
const string_diff_ptr_map & get_enum_diff_map() const
Getter of the map that contains enum type diffs.
 
bool insert_diff_node(const diff *d, const type_or_decl_base_sptr &impacted_iface)
Insert a new diff node into the current instance of diff_maps.
 
diff_maps()
Default constructor of the diff_maps type.
 
const string_diff_ptr_map & get_union_diff_map() const
Getter of the map that contains union type diffs.
 
artifact_sptr_set_type * lookup_impacted_interfaces(const diff *d) const
Lookup the interfaces that are impacted by a given leaf diff node.
 
const string_diff_ptr_map & get_function_type_diff_map() const
Getter of the map that contains function type diffs.
 
const string_diff_ptr_map & get_typedef_diff_map() const
Getter of the map that contains typedef type diffs.
 
const string_diff_ptr_map & get_distinct_diff_map() const
Getter of the map that contains distinct diffs.
 
const string_diff_ptr_map & get_subrange_diff_map() const
Getter of the map that contains subrange type diffs.
 
const string_diff_ptr_map & get_reference_diff_map() const
Getter of the map that contains reference type diffs.
 
const string_diff_ptr_map & get_array_diff_map() const
Getter of the map that contains array type diffs.
 
const string_diff_ptr_map & get_type_decl_diff_map() const
Getter of the map that contains basic type diffs.
 
const string_diff_ptr_map & get_fn_parm_diff_map() const
Getter of the map that contains function parameter diffs.
 
const string_diff_ptr_map & get_class_diff_map() const
Getter of the map that contains class type diffs.
 
The base class for the node visitors. These are the types used to visit each node traversed by the di...
 
void or_visiting_kind(visiting_kind v)
Setter for the visiting policy of the traversing code while invoking this visitor....
 
virtual bool visit(diff *, bool)
Default visitor implementation.
 
virtual bool visit(distinct_diff *, bool)
Default visitor implementation.
 
virtual void visit_end(corpus_diff *)
This is called by the traversing code on a corpus_diff node just after visiting it....
 
void set_current_topmost_iface_diff(diff *)
Setter of the diff current topmost interface which is impacted by the current diff node being visited...
 
virtual void visit_begin(diff *)
This is called by the traversing code on a diff node just before visiting it. That is,...
 
visiting_kind get_visiting_kind() const
Getter for the visiting policy of the traversing code while invoking this visitor.
 
virtual void visit_end(diff *)
This is called by the traversing code on a diff node just after visiting it. That is after visiting i...
 
diff_node_visitor()
Default constructor of the diff_node_visitor type.
 
void set_visiting_kind(visiting_kind v)
Setter for the visiting policy of the traversing code while invoking this visitor.
 
diff * get_current_topmost_iface_diff() const
Getter of the diff current topmost interface which is impacted by the current diff node being visited...
 
virtual bool traverse(diff_node_visitor &v)
The default traverse function.
 
The abstraction of a change between two ABI artifacts, a.k.a an artifact change.
 
void begin_traversing()
Flag a given diff node as being traversed.
 
void set_category(diff_category c)
Set the category of the current diff node. This category includes the categories inherited from the c...
 
virtual void finish_diff_type()
Finish the insertion of a diff tree node into the diff graph.
 
virtual void chain_into_hierarchy()
This constructs the relation between this diff node and its detail diff nodes, in the generic view of...
 
diff_category remove_from_category(diff_category c)
Remove the current diff tree node from an a existing sef of categories. The categories include those ...
 
type_or_decl_base_sptr second_subject() const
Getter of the second subject of the diff.
 
bool is_traversing() const
Tell if a given node is being traversed or not.
 
type_or_decl_base_sptr first_subject() const
Getter of the first subject of the diff.
 
bool is_suppressed() const
Test if the current diff node has been suppressed by a user-provided suppression specification.
 
bool is_filtered_out_without_looking_at_allowed_changes() const
Test if this diff tree node is to be filtered out for reporting purposes, but without considering the...
 
diff * get_canonical_diff() const
Getter for the canonical diff of the current instance of diff.
 
bool has_parent_allowed_by_specific_negated_suppression() const
Test if the current diff node has a parent node which is specifically allowed by a negated suppressio...
 
bool has_local_changes_to_be_reported() const
Test if this diff tree node should be reported when considering the categories that were *NOT* inheri...
 
const vector< diff * > & children_nodes() const
Getter for the children nodes of the current diff node.
 
diff_category get_category() const
Getter for the category of the current diff tree node.
 
bool is_allowed_by_specific_negated_suppression() const
Test if this diff node is allowed (prevented from being suppressed) by at least one negated suppressi...
 
diff_category remove_from_local_category(diff_category c)
Remove the current diff tree node from the categories resulting from the local changes.
 
void add_to_local_and_inherited_categories(diff_category c)
Adds the current diff tree node to the categories resulting from the local and inherited changes of t...
 
bool do_log() const
Test if logging was requested.
 
diff_category get_local_category() const
Getter for the local category of the current diff tree node.
 
diff_category add_to_category(diff_category c)
Adds the current diff tree node to an additional set of categories. Note that the categories include ...
 
const diff_context_sptr context() const
Getter of the context of the current diff.
 
virtual enum change_kind has_local_changes() const =0
Pure interface to know if the current instance of @diff carries a local change. A local change is a c...
 
virtual bool traverse(diff_node_visitor &v)
The generic traversing code that walks a given diff sub-tree.
 
bool currently_reporting() const
Tests if we are currently in the middle of emitting a report for this diff.
 
virtual bool has_changes() const =0
Pure interface to get the length of the changes encapsulated by this diff. A length of zero means tha...
 
bool has_descendant_allowed_by_specific_negated_suppression() const
Test if the current diff node has a descendant node which is specifically allowed by a negated suppre...
 
bool to_be_reported() const
Test if this diff tree node should be reported.
 
const diff * parent_node() const
Getter for the parent node of the current diff node.
 
diff_category get_class_of_equiv_category() const
Getter of the category of the class of equivalence of the current diff tree node.
 
void set_canonical_diff(diff *)
Setter for the canonical diff of the current instance of diff.
 
bool is_filtered_out_wrt_non_inherited_categories() const
Test if this diff tree node is to be filtered out for reporting purposes, but by considering only the...
 
diff_category add_to_local_category(diff_category c)
Adds the current diff tree node to the categories resulting from the local changes of the current dif...
 
void set_local_category(diff_category c)
Set the local category of the current diff node.
 
virtual const string & get_pretty_representation() const
Get a pretty representation of the current diff node.
 
void append_child_node(diff_sptr)
Add a new child node to the vector of children nodes for the current diff node.
 
bool is_filtered_out() const
Test if this diff tree node is to be filtered out for reporting purposes.
 
void end_traversing()
Flag a given diff node as not being traversed anymore.
 
bool reported_once() const
Tests if a report has already been emitted for the current diff.
 
An abstraction of a diff between entities that are of a different kind (disctinct).
 
virtual bool has_changes() const
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of @distinct_d...
 
const diff_sptr compatible_child_diff() const
Getter for the child diff of this distinct_diff instance.
 
distinct_diff(type_or_decl_base_sptr first, type_or_decl_base_sptr second, diff_context_sptr ctxt=diff_context_sptr())
Constructor for distinct_diff.
 
static bool entities_are_of_distinct_kinds(type_or_decl_base_sptr first, type_or_decl_base_sptr second)
Test if the two arguments are of different kind, or that are both NULL.
 
virtual void report(ostream &out, const string &indent="") const
Emit a report about the current diff instance.
 
const type_or_decl_base_sptr first() const
Getter for the first subject of the diff.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
const type_or_decl_base_sptr second() const
Getter for the second subject of the diff.
 
Abstraction of a diff between two enums.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of enum_diff.
 
enum_diff(const enum_type_decl_sptr, const enum_type_decl_sptr, const diff_sptr, diff_context_sptr ctxt=diff_context_sptr())
Constructor for enum_diff.
 
diff_sptr underlying_type_diff() const
 
const string_changed_enumerator_map & changed_enumerators() const
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
const enum_type_decl_sptr first_enum() const
 
const string_enumerator_map & deleted_enumerators() const
 
const enum_type_decl_sptr second_enum() const
 
const string_enumerator_map & inserted_enumerators() const
 
virtual void report(ostream &, const string &indent="") const
Report the differences between the two enums.
 
A filter that walks the diff nodes tree and tags relevant diff nodes into categories considered to re...
 
Abstraction of a diff between two function parameters.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children nodes of the diff base type sub-object of this instance of fn_parm_di...
 
const function_decl::parameter_sptr first_parameter() const
Getter for the first subject of this diff node.
 
virtual enum change_kind has_local_changes() const
Check if the current diff node carries a local change.
 
virtual const string & get_pretty_representation() const
Build and return a textual representation of the current instance of fn_parm_diff.
 
const function_decl::parameter_sptr second_parameter() const
Getter for the second subject of this diff node.
 
diff_sptr type_diff() const
Getter for the diff representing the changes on the type of the function parameter involved in the cu...
 
virtual void report(ostream &, const string &indent="") const
Emit a textual report about the current fn_parm_diff instance.
 
Abstraction of a diff between two function_decl.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of function_de...
 
const function_decl_sptr second_function_decl() const
 
function_decl_diff(const function_decl_sptr first, const function_decl_sptr second, diff_context_sptr ctxt)
Constructor for function_decl_diff.
 
virtual enum change_kind has_local_changes() const
 
const function_decl_sptr first_function_decl() const
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Serialize a report of the changes encapsulated in the current instance of function_decl_diff over to ...
 
Abstraction of a diff between two function types.
 
virtual bool has_changes() const
Test if the current diff node carries changes.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of function_ty...
 
const string_fn_parm_diff_sptr_map & subtype_changed_parms() const
Getter for the map of function parameter changes of the current diff.
 
const diff_sptr return_type_diff() const
Getter for the diff of the return types of the two function types of the current diff.
 
const string_parm_map & removed_parms() const
Getter for the map of parameters that got removed.
 
const string_parm_map & added_parms() const
Getter for the map of parameters that got added.
 
friend function_type_diff_sptr compute_diff(const function_type_sptr first, const function_type_sptr second, diff_context_sptr ctxt)
Compute the diff between two instances of function_type.
 
const vector< function_decl::parameter_sptr > & sorted_added_parms() const
Getter for the sorted vector of added parameters .
 
const function_type_sptr first_function_type() const
Getter for the first subject of the diff.
 
const function_type_sptr second_function_type() const
Getter for the second subject of the diff.
 
function_type_diff(const function_type_sptr first, const function_type_sptr second, diff_context_sptr ctxt)
Consutrctor of the function_type type.
 
virtual enum change_kind has_local_changes() const
Test if the current diff node carries local changes.
 
virtual const string & get_pretty_representation() const
Build and return a copy of a pretty representation of the current instance of function_type_diff.
 
const vector< function_decl::parameter_sptr > & sorted_deleted_parms() const
Getter for the sorted vector of deleted parameters.
 
virtual void report(ostream &, const string &indent="") const
Build and emit a textual report about the current function_type_diff instance.
 
A reporter that only reports leaf changes.
 
The abstraction of a diff between two pointers.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
const pointer_type_def_sptr first_pointer() const
Getter for the first subject of a pointer diff.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of pointer_dif...
 
const pointer_type_def_sptr second_pointer() const
Getter for the second subject of a pointer diff.
 
diff_sptr underlying_type_diff() const
Getter for the diff between the pointed-to types of the pointers of this diff.
 
pointer_diff(pointer_type_def_sptr first, pointer_type_def_sptr second, diff_sptr underlying_type_diff, diff_context_sptr ctxt=diff_context_sptr())
Constructor for a pointer_diff.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Report the diff in a serialized form.
 
The abstraction of a diff between two ptr_to_mbr_type.
 
virtual bool has_changes() const
Test whether the current diff node carries any change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of ptr_to_mbr_...
 
virtual ~ptr_to_mbr_diff()
Destructor of ptr_to_mbr_diff.
 
ptr_to_mbr_type_sptr first_ptr_to_mbr_type() const
Getter of the first pointer-to-member subject of the current diff node.
 
const diff_sptr containing_type_diff() const
Getter of the diff node carrying changes to the containing type of first subject of the current diff ...
 
const diff_sptr member_type_diff() const
Getter of the diff node carrying changes to the member type of first subject of the current diff node...
 
ptr_to_mbr_type_sptr second_ptr_to_mbr_type() const
Getter of the second pointer-to-member subject of the current diff node.
 
virtual enum change_kind has_local_changes() const
Test whether the current diff node carries any local change.
 
virtual const string & get_pretty_representation() const
Get the pretty representation of the current ptr_to_mbr_diff node.
 
virtual void report(ostream &, const string &indent="") const
Pure interface to report the diff in a serialized form that is legible for the user.
 
Abstraction of a diff between two qualified types.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of qualified_t...
 
diff_sptr leaf_underlying_type_diff() const
Getter for the diff between the most underlying non-qualified types of two qualified types.
 
diff_sptr underlying_type_diff() const
Getter for the diff between the underlying types of the two qualified types.
 
qualified_type_diff(qualified_type_def_sptr first, qualified_type_def_sptr second, diff_sptr underling, diff_context_sptr ctxt=diff_context_sptr())
Constructor for qualified_type_diff.
 
const qualified_type_def_sptr second_qualified_type() const
Getter for the second qualified type of the diff.
 
virtual enum change_kind has_local_changes() const
 
const qualified_type_def_sptr first_qualified_type() const
Getter for the first qualified type of the diff.
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Report the diff in a serialized form.
 
The abstraction of a diff between two references.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of reference_d...
 
reference_type_def_sptr first_reference() const
Getter for the first reference of the diff.
 
reference_type_def_sptr second_reference() const
Getter for the second reference of the diff.
 
reference_diff(const reference_type_def_sptr first, const reference_type_def_sptr second, diff_sptr underlying, diff_context_sptr ctxt=diff_context_sptr())
Constructor for reference_diff.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
const diff_sptr & underlying_type_diff() const
Getter for the diff between the two referred-to types.
 
virtual void report(ostream &, const string &indent="") const
Report the diff in a serialized form.
 
An abstractions of the changes between two scopes.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of scope_diff.
 
const diff_sptrs_type & changed_types() const
 
const scope_decl_sptr second_scope() const
Getter for the second scope of the diff.
 
const scope_decl_sptr first_scope() const
Getter for the first scope of the diff.
 
const decl_base_sptr deleted_member_at(unsigned index) const
Accessor that eases the manipulation of the edit script associated to this instance....
 
const diff_sptrs_type & changed_decls() const
 
scope_diff(scope_decl_sptr first_scope, scope_decl_sptr second_scope, diff_context_sptr ctxt=diff_context_sptr())
Constructor for scope_diff.
 
friend scope_diff_sptr compute_diff(const scope_decl_sptr first, const scope_decl_sptr second, scope_diff_sptr d, diff_context_sptr ctxt)
Compute the diff between two scopes.
 
const decl_base_sptr inserted_member_at(unsigned i)
Accessor that eases the manipulation of the edit script associated to this instance....
 
virtual void report(ostream &out, const string &indent="") const
Report the changes of one scope against another.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
const edit_script & member_changes() const
Accessor of the edit script of the members of a scope.
 
The abstraction of the diff between two subrange types.
 
virtual bool has_changes() const
Test if the current subrange_diff node carries any change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of subrange_di...
 
const array_type_def::subrange_sptr second_subrange() const
Getter of the second subrange of the current instance subrange_diff.
 
subrange_diff(const array_type_def::subrange_sptr &first, const array_type_def::subrange_sptr &second, const diff_sptr &underlying_type_diff, const diff_context_sptr ctxt=diff_context_sptr())
Constructor of the subrange_diff diff node type.
 
const array_type_def::subrange_sptr first_subrange() const
Getter of the first subrange of the current instance subrange_diff.
 
const diff_sptr underlying_type_diff() const
Getter of the diff node of the underlying types of the current subrange_diff diff node.
 
virtual enum change_kind has_local_changes() const
Test if the current subrange_diff node carries any local change.
 
virtual const string & get_pretty_representation() const
Getter the pretty representation of the subrange_diff diff node.
 
virtual void report(ostream &, const string &indent="") const
Report about the changes carried by this node.
 
An abstraction of a diff between two translation units.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
const translation_unit_sptr second_translation_unit() const
Getter for the second translation unit of this diff.
 
translation_unit_diff(translation_unit_sptr first, translation_unit_sptr second, diff_context_sptr ctxt=diff_context_sptr())
Constructor for translation_unit_diff.
 
virtual void report(ostream &out, const string &indent="") const
Report the diff in a serialized form.
 
virtual enum change_kind has_local_changes() const
 
const translation_unit_sptr first_translation_unit() const
Getter for the first translation unit of this diff.
 
Abstraction of a diff between two basic type declarations.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
const type_decl_sptr first_type_decl() const
Getter for the first subject of the type_decl_diff.
 
const type_decl_sptr second_type_decl() const
Getter for the second subject of the type_decl_diff.
 
virtual void report(ostream &out, const string &indent="") const
Ouputs a report of the differences between of the two type_decl involved in the type_decl_diff.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
The base class of diff between types.
 
Abstraction of a diff between two typedef_decl.
 
virtual bool has_changes() const
Return true iff the current diff node carries a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of typedef_dif...
 
const typedef_decl_sptr second_typedef_decl() const
Getter for the second typedef_decl involved in the diff.
 
const typedef_decl_sptr first_typedef_decl() const
Getter for the firt typedef_decl involved in the diff.
 
const diff_sptr underlying_type_diff() const
Getter for the diff between the two underlying types of the typedefs.
 
virtual enum change_kind has_local_changes() const
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Reports the difference between the two subjects of the diff in a serialized form.
 
union_diff(union_decl_sptr first_union, union_decl_sptr second_union, diff_context_sptr ctxt=diff_context_sptr())
Constructor for the union_diff type.
 
union_decl_sptr first_union_decl() const
 
union_decl_sptr second_union_decl() const
 
virtual ~union_diff()
Destructor of the union_diff node.
 
virtual const string & get_pretty_representation() const
 
virtual void report(ostream &, const string &indent="") const
Report the changes carried by the current union_diff node in a textual format.
 
Abstracts a diff between two instances of var_decl.
 
virtual bool has_changes() const
Return true iff the diff node has a change.
 
virtual void chain_into_hierarchy()
Populate the vector of children node of the diff base type sub-object of this instance of var_diff.
 
var_diff(var_decl_sptr first, var_decl_sptr second, diff_sptr type_diff, diff_context_sptr ctxt=diff_context_sptr())
Constructor for var_diff.
 
var_decl_sptr first_var() const
Getter for the first var_decl of the diff.
 
virtual void report(ostream &out, const string &indent="") const
Report the diff in a serialized form.
 
virtual enum change_kind has_local_changes() const
 
friend var_diff_sptr compute_diff(const var_decl_sptr first, const var_decl_sptr second, diff_context_sptr ctxt)
Compute the diff between two instances of var_decl.
 
virtual const string & get_pretty_representation() const
 
diff_sptr type_diff() const
Getter for the diff of the types of the instances of var_decl.
 
var_decl_sptr second_var() const
Getter for the second var_decl of the diff.
 
The abstraction of an edit script for transforming a sequence A into a sequence B.
 
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
 
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
 
vector< base_spec_sptr > base_specs
Convenience typedef.
 
vector< method_decl_sptr > member_functions
Convenience typedef.
 
bool get_is_anonymous() const
Test if the current declaration is anonymous.
 
The abstraction of the version of an ELF symbol.
 
Abstraction of an elf symbol.
 
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
 
std::vector< enumerator > enumerators
Convenience typedef for a list of enumerator.
 
Abstraction for a function declaration.
 
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
 
const function_type_sptr get_type() const
Return the type of the current instance of function_decl.
 
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
 
An abstraction helper for type declarations.
 
The base class of both types and declarations.
 
Abstracts a variable declaration.
 
interned_string get_id() const
Return an ID that tries to uniquely identify the variable inside a program or a library.
 
change_kind
The kind of change the current function suppression should apply to.
 
@ ADDED_FUNCTION_CHANGE_KIND
The function was added to the second subject of the diff.
 
@ DELETED_FUNCTION_CHANGE_KIND
The function was deleted from the second subject of the diff.
 
change_kind
The kind of change the current variable suppression should apply to.
 
@ ADDED_VARIABLE_CHANGE_KIND
The variable was added to the second second subject of the diff.
 
@ DELETED_VARIABLE_CHANGE_KIND
The variable was deleted from the second subject of the diff.
 
std::vector< filter_base_sptr > filters
Convenience typedef for a vector of filter_base_sptr.
 
bool is_decl_only_class_with_size_change(const class_or_union &first, const class_or_union &second)
Test if two classes that are decl-only (have the decl-only flag and carry no data members) but are di...
 
shared_ptr< filter_base > filter_base_sptr
Convenience typedef for a shared pointer to filter_base.
 
bool has_harmful_name_change(const decl_base_sptr &f, const decl_base_sptr &s)
Test if two decls represents a harmful name change.
 
bool has_decl_only_def_change(const decl_base_sptr &first, const decl_base_sptr &second)
Test if two decl_base_sptr are different just by the fact that one is decl-only and the other one is ...
 
bool has_basic_or_class_type_name_change(const diff *d)
Test if a diff node carries a basic or class type name change.
 
void apply_filter(filter_base &filter, corpus_diff_sptr d)
Walk the diff sub-trees of a a corpus_diff and apply a filter to the nodes visted....
 
bool is_mostly_distinct_diff(const diff *d)
Test if a diff node carries a distinct type change or a pointer/reference/typedef to distinct type ch...
 
shared_ptr< diff > diff_sptr
Convenience typedef for a shared_ptr for the diff class.
 
visiting_kind operator~(visiting_kind l)
The overloaded 'bit inversion' operator for visiting_kind.
 
const decl_diff_base * is_decl_diff(const diff *diff)
Test if a diff node is about differences between declarations.
 
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 ...
 
const diff * peel_pointer_or_qualified_type_diff(const diff *dif)
If a diff node is about changes between two pointer, reference or qualified types,...
 
void categorize_redundancy(diff *diff_tree)
Walk a given diff sub-tree to categorize each of the nodes with respect to the REDUNDANT_CATEGORY.
 
vector< diff * > diff_ptrs_type
Convenience typedef for a vector of diff*.
 
void sort_string_diff_ptr_map(const string_diff_ptr_map &map, diff_ptrs_type &sorted)
Sort a map ofg string -> diff* into a vector of diff_ptr. The diff_ptr are sorted lexicographically w...
 
diff_category
An enum for the different categories that a diff tree node falls into, regarding the kind of changes ...
 
@ ACCESS_CHANGE_CATEGORY
This means the diff node (or at least one of its descendant nodes) carries access related changes,...
 
@ HARMLESS_DATA_MEMBER_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a harmless data member change....
 
@ SUPPRESSED_CATEGORY
This means that a diff node was marked as suppressed by a user-provided suppression specification.
 
@ VIRTUAL_MEMBER_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries an incompatible change to a vtable.
 
@ REDUNDANT_CATEGORY
A diff node in this category is redundant. That means it's present as a child of a other nodes in the...
 
@ SIZE_OR_OFFSET_CHANGE_CATEGORY
This means the diff node (or at least one of its descendant nodes) carries a change that modifies the...
 
@ NON_VIRT_MEM_FUN_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries an addition or removal of a non-virtual member fu...
 
@ HAS_DESCENDANT_WITH_ALLOWED_CHANGE_CATEGORY
A diff node in this category has a descendant node that is in the HAS_ALLOWED_CHANGE_CATEGORY categor...
 
@ HARMLESS_ENUM_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries an addition of enumerator to an enum type.
 
@ FN_PARM_ADD_REMOVE_CHANGE_CATEGORY
A diff node in this category is a function (or function type) with at least one parameter added or re...
 
@ VOID_PTR_TO_PTR_CHANGE_CATEGORY
A diff node in this category carries a change from void pointer to non-void pointer.
 
@ PRIVATE_TYPE_CATEGORY
This means that a diff node was warked as being for a private type. That is, the diff node is meant t...
 
@ COMPATIBLE_TYPE_CHANGE_CATEGORY
This means the diff node (or at least one of its descendant nodes) carries a change involving two com...
 
@ TYPE_DECL_ONLY_DEF_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a type that was declaration-only and that is now ...
 
@ STATIC_DATA_MEMBER_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries an addition or removal of a static data member.
 
@ HARMLESS_DECL_NAME_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a harmless declaration name change....
 
@ NO_CHANGE_CATEGORY
This means the diff node does not carry any (meaningful) change, or that it carries changes that have...
 
@ HARMLESS_UNION_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a harmless union change.
 
@ HAS_PARENT_WITH_ALLOWED_CHANGE_CATEGORY
A diff node in this category has a parent node that is in the HAS_ALLOWED_CHANGE_CATEGORY category....
 
@ BENIGN_INFINITE_ARRAY_CHANGE_CATEGORY
A diff node in this category carries a change in the size of the array type of a global variable,...
 
@ VAR_TYPE_CV_CHANGE_CATEGORY
A diff node in this category is for a variable which type holds a cv-qualifier change.
 
@ HAS_ALLOWED_CHANGE_CATEGORY
A diff node in this category carries a change that must be reported, even if the diff node is also in...
 
@ FN_PARM_TYPE_CV_CHANGE_CATEGORY
A diff node in this category has a function parameter type with a cv-qualifiers change.
 
@ FN_PARM_TYPE_TOP_CV_CHANGE_CATEGORY
A diff node in this category is a function parameter type which top cv-qualifiers change.
 
@ FN_RETURN_TYPE_CV_CHANGE_CATEGORY
A diff node in this category is a function return type with a cv-qualifier change.
 
@ HARMLESS_SYMBOL_ALIAS_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries an a symbol alias change that is harmless.
 
shared_ptr< reporter_base > reporter_base_sptr
A convenience typedef for a shared pointer to a reporter_base.
 
void sort_string_var_diff_sptr_map(const string_var_diff_sptr_map &map, var_diff_sptrs_type &sorted)
Sort of an instance of string_var_diff_sptr_map map.
 
unordered_map< string, var_diff_sptr > string_var_diff_sptr_map
Convenience typedef for a map whose key is a string and whose value is a changed variable of type var...
 
const class_or_union_diff * is_diff_of_class_or_union_type(const diff *d)
Test if a diff node represents a diff between two class or union types.
 
const pointer_diff * is_pointer_diff(const diff *diff)
Test if a diff node is about differences between two pointers.
 
vector< var_diff_sptr > var_diff_sptrs_type
Convenience typedef for a vector of var_diff_sptr.
 
unordered_map< string, class_decl::base_spec_sptr > string_base_sptr_map
Convenience typedef for a map of string and class_decl::basse_spec_sptr.
 
void sort_string_function_ptr_map(const string_function_ptr_map &map, vector< const function_decl * > &sorted)
Sort an instance of string_function_ptr_map map and stuff a resulting sorted vector of pointers to fu...
 
diff_sptr try_to_diff(const type_or_decl_base_sptr first, const type_or_decl_base_sptr second, diff_context_sptr ctxt)
</distinct_diff>
 
bool has_basic_type_change_only(const diff *d)
Test if a diff node is a decl diff that only carries a basic type change on its type diff sub-node.
 
void propagate_categories(diff *diff_tree)
Visit all the nodes of a given sub-tree. For each node that has a particular category set,...
 
const subrange_diff * is_subrange_diff(const diff *diff)
Test if a diff node is a subrange_diff node.
 
unordered_map< unsigned, fn_parm_diff_sptr > unsigned_fn_parm_diff_sptr_map
Convenience typedef for a map which key is an integer and which value is a changed parameter.
 
void sort_string_base_sptr_map(const string_base_sptr_map &m, class_decl::base_specs &sorted)
Lexicographically sort base specifications found in instances of string_base_sptr_map.
 
diff_category get_default_harmless_categories_bitmap()
Getter of a bitmap made of the set of change categories that are considered harmless.
 
vector< diff_sptr > diff_sptrs_type
Convenience typedef for a vector of diff_sptr.
 
distinct_diff_sptr compute_diff_for_distinct_kinds(const type_or_decl_base_sptr first, const type_or_decl_base_sptr second, diff_context_sptr ctxt)
Try to diff entities that are of distinct kinds.
 
void sort_changed_data_members(changed_var_sptrs_type &input)
Sort (in place) a vector of changed data members.
 
unordered_map< string, type_base_sptr > string_type_base_sptr_map
Convenience typedef for a map which key is a string and which value is a type_base_sptr.
 
diff_sptr try_to_diff< class_decl >(const type_or_decl_base_sptr first, const type_or_decl_base_sptr second, diff_context_sptr ctxt)
This is a specialization of try_to_diff() template to diff instances of class_decl.
 
shared_ptr< type_decl_diff > type_decl_diff_sptr
Convenience typedef for a shared pointer on a type_decl_diff type.
 
bool is_diff_of_variadic_parameter(const diff *d)
Test if a diff node represents the difference between a variadic parameter and something else.
 
shared_ptr< diff_context > diff_context_sptr
Convenience typedef for a shared pointer of diff_context.
 
bool is_diff_of_global_decls(const diff *)
Tests if a given diff node is to represent the changes between two gobal decls.
 
shared_ptr< subrange_diff > subrange_diff_sptr
A convenience typedef for a shared pointer to subrange_diff type.
 
bool is_diff_of_variadic_parameter_type(const diff *d)
Test if a diff node represents the difference between a variadic parameter type and something else.
 
diff_category get_default_harmful_categories_bitmap()
Getter of a bitmap made of the set of change categories that are considered harmful.
 
unordered_map< string, function_decl::parameter_sptr > string_parm_map
Convenience typedef for a map which value is a function parameter. The key is the name of the functio...
 
unordered_map< string, enum_type_decl::enumerator > string_enumerator_map
Convenience typedef for a map which value is an enumerator. The key is the name of the enumerator.
 
shared_ptr< var_diff > var_diff_sptr
Convenience typedef for a shared pointer to a var_diff type.
 
unordered_map< string, method_decl_sptr > string_member_function_sptr_map
Convenience typedef for a hash map of strings and member functions.
 
const diff * peel_typedef_diff(const diff *dif)
If a diff node is about changes between two typedef types, get the diff node about changes between th...
 
shared_ptr< reference_diff > reference_diff_sptr
Convenience typedef for a shared pointer on a reference_diff type.
 
vector< base_diff_sptr > base_diff_sptrs_type
Convenience typedef for a vector of base_diff_sptr.
 
shared_ptr< function_decl_diff > function_decl_diff_sptr
Convenience typedef for a shared pointer to a function_decl type.
 
shared_ptr< ptr_to_mbr_diff > ptr_to_mbr_diff_sptr
Typedef of a shared_ptr to ptr_to_mbr_diff.
 
void sort_string_elf_symbol_map(const string_elf_symbol_map &map, vector< elf_symbol_sptr > &sorted)
Sort a map of string -> pointer to elf_symbol.
 
const function_decl_diff * is_function_decl_diff(const diff *diff)
Test if a diff node is about differences between functions.
 
void sort_string_function_decl_diff_sptr_map(const string_function_decl_diff_sptr_map &map, function_decl_diff_sptrs_type &sorted)
Sort the values of a string_function_decl_diff_sptr_map map and store the result in a vector of funct...
 
shared_ptr< fn_parm_diff > fn_parm_diff_sptr
Convenience typedef for a shared pointer to a fn_parm_diff type.
 
unordered_map< string, function_decl_diff_sptr > string_function_decl_diff_sptr_map
Convenience typedef for a map which key is a string and which value is a function_decl_diff_sptr.
 
void clear_redundancy_categorization(diff *diff_tree)
Walk a given diff sub-tree to clear the REDUNDANT_CATEGORY out of the category of the nodes.
 
unordered_map< string, const var_decl * > string_var_ptr_map
Convenience typedef for a map which key is a string and which value is a point to var_decl.
 
void sort_unsigned_data_member_diff_sptr_map(const unsigned_var_diff_sptr_map map, var_diff_sptrs_type &sorted)
Sort the values of a unsigned_var_diff_sptr_map map and store the result into a vector of var_diff_sp...
 
void sort_string_fn_parm_diff_sptr_map(const unsigned_fn_parm_diff_sptr_map &map, vector< fn_parm_diff_sptr > &sorted)
Sort a map of fn_parm_diff by the indexes of the function parameters.
 
bool is_child_node_of_base_diff(const diff *diff)
Test if a diff node is a child node of a base diff node.
 
visiting_kind
An enum for the different ways to visit a diff tree node.
 
@ SKIP_CHILDREN_VISITING_KIND
This says that the traversing code should avoid visiting the children nodes of the current node being...
 
@ DO_NOT_MARK_VISITED_NODES_AS_VISITED
This says that the traversing code should not mark visited nodes as having been traversed....
 
visiting_kind operator&(visiting_kind l, visiting_kind r)
The overloaded and operator for visiting_kind.
 
const diff * peel_fn_parm_diff(const diff *dif)
If a diff node is about changes between two function parameters get the diff node about changes betwe...
 
const function_type_diff * is_function_type_diff(const diff *diff)
Test if a diff node is a function_type_diff node.
 
const distinct_diff * is_distinct_diff(const diff *diff)
Test if a diff node is about differences between two diff nodes of different kinds.
 
unordered_map< string, changed_enumerator > string_changed_enumerator_map
Convenience typedef for a map which value is a changed enumerator. The key is the name of the changed...
 
visiting_kind operator|(visiting_kind l, visiting_kind r)
The overloaded or operator for visiting_kind.
 
const array_diff * is_array_diff(const diff *diff)
Test if a diff node is a array_diff node.
 
const diff * peel_reference_diff(const diff *dif)
If a diff node is about changes between two reference types, get the diff node about changes between ...
 
unordered_map< string, fn_parm_diff_sptr > string_fn_parm_diff_sptr_map
Convenience typedef for a map which value is a changed function parameter and which key is the name o...
 
string get_pretty_representation(diff *d)
Get a copy of the pretty representation of a diff node.
 
void sort_artifacts_set(const artifact_sptr_set_type &set, vector< type_or_decl_base_sptr > &sorted)
Sort the set of ABI artifacts contained in a artifact_sptr_set_type.
 
unordered_map< string, decl_base_sptr > string_decl_base_sptr_map
Convenience typedef for a map which key is a string and which value is a decl_base_sptr.
 
const class_or_union_diff * is_anonymous_class_or_union_diff(const diff *d)
Test if a diff node is a class_or_union_diff between two anonymous classes or unions.
 
shared_ptr< base_diff > base_diff_sptr
Convenience typedef for a shared pointer to a base_diff type.
 
shared_ptr< scope_diff > scope_diff_sptr
Convenience typedef for a shared pointer on a scope_diff.
 
shared_ptr< class_diff > class_diff_sptr
Convenience typedef for a shared pointer on a class_diff type.
 
const base_diff * is_base_diff(const diff *diff)
Test if a diff node is about differences between two base class specifiers.
 
const fn_parm_diff * is_fn_parm_diff(const diff *diff)
Test if a diff node is about differences between two function parameters.
 
void sort_string_member_function_sptr_map(const string_member_function_sptr_map &map, class_or_union::member_functions &sorted)
Sort a map that's an instance of string_member_function_sptr_map and fill a vector of member function...
 
const union_diff * is_union_diff(const diff *diff)
Test if a diff node is a union_diff node.
 
vector< changed_var_sptr > changed_var_sptrs_type
Convenience typedef for a vector of @changed_var_sptr.gg381.
 
shared_ptr< pointer_diff > pointer_diff_sptr
Convenience typedef for a shared pointer on a pointer_diff type.
 
const diff * peel_pointer_diff(const diff *dif)
If a diff node is about changes between two pointer types, get the diff node about changes between th...
 
void apply_suppressions(diff *diff_tree)
Walk a given diff-sub tree and appply the suppressions carried by the context. If the suppression app...
 
void sort_string_parm_map(const string_parm_map &map, vector< function_decl::parameter_sptr > &sorted)
Sort a map of string -> function parameters.
 
void sort_string_type_base_sptr_map(string_type_base_sptr_map &map, vector< type_base_sptr > &sorted)
Sort a map of string to type_base_sptr entities.
 
const enum_diff * is_enum_diff(const diff *diff)
Test if a diff node is a enum_diff node.
 
unordered_map< string, base_diff_sptr > string_base_diff_sptr_map
Convenience typedef for a map of string and base_diff_sptr.
 
void sort_data_members(const string_decl_base_sptr_map &data_members, vector< decl_base_sptr > &sorted)
Sort a map of data members by the offset of their initial value.
 
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 corpus_diff * is_corpus_diff(const diff *diff)
Test if a diff node is a corpus_diff node.
 
const diff * get_typedef_diff_underlying_type_diff(const diff *diff)
Return the leaf underlying diff node of a typedef_diff node.
 
const typedef_diff * is_typedef_diff(const diff *diff)
Test if a diff node is a typedef_diff node.
 
unordered_map< unsigned, var_diff_sptr > unsigned_var_diff_sptr_map
Convenience typedef for a map whose key is an unsigned int and whose value is a changed variable of t...
 
type_base_sptr get_leaf_type(qualified_type_def_sptr t)
Return the first underlying type that is not a qualified type.
 
const diff * peel_typedef_qualified_type_or_parameter_diff(const diff *dif)
If a diff node is about changes between two typedefs or qualified types, get the diff node about chan...
 
shared_ptr< array_diff > array_diff_sptr
Convenience typedef for a shared pointer on a array_diff type.
 
bool is_reference_or_ptr_diff_to_non_basic_nor_distinct_types(const diff *diff)
Test if a diff node is a reference or pointer diff node to a change that is neither basic type change...
 
const class_diff * is_class_diff(const diff *diff)
Test if a diff node is a class_diff node.
 
void sort_string_var_ptr_map(const string_var_ptr_map &map, vector< const var_decl * > &sorted)
Sort a map of string -> pointer to var_decl.
 
const type_decl_diff * is_diff_of_basic_type(const diff *d)
Test if a diff node represents a diff between two basic types.
 
unordered_map< string, diff_sptr > string_diff_sptr_map
Convenience typedef for a map which value is a diff_sptr. The key of the map is the qualified name of...
 
unordered_map< const diff *, artifact_sptr_set_type, diff_hash, diff_equal > diff_artifact_set_map_type
A convenience typedef for an unordered_map which key is a diff* and which value is a artifact_sptr_se...
 
const qualified_type_diff * is_qualified_type_diff(const diff *diff)
Test if a diff node is about differences between two qualified types.
 
diff_sptr compute_diff(const decl_base_sptr first, const decl_base_sptr second, diff_context_sptr ctxt)
Compute the difference between two decls. The decls can represent either type declarations,...
 
unordered_map< string, diff * > string_diff_ptr_map
Convenience typedef for a map which value is a diff*. The key of the map is the qualified name of the...
 
void sort_string_base_diff_sptr_map(const string_base_diff_sptr_map &map, base_diff_sptrs_type &sorted)
Sort a map of string -> base_diff_sptr into a sorted vector of base_diff_sptr. The base_diff_sptr are...
 
void sort_changed_enumerators(const string_changed_enumerator_map &enumerators_map, changed_enumerators_type &sorted)
Sort a map of changed enumerators.
 
void print_diff_tree(diff *diff_tree, ostream &out)
Emit a textual representation of a diff sub-tree to an output stream.
 
vector< changed_enumerator > changed_enumerators_type
Convenience typedef for a vector of changed enumerators.
 
vector< function_decl_diff_sptr > function_decl_diff_sptrs_type
Convenience typedef for a vector of function_decl_diff_sptr.
 
bool is_child_node_of_function_parm_diff(const diff *diff)
Test if a diff node is a child node of a function parameter diff node.
 
void sort_string_virtual_member_function_diff_sptr_map(const string_function_decl_diff_sptr_map &map, function_decl_diff_sptrs_type &sorted)
Sort an map of string -> virtual member function into a vector of virtual member functions....
 
shared_ptr< function_type_diff > function_type_diff_sptr
A convenience typedef for a shared pointer to function_type_type_diff.
 
const function_type_diff * is_function_type_diff_with_local_changes(const diff *diff)
Test if a given diff node carries a function type change with local changes.
 
const var_diff * is_var_diff(const diff *diff)
Test if a diff node is about differences between variables.
 
const type_diff_base * is_type_diff(const diff *diff)
Test if a diff node is about differences between types.
 
unordered_map< string, elf_symbol_sptr > string_elf_symbol_map
Convenience typedef for a map whose key is a string and whose value is an elf_symbol_sptr.
 
void sort_string_diff_sptr_map(const string_diff_sptr_map &map, diff_sptrs_type &sorted)
Sort a map ofg string -> diff_sptr into a vector of diff_sptr. The diff_sptr are sorted lexicographic...
 
const reference_diff * is_reference_diff(const diff *diff)
Test if a diff node is about differences between two references.
 
void sort_string_data_member_diff_sptr_map(const string_var_diff_sptr_map &map, var_diff_sptrs_type &sorted)
Sort the values of a string_var_diff_sptr_map and store the result in a vector of var_diff_sptr.
 
void apply_filters(corpus_diff_sptr diff_tree)
Apply the diff tree filters that have been associated to the context of the a given corpus_diff tree....
 
shared_ptr< distinct_diff > distinct_diff_sptr
Convenience typedef for a shared pointer to distinct_types_diff.
 
shared_ptr< corpus_diff > corpus_diff_sptr
A convenience typedef for a shared pointer to corpus_diff.
 
std::pair< var_decl_sptr, var_decl_sptr > changed_var_sptr
Convenience typedef for a pair of var_decl_sptr representing a var_decl change. The first member of t...
 
shared_ptr< typedef_diff > typedef_diff_sptr
Convenience typedef for a shared pointer on a typedef_diff type.
 
const diff * peel_typedef_or_qualified_type_diff(const diff *dif)
If a diff node is about changes between two typedefs or qualified types, get the diff node about chan...
 
void sort_enumerators(const string_enumerator_map &enumerators_map, enum_type_decl::enumerators &sorted)
Sort a map of enumerators by their value.
 
unordered_map< string, const function_decl * > string_function_ptr_map
Convenience typedef for a map which key is a string and which value is a pointer to decl_base.
 
ostream & operator<<(ostream &o, diff_category c)
Serialize an instance of diff_category to an output stream.
 
shared_ptr< translation_unit_diff > translation_unit_diff_sptr
Convenience typedef for a shared pointer on a translation_unit_diff type.
 
void compute_diff(RandomAccessOutputIterator a_base, RandomAccessOutputIterator a_begin, RandomAccessOutputIterator a_end, RandomAccessOutputIterator b_base, RandomAccessOutputIterator b_begin, RandomAccessOutputIterator b_end, vector< point > &lcs, edit_script &ses, int &ses_len)
Compute the longest common subsequence of two (sub-regions of) sequences as well as the shortest edit...
 
shared_ptr< reference_type_def > reference_type_def_sptr
Convenience typedef for a shared pointer on a reference_type_def.
 
bool get_member_function_is_dtor(const function_decl &f)
Test whether a member function is a destructor.
 
bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
 
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
 
unordered_set< type_or_decl_base_sptr, type_or_decl_hash, type_or_decl_equal > artifact_sptr_set_type
A convenience typedef for a hash set of type_or_decl_base_sptr.
 
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
 
bool is_anonymous_data_member(const decl_base &d)
Test if a decl is an anonymous data member.
 
array_type_def::subrange_type * is_subrange_type(const type_or_decl_base *type)
Test if a type is an array_type_def::subrange_type.
 
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
 
change_kind
A bitfield that gives callers of abigail::ir::equals() some insight about how different two internal ...
 
@ LOCAL_TYPE_CHANGE_KIND
This means that a given IR artifact has a local type change.
 
@ ALL_LOCAL_CHANGES_MASK
Testing (anding) against this mask means that a given IR artifact has local differences,...
 
@ LOCAL_NON_TYPE_CHANGE_KIND
This means that a given IR artifact has a local non-type change. That is a change that is carried by ...
 
bool is_user_defined_type(const type_base *t)
Test if a type is user-defined.
 
bool is_class_type(const type_or_decl_base &t)
Test whether a type is a class.
 
shared_ptr< array_type_def > array_type_def_sptr
Convenience typedef for a shared pointer on a array_type_def.
 
string get_pretty_representation(const type_or_decl_base *tod, bool internal)
Build and return a copy of the pretty representation of an ABI artifact that could be either a type o...
 
class_or_union * is_class_or_union_type(const type_or_decl_base *t)
Test if a type is a class_or_union.
 
const var_decl_sptr get_next_data_member(const class_or_union *klass, const var_decl_sptr &data_member)
In the context of a given class or union, this function returns the data member that is located after...
 
shared_ptr< class_decl > class_decl_sptr
Convenience typedef for a shared pointer on a class_decl.
 
shared_ptr< function_type > function_type_sptr
Convenience typedef for a shared pointer on a function_type.
 
shared_ptr< typedef_decl > typedef_decl_sptr
Convenience typedef for a shared pointer on a typedef_decl.
 
const enum_type_decl * is_enum_type(const type_or_decl_base *d)
Test if a decl is an enum_type_decl.
 
var_decl_sptr find_data_member_from_anonymous_data_member(const var_decl_sptr &anon_dm, const string &name)
Find a data member inside an anonymous data member.
 
const global_scope * get_global_scope(const decl_base &decl)
return the global scope as seen by a given declaration.
 
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
 
shared_ptr< ptr_to_mbr_type > ptr_to_mbr_type_sptr
Convenience typedef for a shared pointer to a ptr_to_mbr_type.
 
shared_ptr< scope_decl > scope_decl_sptr
Convenience typedef for a shared pointer on a scope_decl.
 
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
 
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
 
bool equals(const decl_base &l, const decl_base &r, change_kind *k)
Compares two instances of decl_base.
 
shared_ptr< pointer_type_def > pointer_type_def_sptr
Convenience typedef for a shared pointer on a pointer_type_def.
 
bool is_enumerator_present_in_enum(const enum_type_decl::enumerator &enr, const enum_type_decl &enom)
Test if a given enumerator is found present in an enum.
 
uint64_t get_absolute_data_member_offset(const var_decl &m)
Get the absolute offset of a data member.
 
bool is_member_function(const function_decl &f)
Test whether a function_decl is a member function.
 
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
 
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
 
shared_ptr< enum_type_decl > enum_type_decl_sptr
Convenience typedef for shared pointer to a enum_type_decl.
 
type_base_sptr strip_typedef(const type_base_sptr type)
Recursively returns the the underlying type of a typedef. The return type should not be a typedef of ...
 
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
 
bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
 
class_or_union * look_through_decl_only_class(class_or_union *the_class)
If a class (or union) is a decl-only class, get its definition. Otherwise, just return the initial cl...
 
bool is_union_type(const type_or_decl_base &t)
Test if a type is a union_decl.
 
bool is_data_member(const var_decl &v)
Test if a var_decl is a data member.
 
const decl_base * get_type_declaration(const type_base *t)
Get the declaration for a given type.
 
const var_decl * lookup_data_member(const type_base *type, const char *dm_name)
Look for a data member of a given class, struct or union type and return it.
 
interned_string get_function_id_or_pretty_representation(const function_decl *fn)
Get the ID of a function, or, if the ID can designate several different functions,...
 
shared_ptr< type_decl > type_decl_sptr
Convenience typedef for a shared pointer on a type_decl.
 
bool is_unique_type(const type_base_sptr &t)
Test if a type is unique in the entire environment.
 
method_type_sptr is_method_type(const type_or_decl_base_sptr &t)
Test whether a type is a method_type.
 
bool class_or_union_types_of_same_kind(const class_or_union *first, const class_or_union *second)
Test if two class or union types are of the same kind.
 
bool is_at_global_scope(const decl_base &decl)
Tests whether a given declaration is at global scope.
 
bool is_member_decl(const decl_base_sptr d)
Tests if a declaration is a class member.
 
shared_ptr< variable_suppression > variable_suppression_sptr
A convenience typedef for a shared pointer to variable_suppression.
 
vector< suppression_sptr > suppressions_type
Convenience typedef for a vector of suppression_sptr.
 
shared_ptr< function_suppression > function_suppression_sptr
Convenience typedef for a shared pointer to function_suppression.
 
variable_suppression_sptr is_variable_suppression(const suppression_sptr s)
Test if an instance of suppression is an instance of variable_suppression.
 
bool is_private_type_suppr_spec(const type_suppression &s)
Test if a type suppression specification represents a private type suppression automatically generate...
 
shared_ptr< type_suppression > type_suppression_sptr
Convenience typedef for a shared pointer to type_suppression.
 
function_suppression_sptr is_function_suppression(const suppression_sptr suppr)
Test if an instance of suppression is an instance of function_suppression.
 
type_suppression_sptr is_type_suppression(suppression_sptr suppr)
Test if an instance of suppression is an instance of type_suppression.
 
shared_ptr< suppression_base > suppression_sptr
Convenience typedef for a shared pointer to a suppression.
 
bool is_negated_suppression(const suppression_base &s)
Test if a suppression specification is a negated suppression.
 
Toplevel namespace for libabigail.
 
A comparison function for instances of base_diff.
 
A functor to compare instances of class_decl::base_spec.
 
A functor to compare two changed enumerators, based on their initial value.
 
size_t count_filtered_bases()
Count the number of bases classes whose changes got filtered out.
 
class_decl::base_spec_sptr base_has_changed(class_decl::base_spec_sptr) const
Test whether a given base class has changed. A base class has changed if it's in both in deleted *and...
 
The type of private data of class_or_union_diff.
 
size_t count_filtered_changed_dm(bool local_only=false)
Get the number of data member changes carried by the current diff node that were filtered out.
 
size_t count_filtered_subtype_changed_dm(bool local_only=false)
Get the number of data member sub-type changes carried by the current diff node that were filtered ou...
 
size_t get_deleted_non_static_data_members_number() const
Get the number of non static data members that were deleted.
 
size_t count_filtered_changed_mem_fns(const diff_context_sptr &)
Get the number of member functions changes carried by the current diff node that were filtered out.
 
decl_base_sptr subtype_changed_dm(decl_base_sptr) const
Test if the current diff node carries a data member change for a data member which name is the same a...
 
type_or_decl_base_sptr member_type_has_changed(decl_base_sptr) const
Test if the current diff node carries a member type change for a member type which name is the same a...
 
decl_base_sptr member_class_tmpl_has_changed(decl_base_sptr) const
Test if the current diff node carries a member class template change for a member class template whic...
 
size_t count_filtered_inserted_mem_fns(const diff_context_sptr &)
Get the number of member functions insertions carried by the current diff node that were filtered out...
 
size_t count_filtered_deleted_mem_fns(const diff_context_sptr &)
Get the number of member functions deletions carried by the current diff node that were filtered out.
 
size_t get_inserted_non_static_data_members_number() const
Get the number of non static data members that were inserted.
 
The type of the private data of corpus_diff::diff_stats.
 
bool added_unreachable_type_is_suppressed(const type_base *t) const
Test if an added type that is unreachable from public interface has been suppressed by a suppression ...
 
void ensure_lookup_tables_populated()
If the lookup tables are not yet built, walk the differences and fill the lookup tables.
 
const vector< diff_sptr > & changed_unreachable_types_sorted() const
Get the sorted vector of diff nodes representing changed unreachable types.
 
diff_context_sptr get_context()
Getter of the context associated with this corpus.
 
void categorize_redundant_changed_sub_nodes()
Walk the changed functions and variables diff nodes to categorize redundant nodes.
 
const string_diff_sptr_map & changed_unreachable_types() const
Get the map of diff nodes representing changed unreachable types.
 
bool added_unrefed_var_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given added variable symbol (that is not referenced by any debug inf...
 
bool lookup_tables_empty() const
Tests if the lookup tables are empty.
 
bool deleted_unrefed_fn_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given deleted function symbol (that is not referenced by any debug i...
 
void apply_filters_and_compute_diff_stats(corpus_diff::diff_stats &)
Compute the diff stats.
 
bool added_variable_is_suppressed(const var_decl *var) const
Test if the change reports for a given added variable have been suppressed.
 
bool deleted_unreachable_type_is_suppressed(const type_base *t) const
Test if a deleted type that is unreachable from public interface has been suppressed by a suppression...
 
bool deleted_variable_is_suppressed(const var_decl *var) const
Test if the change reports for a give given deleted variable has been deleted.
 
bool deleted_unrefed_var_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given deleted variable symbol (that is not referenced by any debug i...
 
void maybe_dump_diff_tree()
If the user asked to dump the diff tree node (for changed variables and functions) on the error outpu...
 
void count_unreachable_types(size_t &num_added, size_t &num_removed, size_t &num_changed, size_t &num_filtered_added, size_t &num_filtered_removed, size_t &num_filtered_changed)
Count the number of types not reachable from the interface (i.e, not reachable from global functions ...
 
void clear_redundancy_categorization()
Walk the changed functions and variables diff nodes and clear the redundancy categorization they migh...
 
void count_leaf_changes(size_t &num_changes, size_t &num_filtered)
Count the number of leaf changes as well as the number of the changes that have been filtered out.
 
void count_leaf_type_changes(size_t &num_type_changes, size_t &num_type_changes_filtered)
Count the number of leaf *type* changes as well as the number of the leaf type changes that have been...
 
bool added_unrefed_fn_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given added function symbol (that is not referenced by any debug inf...
 
bool deleted_function_is_suppressed(const function_decl *fn) const
Test if the change reports for a given deleted function have been deleted.
 
void apply_supprs_to_added_removed_fns_vars_unreachable_types()
Apply suppression specifications for this corpus diff to the set of added/removed functions/variables...
 
void emit_diff_stats(const diff_stats &stats, ostream &out, const string &indent)
Emit the summary of the functions & variables that got removed/changed/added.
 
bool added_function_is_suppressed(const function_decl *fn) const
Test if the change reports for a give given added function has been deleted.
 
void clear_lookup_tables()
Clear the lookup tables useful for reporting an enum_diff.
 
A comparison functor to compare two data members based on their offset.
 
A comparison functor to compare two instances of var_diff that represent changed data members based o...
 
A comparison functor for instances of diff.
 
A functor to compare two instances of diff_sptr.
 
The private data structure for distinct_diff.
 
A functor to compare instances of elf_symbol base on their names.
 
A functor to compare two enumerators based on their value. This implements the "less than" operator.
 
A comparison functor to compare two instances of fn_parm_diff based on their indexes.
 
"Less than" functor to compare instances of function_decl.
 
A "Less Than" functor to compare instance of function_decl_diff.
 
Functor that compares two function parameters for the purpose of sorting them.
 
The internal type for the impl idiom implementation of pointer_diff.
 
The private data of the ptr_to_mbr_diff type.
 
The internal type for the impl idiom implementation of subrange_diff.
 
A functor to compare instances of var_decl base on their qualified names.
 
The internal type for the impl idiom implementation of var_diff.
 
Functor to sort instances of var_diff_sptr.
 
A comparison functor for instances of function_decl_diff that represent changes between two virtual m...
 
An equality functor to deeply compare pointers.
 
A comparison functor to compare pointer to instances of type_or_decl_base.
 
A deleter for shared pointers that ... doesn't delete the object managed by the shared pointer.