19 #include "abg-reporter-priv.h"
114 for (string_enumerator_map::const_iterator i = enumerators_map.begin();
115 i != enumerators_map.end();
117 sorted.push_back(i->second);
119 std::sort(sorted.begin(), sorted.end(), comp);
131 for (string_changed_enumerator_map::const_iterator i =
132 enumerators_map.begin();
133 i != enumerators_map.end();
135 sorted.push_back(i->second);
138 std::sort(sorted.begin(), sorted.end(), comp);
148 vector<decl_base_sptr>& sorted)
150 sorted.reserve(data_members.size());
151 for (string_decl_base_sptr_map::const_iterator i = data_members.begin();
152 i != data_members.end();
154 sorted.push_back(i->second);
157 std::sort(sorted.begin(), sorted.end(), comp);
167 std::sort(to_sort.begin(), to_sort.end(), comp);
178 vector<function_decl*>& sorted)
180 sorted.reserve(map.size());
181 for (string_function_ptr_map::const_iterator i = map.begin();
184 sorted.push_back(i->second);
187 std::sort(sorted.begin(), sorted.end(), comp);
201 sorted.reserve(map.size());
202 for (string_member_function_sptr_map::const_iterator i = map.begin();
205 sorted.push_back(i->second);
208 std::sort(sorted.begin(), sorted.end(), comp);
224 sorted.reserve(map.size());
225 for (string_function_decl_diff_sptr_map::const_iterator i = map.begin();
228 sorted.push_back(i->second);
230 std::sort(sorted.begin(), sorted.end(), comp);
243 sorted.reserve(map.size());
244 for (string_var_diff_sptr_map::const_iterator i = map.begin();
247 sorted.push_back(i->second);
250 std::sort(sorted.begin(), sorted.end(), comp);
264 vector<elf_symbol_sptr>& sorted)
266 for (string_elf_symbol_map::const_iterator i = map.begin();
269 sorted.push_back(i->second);
272 std::sort(sorted.begin(), sorted.end(), comp);
285 vector<var_decl*>& sorted)
287 for (string_var_ptr_map::const_iterator i = map.begin();
290 sorted.push_back(i->second);
293 std::sort(sorted.begin(), sorted.end(), comp);
306 sorted.reserve(map.size());
307 for (string_var_diff_sptr_map::const_iterator i = map.begin();
310 sorted.push_back(i->second);
312 std::sort(sorted.begin(), sorted.end(), comp);
325 sorted.reserve(map.size());
326 for (unsigned_var_diff_sptr_map::const_iterator i = map.begin();
329 sorted.push_back(i->second);
331 std::sort(sorted.begin(), sorted.end(), comp);
347 sorted.reserve(map.size());
348 for (string_function_decl_diff_sptr_map::const_iterator i = map.begin();
351 sorted.push_back(i->second);
354 sort(sorted.begin(), sorted.end(), comp);
368 sorted.reserve(map.size());
369 for (string_diff_sptr_map::const_iterator i = map.begin();
372 sorted.push_back(i->second);
375 sort(sorted.begin(), sorted.end(), comp);
389 sorted.reserve(map.size());
390 for (string_diff_ptr_map::const_iterator i = map.begin();
393 sorted.push_back(i->second);
396 sort(sorted.begin(), sorted.end(), comp);
410 for (string_base_diff_sptr_map::const_iterator i = map.begin();
413 sorted.push_back(i->second);
415 sort(sorted.begin(), sorted.end(), comp);
424 for (string_base_sptr_map::const_iterator i = m.begin();
427 sorted.push_back(i->second);
430 std::sort(sorted.begin(), sorted.end(), comp);
442 vector<fn_parm_diff_sptr>& sorted)
444 sorted.reserve(map.size());
445 for (unsigned_fn_parm_diff_sptr_map::const_iterator i = map.begin();
448 sorted.push_back(i->second);
451 std::sort(sorted.begin(), sorted.end(), comp);
463 vector<fn_parm_diff_sptr>& sorted)
465 sorted.reserve(map.size());
466 for (string_fn_parm_diff_sptr_map::const_iterator i = map.begin();
469 sorted.push_back(i->second);
472 std::sort(sorted.begin(), sorted.end(), comp);
483 vector<function_decl::parameter_sptr>& sorted)
485 for (string_parm_map::const_iterator i = map.begin();
488 sorted.push_back(i->second);
491 std::sort(sorted.begin(), sorted.end(), comp);
503 vector<type_or_decl_base_sptr>& sorted)
506 for (artifact_sptr_set_type::const_iterator it = set.begin();
509 sorted.push_back(*it);
512 std::sort(sorted.begin(), sorted.end(), comp);
527 vector<type_base_sptr>& sorted)
529 for (string_type_base_sptr_map::const_iterator i = map.begin();
532 sorted.push_back(i->second);
535 std::sort(sorted.begin(), sorted.end(), comp);
547 return type_base_sptr();
549 type_base_sptr ut = t->get_underlying_type();
550 qualified_type_def_sptr qut = dynamic_pointer_cast<qualified_type_def>(ut);
578 if (decl_base_sptr decl =
is_decl(first))
595 |
static_cast<unsigned>(r));}
602 &
static_cast<unsigned>(r));
608 {
return static_cast<visiting_kind>(~static_cast<unsigned>(l));}
682 if (dif->first_class_or_union()->get_is_anonymous())
738 if (d->has_local_changes())
912 diff_context::diff_context()
928 diff_context::~diff_context() =
default;
935 {
return priv_->do_log_;}
942 {priv_->do_log_ = f;}
949 {priv_->corpus_diff_ = d;}
956 {
return priv_->corpus_diff_;}
965 if (priv_->corpus_diff_)
966 return priv_->corpus_diff_->first_corpus();
967 return corpus_sptr();
978 if (priv_->corpus_diff_)
979 return priv_->corpus_diff_->second_corpus();
980 return corpus_sptr();
989 if (!priv_->reporter_)
997 return priv_->reporter_;
1005 {priv_->reporter_ = r;}
1019 types_or_decls_diff_map_type::const_iterator i =
1020 priv_->types_or_decls_diff_map.find(std::make_pair(first, second));
1021 if (i != priv_->types_or_decls_diff_map.end())
1035 diff_context::has_diff_for_types(
const type_base_sptr first,
1036 const type_base_sptr second)
const
1037 {
return has_diff_for(first, second);}
1045 diff_context::has_diff_for(
const diff* d)
const
1046 {
return has_diff_for(d->first_subject(), d->second_subject()).get();}
1054 diff_context::has_diff_for(
const diff_sptr d)
const
1055 {
return has_diff_for(d->first_subject(), d->second_subject());}
1064 {
return priv_->allowed_category_;}
1073 {priv_->allowed_category_ = c;}
1086 {priv_->allowed_category_ = priv_->allowed_category_ | c;}
1097 {priv_->allowed_category_ = priv_->allowed_category_ & ~c;}
1113 {priv_->types_or_decls_diff_map[std::make_pair(first, second)] = d;}
1119 diff_context::add_diff(
const diff* d)
1132 diff_context::add_diff(
const diff_sptr d)
1135 add_diff(d->first_subject(), d->second_subject(), d);
1152 {
return has_diff_for(first, second);}
1164 {
return has_diff_for(d);}
1180 if (!has_diff_for(first, second))
1182 add_diff(first, second, d);
1183 priv_->canonical_diffs.push_back(d);
1208 canonical = canonical_diff;
1209 set_canonical_diff_for(first, second, canonical);
1252 {priv_->live_diffs_.insert(d);}
1265 size_t ptr_value =
reinterpret_cast<size_t>(canonical);
1266 pointer_map::iterator it = priv_->visited_diff_nodes_.find(ptr_value);
1267 if (it != priv_->visited_diff_nodes_.end())
1268 return reinterpret_cast<diff*
>(it->second);
1301 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical);
1302 size_t diff_ptr_value =
reinterpret_cast<size_t>(d);
1303 priv_->visited_diff_nodes_[canonical_ptr_value] = diff_ptr_value;
1309 {priv_->visited_diff_nodes_.clear();}
1319 {priv_->forbid_visiting_a_node_twice_ = f;}
1329 {priv_->reset_visited_diffs_for_each_interface_ = f;}
1337 {
return priv_->forbid_visiting_a_node_twice_;}
1351 return (priv_->forbid_visiting_a_node_twice_
1352 && priv_->reset_visited_diffs_for_each_interface_);
1360 {
return priv_->filters_;}
1368 {priv_->filters_.push_back(f);}
1389 for (filtering::filters::const_iterator i =
diff_filters().begin();
1396 std::cerr <<
"applying a filter to diff '"
1407 std::cerr <<
"filter applied!:" << t <<
"\n";
1409 std::cerr <<
"propagating categories for the same diff node ... \n";
1418 std::cerr <<
"category propagated!: " << t <<
"\n";
1439 for (filtering::filters::const_iterator i =
diff_filters().begin();
1454 {
return priv_->suppressions_;}
1465 priv_->negated_suppressions_.clear();
1466 priv_->direct_suppressions_.clear();
1467 return priv_->suppressions_;
1486 if (priv_->negated_suppressions_.empty())
1489 priv_->negated_suppressions_.push_back(s);
1491 return priv_->negated_suppressions_;
1509 if (priv_->direct_suppressions_.empty())
1513 priv_->direct_suppressions_.push_back(s);
1515 return priv_->direct_suppressions_;
1526 priv_->suppressions_.push_back(suppr);
1529 priv_->negated_suppressions_.clear();
1530 priv_->direct_suppressions_.clear();
1541 priv_->suppressions_.insert(priv_->suppressions_.end(),
1542 supprs.begin(), supprs.end());
1551 {
return priv_->perform_change_categorization_;}
1558 {priv_->perform_change_categorization_ = f;}
1572 priv_->leaf_changes_only_ = f;
1582 {
return priv_->leaf_changes_only_;}
1592 {
return priv_->hex_values_;}
1602 {priv_->hex_values_ = f;}
1611 {
return priv_->show_offsets_sizes_in_bits_;}
1620 {priv_->show_offsets_sizes_in_bits_ = f;}
1629 {priv_->show_relative_offset_changes_ = f;}
1638 {
return priv_->show_relative_offset_changes_;}
1646 {priv_->show_stats_only_ = f;}
1654 {
return priv_->show_stats_only_;}
1662 {priv_->show_soname_change_ = f;}
1670 {
return priv_->show_soname_change_;}
1678 {priv_->show_architecture_change_ = f;}
1686 {
return priv_->show_architecture_change_;}
1693 {priv_->show_deleted_fns_ = f;}
1699 {
return priv_->show_deleted_fns_;}
1706 {priv_->show_changed_fns_ = f;}
1711 {
return priv_->show_changed_fns_;}
1718 {priv_->show_added_fns_ = f;}
1724 {
return priv_->show_added_fns_;}
1731 {priv_->show_deleted_vars_ = f;}
1737 {
return priv_->show_deleted_vars_;}
1744 {priv_->show_changed_vars_ = f;}
1749 {
return priv_->show_changed_vars_;}
1756 {priv_->show_added_vars_ = f;}
1762 {
return priv_->show_added_vars_;}
1765 diff_context::show_linkage_names()
const
1766 {
return priv_->show_linkage_names_;}
1769 diff_context::show_linkage_names(
bool f)
1770 {priv_->show_linkage_names_= f;}
1777 {priv_->show_locs_= f;}
1783 {
return priv_->show_locs_;}
1792 {
return priv_->show_redundant_changes_;}
1801 {priv_->show_redundant_changes_ = f;}
1809 {
return priv_->show_syms_unreferenced_by_di_;}
1817 {priv_->show_syms_unreferenced_by_di_ = f;}
1826 {
return priv_->show_added_syms_unreferenced_by_di_;}
1835 {priv_->show_added_syms_unreferenced_by_di_ = f;}
1844 {priv_->show_unreachable_types_ = f;}
1853 {
return priv_->show_unreachable_types_;}
1864 {
return priv_->show_impacted_interfaces_;}
1875 {priv_->show_impacted_interfaces_ = f;}
1884 {priv_->default_output_stream_ = o;}
1893 {
return priv_->default_output_stream_;}
1901 {priv_->error_output_stream_ = o;}
1909 {
return priv_->error_output_stream_;}
1918 {
return priv_->dump_diff_tree_;}
1927 {priv_->dump_diff_tree_ = f;}
1966 : priv_(new priv(first_subject, second_subject,
1988 : priv_(new priv(first_subject, second_subject,
2027 if (priv_->canonical_diff_)
2028 priv_->canonical_diff_->priv_->traversing_ =
true;
2029 priv_->traversing_ =
true;
2046 if (priv_->canonical_diff_)
2047 return priv_->canonical_diff_->priv_->traversing_;
2048 return priv_->traversing_;
2062 if (priv_->canonical_diff_)
2063 priv_->canonical_diff_->priv_->traversing_ =
false;
2064 priv_->traversing_ =
false;
2080 if (diff::priv_->finished_)
2083 diff::priv_->finished_ =
true;
2091 {
return dynamic_pointer_cast<type_or_decl_base>(priv_->first_subject_);}
2098 {
return dynamic_pointer_cast<type_or_decl_base>(priv_->second_subject_);}
2103 const vector<diff*>&
2105 {
return priv_->children_;}
2112 {
return priv_->parent_;}
2125 {
return priv_->canonical_diff_;}
2133 {priv_->canonical_diff_ = d;}
2146 context()->keep_diff_alive(d);
2153 priv_->children_.push_back(d.get());
2155 d->priv_->parent_ =
this;
2163 {
return priv_->get_context();}
2180 if (priv_->canonical_diff_)
2181 return priv_->canonical_diff_->priv_->currently_reporting_;
2182 return priv_->currently_reporting_;
2193 if (priv_->canonical_diff_)
2194 priv_->canonical_diff_->priv_->currently_reporting_ = f;
2195 priv_->currently_reporting_ = f;
2206 return priv_->canonical_diff_->priv_->reported_once_;
2266 bool already_visited =
false;
2267 if (
context()->visiting_a_node_twice_is_forbidden()
2268 &&
context()->diff_has_been_visited(
this))
2269 already_visited =
true;
2271 bool mark_visited_nodes_as_traversed =
2274 if (!already_visited && !v.
visit(
this,
true))
2277 if (mark_visited_nodes_as_traversed)
2278 context()->mark_diff_as_visited(
this);
2284 && !already_visited)
2291 if (!(*i)->traverse(v))
2294 if (mark_visited_nodes_as_traversed)
2295 context()->mark_diff_as_visited(
this);
2303 if (!v.
visit(
this,
false))
2306 if (mark_visited_nodes_as_traversed)
2307 context()->mark_diff_as_visited(
this);
2312 if (!already_visited && mark_visited_nodes_as_traversed)
2313 context()->mark_diff_as_visited(
this);
2327 priv_->canonical_diff_->priv_->reported_once_ = f;
2328 priv_->reported_once_ = f;
2340 {
return priv_->local_category_;}
2366 {
return priv_->category_;}
2381 priv_->category_ = priv_->category_ | c;
2382 return priv_->category_;
2396 priv_->local_category_ = priv_->local_category_ | c;
2397 return priv_->local_category_;
2425 priv_->category_ = priv_->category_ & ~c;
2426 return priv_->category_;
2440 priv_->local_category_ = priv_->local_category_ & ~c;
2441 return priv_->local_category_;
2451 {priv_->category_ = c;}
2458 {priv_->local_category_ = c;}
2483 && !canonical->is_allowed_by_specific_negated_suppression()
2484 && !canonical->has_descendant_allowed_by_specific_negated_suppression()
2485 && !canonical->has_parent_allowed_by_specific_negated_suppression())
2526 return priv_->is_filtered_out(c);
2537 bool is_private =
false;
2566 bool do_suppress = !
context()->negated_suppressions().empty();
2570 for (
auto n :
context()->negated_suppressions())
2571 if (!n->suppresses_diff(
this))
2573 do_suppress =
false;
2580 for (
auto d :
context()->direct_suppressions())
2581 if (d->suppresses_diff(
this))
2585 is_private_type =
true;
2625 for (suppressions_type::const_iterator i = suppressions.begin();
2626 i != suppressions.end();
2630 && !(*i)->suppresses_diff(
this))
2670 if (priv_->pretty_representation_.empty())
2671 priv_->pretty_representation_ =
"empty_diff";
2672 return priv_->pretty_representation_;
2699 type_diff_base::type_diff_base(type_base_sptr first_subject,
2700 type_base_sptr second_subject,
2702 :
diff(first_subject, second_subject, ctxt),
2706 type_diff_base::~type_diff_base()
2722 decl_base_sptr second_subject,
2724 :
diff(first_subject, second_subject, ctxt),
2728 decl_diff_base::~decl_diff_base()
2739 if (diff::priv_->pretty_representation_.empty())
2741 std::ostringstream o;
2742 o <<
"distinct_diff[";
2753 diff::priv_->pretty_representation_ = o.str();
2755 return diff::priv_->pretty_representation_;
2788 :
diff(first, second, ctxt),
2822 if (!priv_->compatible_child_diff)
2834 return priv_->compatible_child_diff;
2859 return typeid(f) !=
typeid(s);
2877 return NO_CHANGE_KIND;
2888 context()->get_reporter()->report(*
this, out, indent);
2911 ctxt->initialize_canonical_diff(result);
2936 template<
typename DiffType>
2942 if (shared_ptr<DiffType> f =
2943 dynamic_pointer_cast<DiffType>(first))
2945 shared_ptr<DiffType> s =
2946 dynamic_pointer_cast<DiffType>(second);
2972 dynamic_pointer_cast<class_decl>(first))
2978 if (f->get_is_declaration_only())
2985 if (s->get_is_declaration_only())
3040 ((d = try_to_diff<type_decl>(f, s, ctxt))
3041 ||(d = try_to_diff<enum_type_decl>(f, s, ctxt))
3042 ||(d = try_to_diff<union_decl>(f, s,ctxt))
3044 ||(d = try_to_diff<pointer_type_def>(f, s, ctxt))
3045 ||(d = try_to_diff<reference_type_def>(f, s, ctxt))
3046 ||(d = try_to_diff<array_type_def::subrange_type>(f, s, ctxt))
3047 ||(d = try_to_diff<array_type_def>(f, s, ctxt))
3048 ||(d = try_to_diff<qualified_type_def>(f, s, ctxt))
3049 ||(d = try_to_diff<typedef_decl>(f, s, ctxt))
3050 ||(d = try_to_diff<function_type>(f, s, ctxt))
3051 ||(d = try_to_diff_distinct_kinds(f, s, ctxt)));
3060 {
return static_cast<diff_category>(
static_cast<unsigned>(c1)
3061 |
static_cast<unsigned>(c2));}
3079 {
return static_cast<diff_category>(
static_cast<unsigned>(c1)
3080 ^
static_cast<unsigned>(c2));}
3084 {
return static_cast<diff_category>(
static_cast<unsigned>(c1)
3085 &
static_cast<unsigned>(c2));}
3089 {
return static_cast<diff_category>(~static_cast<unsigned>(c));}
3141 bool emitted_a_category =
false;
3145 o <<
"NO_CHANGE_CATEGORY";
3146 emitted_a_category =
true;
3151 if (emitted_a_category)
3153 o <<
"ACCESS_CHANGE_CATEGORY";
3154 emitted_a_category |=
true;
3159 if (emitted_a_category)
3161 o <<
"COMPATIBLE_TYPE_CHANGE_CATEGORY";
3162 emitted_a_category |=
true;
3167 if (emitted_a_category)
3169 o <<
"HARMLESS_DECL_NAME_CHANGE_CATEGORY";
3170 emitted_a_category |=
true;
3175 if (emitted_a_category)
3177 o <<
"NON_VIRT_MEM_FUN_CHANGE_CATEGORY";
3178 emitted_a_category |=
true;
3183 if (emitted_a_category)
3185 o <<
"STATIC_DATA_MEMBER_CHANGE_CATEGORY";
3186 emitted_a_category |=
true;
3191 if (emitted_a_category)
3193 o <<
"HARMLESS_ENUM_CHANGE_CATEGORY";
3194 emitted_a_category |=
true;
3199 if (emitted_a_category)
3201 o <<
"HARMLESS_DATA_MEMBER_CHANGE_CATEGORY";
3202 emitted_a_category |=
true;
3207 if (emitted_a_category)
3209 o <<
"HARMLESS_SYMBOL_ALIAS_CHANGE_CATEGORY";
3210 emitted_a_category |=
true;
3215 if (emitted_a_category)
3217 o <<
"HARMLESS_UNION_CHANGE_CATEGORY";
3218 emitted_a_category |=
true;
3223 if (emitted_a_category)
3225 o <<
"SUPPRESSED_CATEGORY";
3226 emitted_a_category |=
true;
3231 if (emitted_a_category)
3233 o <<
"PRIVATE_TYPE_CATEGORY";
3234 emitted_a_category |=
true;
3239 if (emitted_a_category)
3241 o <<
"SIZE_OR_OFFSET_CHANGE_CATEGORY";
3242 emitted_a_category |=
true;
3247 if (emitted_a_category)
3249 o <<
"VIRTUAL_MEMBER_CHANGE_CATEGORY";
3250 emitted_a_category |=
true;
3255 if (emitted_a_category)
3257 o <<
"REDUNDANT_CATEGORY";
3258 emitted_a_category |=
true;
3263 if (emitted_a_category)
3265 o <<
"TYPE_DECL_ONLY_DEF_CHANGE_CATEGORY";
3266 emitted_a_category |=
true;
3271 if (emitted_a_category)
3273 o <<
"FN_PARM_TYPE_TOP_CV_CHANGE_CATEGORY";
3274 emitted_a_category |=
true;
3279 if (emitted_a_category)
3281 o <<
"FN_PARM_TYPE_CV_CHANGE_CATEGORY";
3282 emitted_a_category |=
true;
3287 if (emitted_a_category)
3289 o <<
"FN_RETURN_TYPE_CV_CHANGE_CATEGORY";
3290 emitted_a_category |=
true;
3295 if (emitted_a_category)
3297 o <<
"FN_PARM_ADD_REMOVE_CHANGE_CATEGORY";
3298 emitted_a_category |=
true;
3303 if (emitted_a_category)
3305 o <<
"VAR_TYPE_CV_CHANGE_CATEGORY";
3306 emitted_a_category |=
true;
3311 if (emitted_a_category)
3313 o <<
"VOID_PTR_TO_PTR_CHANGE_CATEGORY";
3314 emitted_a_category |=
true;
3319 if (emitted_a_category)
3321 o <<
"BENIGN_INFINITE_ARRAY_CHANGE_CATEGORY";
3322 emitted_a_category |=
true;
3327 if (emitted_a_category)
3329 o <<
"HAS_ALLOWED_CHANGE_CATEGORY";
3330 emitted_a_category |=
true;
3335 if (emitted_a_category)
3337 o <<
"HAS_DESCENDANT_WITH_ALLOWED_CHANGE_CATEGORY";
3338 emitted_a_category |=
true;
3343 if (emitted_a_category)
3345 o <<
"HAS_PARENT_WITH_ALLOWED_CHANGE_CATEGORY";
3346 emitted_a_category |=
true;
3369 compute_diff_for_decls(
const decl_base_sptr first,
3370 const decl_base_sptr second,
3376 ((d = try_to_diff<function_decl>(first, second, ctxt))
3377 || (d = try_to_diff<var_decl>(first, second, ctxt))
3378 || (d = try_to_diff_distinct_kinds(first, second, ctxt)));
3401 const decl_base_sptr second,
3404 if (!first || !second)
3409 d = compute_diff_for_types(first, second, ctxt);
3411 d = compute_diff_for_decls(first, second, ctxt);
3431 const type_base_sptr second,
3437 diff_sptr d = compute_diff_for_types(f,s, ctxt);
3452 string prefix=
"diff of ";
3472 if (diff::priv_->pretty_representation_.empty())
3474 std::ostringstream o;
3480 diff::priv_->pretty_representation_ = o.str();
3482 return diff::priv_->pretty_representation_;
3525 if (
diff_sptr result = priv_->type_diff_.lock())
3532 context()->keep_diff_alive(result);
3533 priv_->type_diff_ = result;
3554 return ir::NO_CHANGE_KIND;
3566 context()->get_reporter()->report(*
this, out, indent);
3587 ctxt->initialize_canonical_diff(d);
3617 priv_(new
priv(underlying))
3625 {
return dynamic_pointer_cast<pointer_type_def>(
first_subject());}
3632 {
return dynamic_pointer_cast<pointer_type_def>(
second_subject());}
3639 if (diff::priv_->pretty_representation_.empty())
3641 std::ostringstream o;
3642 o <<
"pointer_diff["
3647 diff::priv_->pretty_representation_ = o.str();
3649 return diff::priv_->pretty_representation_;
3668 return ir::NO_CHANGE_KIND;
3677 {
return priv_->underlying_type_diff_;}
3686 {priv_->underlying_type_diff_ = d;}
3697 context()->get_reporter()->report(*
this, out, indent);
3717 diff_sptr d = compute_diff_for_types(first->get_pointed_to_type(),
3718 second->get_pointed_to_type(),
3721 ctxt->initialize_canonical_diff(result);
3746 priv_(new
priv(underlying_type_diff))
3774 {
return priv_->underlying_type_diff_;}
3783 if (diff::priv_->pretty_representation_.empty())
3785 std::ostringstream o;
3786 o <<
"subrange_diff["
3791 diff::priv_->pretty_representation_ = o.str();
3793 return diff::priv_->pretty_representation_;
3815 return ir::NO_CHANGE_KIND;
3825 {
context()->get_reporter()->report(*
this, out, indent);}
3853 diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
3854 second->get_underlying_type(),
3858 ctxt->initialize_canonical_diff(result);
3891 priv_(new
priv(element_type_diff))
3899 {
return dynamic_pointer_cast<array_type_def>(
first_subject());}
3913 {
return priv_->element_type_diff_;}
3920 {priv_->element_type_diff_ = d;}
3927 if (diff::priv_->pretty_representation_.empty())
3929 std::ostringstream o;
3935 diff::priv_->pretty_representation_ = o.str();
3937 return diff::priv_->pretty_representation_;
3954 if (f->get_name() != s->get_name())
3956 if (f->get_size_in_bits() != s->get_size_in_bits())
3958 if (f->get_alignment_in_bits() != s->get_alignment_in_bits())
3978 return ir::NO_CHANGE_KIND;
3989 context()->get_reporter()->report(*
this, out, indent);
4007 diff_sptr d = compute_diff_for_types(first->get_element_type(),
4008 second->get_element_type(),
4011 ctxt->initialize_canonical_diff(result);
4039 priv_(new
priv(underlying))
4047 {
return dynamic_pointer_cast<reference_type_def>(
first_subject());}
4054 {
return dynamic_pointer_cast<reference_type_def>(
second_subject());}
4062 {
return priv_->underlying_type_diff_;}
4070 priv_->underlying_type_diff_ = d;
4071 return priv_->underlying_type_diff_;
4079 if (diff::priv_->pretty_representation_.empty())
4081 std::ostringstream o;
4082 o <<
"reference_diff["
4087 diff::priv_->pretty_representation_ = o.str();
4089 return diff::priv_->pretty_representation_;
4110 return ir::NO_CHANGE_KIND;
4121 context()->get_reporter()->report(*
this, out, indent);
4139 diff_sptr d = compute_diff_for_types(first->get_pointed_to_type(),
4140 second->get_pointed_to_type(),
4143 ctxt->initialize_canonical_diff(result);
4167 qualified_type_def_sptr second,
4171 priv_(new
priv(under))
4177 const qualified_type_def_sptr
4179 {
return dynamic_pointer_cast<qualified_type_def>(
first_subject());}
4184 const qualified_type_def_sptr
4186 {
return dynamic_pointer_cast<qualified_type_def>(
second_subject());}
4195 {
return priv_->underlying_type_diff;}
4205 if (!priv_->leaf_underlying_type_diff)
4206 priv_->leaf_underlying_type_diff
4211 return priv_->leaf_underlying_type_diff;
4221 {priv_->underlying_type_diff = d;}
4228 if (diff::priv_->pretty_representation_.empty())
4230 std::ostringstream o;
4231 o <<
"qualified_type_diff["
4236 diff::priv_->pretty_representation_ = o.str();
4238 return diff::priv_->pretty_representation_;
4257 return ir::NO_CHANGE_KIND;
4268 context()->get_reporter()->report(*
this, out, indent);
4281 qualified_type_diff_sptr
4283 const qualified_type_def_sptr second,
4286 diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
4287 second->get_underlying_type(),
4291 ctxt->initialize_canonical_diff(result);
4304 enum_diff::clear_lookup_tables()
4306 priv_->deleted_enumerators_.clear();
4307 priv_->inserted_enumerators_.clear();
4308 priv_->changed_enumerators_.clear();
4315 enum_diff::lookup_tables_empty()
const
4317 return (priv_->deleted_enumerators_.empty()
4318 && priv_->inserted_enumerators_.empty()
4319 && priv_->changed_enumerators_.empty());
4325 enum_diff::ensure_lookup_tables_populated()
4327 if (!lookup_tables_empty())
4331 edit_script e = priv_->enumerators_changes_;
4333 for (vector<deletion>::const_iterator it = e.deletions().begin();
4334 it != e.deletions().end();
4337 unsigned i = it->index();
4338 const enum_type_decl::enumerator& n =
4340 const string& name = n.get_name();
4341 ABG_ASSERT(priv_->deleted_enumerators_.find(n.get_name())
4342 == priv_->deleted_enumerators_.end());
4343 priv_->deleted_enumerators_[name] = n;
4346 for (vector<insertion>::const_iterator it = e.insertions().begin();
4347 it != e.insertions().end();
4350 for (vector<unsigned>::const_iterator iit =
4351 it->inserted_indexes().begin();
4352 iit != it->inserted_indexes().end();
4356 const enum_type_decl::enumerator& n =
4358 const string& name = n.get_name();
4359 ABG_ASSERT(priv_->inserted_enumerators_.find(n.get_name())
4360 == priv_->inserted_enumerators_.end());
4361 string_enumerator_map::const_iterator j =
4362 priv_->deleted_enumerators_.find(name);
4363 if (j == priv_->deleted_enumerators_.end())
4364 priv_->inserted_enumerators_[name] = n;
4368 priv_->changed_enumerators_[j->first] =
4369 std::make_pair(j->second, n);
4370 priv_->deleted_enumerators_.erase(j);
4401 priv_(new
priv(underlying_type_diff))
4407 {
return dynamic_pointer_cast<enum_type_decl>(
first_subject());}
4417 {
return priv_->underlying_type_diff_;}
4422 {
return priv_->deleted_enumerators_;}
4427 {
return priv_->inserted_enumerators_;}
4432 {
return priv_->changed_enumerators_;}
4439 if (diff::priv_->pretty_representation_.empty())
4441 std::ostringstream o;
4447 diff::priv_->pretty_representation_ = o.str();
4449 return diff::priv_->pretty_representation_;
4468 return ir::NO_CHANGE_KIND;
4479 context()->get_reporter()->report(*
this, out, indent);
4501 diff_sptr ud = compute_diff_for_types(first->get_underlying_type(),
4502 second->get_underlying_type(),
4504 enum_diff_sptr d(
new enum_diff(first, second, ud, ctxt));
4505 if (first != second)
4508 first->get_enumerators().end(),
4509 second->get_enumerators().begin(),
4510 second->get_enumerators().end(),
4511 d->priv_->enumerators_changes_);
4512 d->ensure_lookup_tables_populated();
4514 ctxt->initialize_canonical_diff(d);
4536 string qname = d->get_qualified_name();
4537 string_diff_sptr_map::const_iterator it =
4538 changed_member_types_.find(qname);
4540 return ((it == changed_member_types_.end())
4542 : it->second->second_subject());
4559 string qname = d->get_qualified_name();
4560 string_var_diff_sptr_map::const_iterator it =
4561 subtype_changed_dm_.find(qname);
4563 if (it == subtype_changed_dm_.end())
4564 return decl_base_sptr();
4565 return it->second->second_var();
4583 string qname = d->get_qualified_name();
4584 string_diff_sptr_map::const_iterator it =
4585 changed_member_class_tmpls_.find(qname);
4587 return ((it == changed_member_class_tmpls_.end())
4589 : dynamic_pointer_cast<decl_base>(it->second->second_subject()));
4600 for (string_decl_base_sptr_map::const_iterator i =
4601 deleted_data_members_.begin();
4602 i != deleted_data_members_.end();
4619 for (string_decl_base_sptr_map::const_iterator i =
4620 inserted_data_members_.begin();
4621 i != inserted_data_members_.end();
4641 size_t num_filtered= 0;
4642 for (var_diff_sptrs_type::const_iterator i =
4643 sorted_subtype_changed_dm_.begin();
4644 i != sorted_subtype_changed_dm_.end();
4649 if ((*i)->has_changes()
4650 && !(*i)->has_local_changes_to_be_reported())
4655 if ((*i)->is_filtered_out())
4659 return num_filtered;
4673 size_t num_filtered= 0;
4675 for (unsigned_var_diff_sptr_map::const_iterator i = changed_dm_.begin();
4676 i != changed_dm_.end();
4692 return num_filtered;
4701 #define SKIP_MEM_FN_IF_VIRTUALITY_DISALLOWED \
4703 if (get_member_function_is_virtual(f) \
4704 || get_member_function_is_virtual(s)) \
4706 if (!(allowed_category | VIRTUAL_MEMBER_CHANGE_CATEGORY)) \
4711 if (!(allowed_category | NON_VIRT_MEM_FUN_CHANGE_CATEGORY)) \
4726 diff_category allowed_category = ctxt->get_allowed_category();
4728 for (function_decl_diff_sptrs_type::const_iterator i =
4729 sorted_changed_member_functions_.begin();
4730 i != sorted_changed_member_functions_.end();
4733 method_decl_sptr f =
4734 dynamic_pointer_cast<method_decl>
4735 ((*i)->first_function_decl());
4738 method_decl_sptr s =
4739 dynamic_pointer_cast<method_decl>
4740 ((*i)->second_function_decl());
4746 ctxt->maybe_apply_filters(
diff);
4765 diff_category allowed_category = ctxt->get_allowed_category();
4767 for (string_member_function_sptr_map::const_iterator i =
4768 inserted_member_functions_.begin();
4769 i != inserted_member_functions_.end();
4772 method_decl_sptr f = i->second,
4778 ctxt->maybe_apply_filters(
diff);
4798 diff_category allowed_category = ctxt->get_allowed_category();
4800 for (string_member_function_sptr_map::const_iterator i =
4801 deleted_member_functions_.begin();
4802 i != deleted_member_functions_.end();
4805 method_decl_sptr f = i->second,
4811 ctxt->maybe_apply_filters(
diff);
4828 priv_->deleted_member_types_.clear();
4829 priv_->inserted_member_types_.clear();
4830 priv_->changed_member_types_.clear();
4831 priv_->deleted_data_members_.clear();
4832 priv_->inserted_data_members_.clear();
4833 priv_->subtype_changed_dm_.clear();
4834 priv_->deleted_member_functions_.clear();
4835 priv_->inserted_member_functions_.clear();
4836 priv_->changed_member_functions_.clear();
4837 priv_->deleted_member_class_tmpls_.clear();
4838 priv_->inserted_member_class_tmpls_.clear();
4839 priv_->changed_member_class_tmpls_.clear();
4848 return (priv_->deleted_member_types_.empty()
4849 && priv_->inserted_member_types_.empty()
4850 && priv_->changed_member_types_.empty()
4851 && priv_->deleted_data_members_.empty()
4852 && priv_->inserted_data_members_.empty()
4853 && priv_->subtype_changed_dm_.empty()
4854 && priv_->inserted_member_functions_.empty()
4855 && priv_->deleted_member_functions_.empty()
4856 && priv_->changed_member_functions_.empty()
4857 && priv_->deleted_member_class_tmpls_.empty()
4858 && priv_->inserted_member_class_tmpls_.empty()
4859 && priv_->changed_member_class_tmpls_.empty());
4870 for (vector<deletion>::const_iterator it = e.deletions().begin();
4871 it != e.deletions().end();
4874 unsigned i = it->index();
4878 if (record_type && record_type->get_is_declaration_only())
4880 string name = d->get_name();
4881 priv_->deleted_member_types_[name] = d;
4884 for (vector<insertion>::const_iterator it = e.insertions().begin();
4885 it != e.insertions().end();
4888 for (vector<unsigned>::const_iterator iit =
4889 it->inserted_indexes().begin();
4890 iit != it->inserted_indexes().end();
4897 if (record_type && record_type->get_is_declaration_only())
4899 string name = d->get_name();
4900 string_decl_base_sptr_map::const_iterator j =
4901 priv_->deleted_member_types_.find(name);
4902 if (j != priv_->deleted_member_types_.end())
4904 if (*j->second != *d)
4905 priv_->changed_member_types_[name] =
4908 priv_->deleted_member_types_.erase(j);
4911 priv_->inserted_member_types_[name] = d;
4919 for (vector<deletion>::const_iterator it = e.deletions().begin();
4920 it != e.deletions().end();
4923 unsigned i = it->index();
4926 string name = data_member->get_anon_dm_reliable_name();
4928 ABG_ASSERT(priv_->deleted_data_members_.find(name)
4929 == priv_->deleted_data_members_.end());
4930 priv_->deleted_data_members_[name] = data_member;
4933 for (vector<insertion>::const_iterator it = e.insertions().begin();
4934 it != e.insertions().end();
4937 for (vector<unsigned>::const_iterator iit =
4938 it->inserted_indexes().begin();
4939 iit != it->inserted_indexes().end();
4946 string name = added_dm->get_anon_dm_reliable_name();
4947 ABG_ASSERT(priv_->inserted_data_members_.find(name)
4948 == priv_->inserted_data_members_.end());
4950 bool ignore_added_anonymous_data_member =
false;
4988 bool added_anon_dm_changes_dm =
false;
4991 vector<var_decl_sptr> dms_replaced_by_anon_dm;
5000 for (string_decl_base_sptr_map::const_iterator it =
5001 priv_->deleted_data_members_.begin();
5002 it != priv_->deleted_data_members_.end();
5011 string deleted_dm_name = it->second->get_name();
5027 size_t replaced_dm_offset =
5029 replacing_dm_offset =
5032 if (replaced_dm_offset != replacing_dm_offset)
5040 added_anon_dm_changes_dm =
true;
5044 if (replaced_dm->get_type()->get_size_in_bits()
5045 == replaced_dm->get_type()->get_size_in_bits())
5046 dms_replaced_by_anon_dm.push_back(replaced_dm);
5049 added_anon_dm_changes_dm =
true;
5058 if (!added_anon_dm_changes_dm
5059 && !dms_replaced_by_anon_dm.empty())
5062 type_base_sptr added_dm_type = added_dm->get_type();
5078 ignore_added_anonymous_data_member =
true;
5079 for (vector<var_decl_sptr>::const_iterator i =
5080 dms_replaced_by_anon_dm.begin();
5081 i != dms_replaced_by_anon_dm.end();
5084 string n = (*i)->get_name();
5085 priv_->dms_replaced_by_adms_[n] =
5087 priv_->deleted_data_members_.erase(n);
5093 if (!ignore_added_anonymous_data_member)
5106 string_decl_base_sptr_map::const_iterator j =
5107 priv_->deleted_data_members_.find(name);
5108 if (j != priv_->deleted_data_members_.end())
5110 if (*j->second != *d)
5113 priv_->subtype_changed_dm_[name]=
5116 priv_->deleted_data_members_.erase(j);
5119 priv_->inserted_data_members_[name] = d;
5127 for (string_decl_base_sptr_map::const_iterator i =
5128 priv_->deleted_data_members_.begin();
5129 i != priv_->deleted_data_members_.end();
5133 priv_->deleted_dm_by_offset_[offset] = i->second;
5136 for (string_decl_base_sptr_map::const_iterator i =
5137 priv_->inserted_data_members_.begin();
5138 i != priv_->inserted_data_members_.end();
5142 priv_->inserted_dm_by_offset_[offset] = i->second;
5145 for (unsigned_decl_base_sptr_map::const_iterator i =
5146 priv_->inserted_dm_by_offset_.begin();
5147 i != priv_->inserted_dm_by_offset_.end();
5150 unsigned_decl_base_sptr_map::const_iterator j =
5151 priv_->deleted_dm_by_offset_.find(i->first);
5152 if (j != priv_->deleted_dm_by_offset_.end())
5156 priv_->changed_dm_[i->first] =
5161 for (unsigned_var_diff_sptr_map::const_iterator i =
5162 priv_->changed_dm_.begin();
5163 i != priv_->changed_dm_.end();
5166 priv_->deleted_dm_by_offset_.erase(i->first);
5167 priv_->inserted_dm_by_offset_.erase(i->first);
5168 priv_->deleted_data_members_.erase
5169 (i->second->first_var()->get_anon_dm_reliable_name());
5170 priv_->inserted_data_members_.erase
5171 (i->second->second_var()->get_anon_dm_reliable_name());
5175 priv_->sorted_subtype_changed_dm_);
5177 priv_->sorted_changed_dm_);
5180 edit_script& e = priv_->member_class_tmpls_changes_;
5182 for (vector<deletion>::const_iterator it = e.deletions().begin();
5183 it != e.deletions().end();
5186 unsigned i = it->index();
5190 string name = d->get_name();
5191 ABG_ASSERT(priv_->deleted_member_class_tmpls_.find(name)
5192 == priv_->deleted_member_class_tmpls_.end());
5193 priv_->deleted_member_class_tmpls_[name] = d;
5196 for (vector<insertion>::const_iterator it = e.insertions().begin();
5197 it != e.insertions().end();
5200 for (vector<unsigned>::const_iterator iit =
5201 it->inserted_indexes().begin();
5202 iit != it->inserted_indexes().end();
5209 string name = d->get_name();
5210 ABG_ASSERT(priv_->inserted_member_class_tmpls_.find(name)
5211 == priv_->inserted_member_class_tmpls_.end());
5212 string_decl_base_sptr_map::const_iterator j =
5213 priv_->deleted_member_class_tmpls_.find(name);
5214 if (j != priv_->deleted_member_class_tmpls_.end())
5216 if (*j->second != *d)
5217 priv_->changed_member_types_[name]=
5219 priv_->deleted_member_class_tmpls_.erase(j);
5222 priv_->inserted_member_class_tmpls_[name] = d;
5227 priv_->sorted_changed_member_types_);
5236 priv_.reset(
new priv);
5247 class_or_union_sptr second_scope,
5265 const class_or_union_diff::priv_ptr&
5278 return canonical->priv_;
5300 {
return get_priv()->member_types_changes_;}
5306 {
return get_priv()->member_types_changes_;}
5312 {
return get_priv()->data_members_changes_;}
5318 {
return get_priv()->data_members_changes_;}
5325 {
return get_priv()->inserted_data_members_;}
5332 {
return get_priv()->deleted_data_members_;}
5338 {
return get_priv()->member_fns_changes_;}
5347 {
return get_priv()->sorted_changed_member_functions_;}
5353 {
return get_priv()->member_fns_changes_;}
5358 {
return get_priv()->deleted_member_functions_;}
5363 {
return get_priv()->inserted_member_functions_;}
5371 {
return get_priv()->sorted_changed_dm_;}
5379 {
return get_priv()->count_filtered_changed_dm(local);}
5386 {
return get_priv()->sorted_subtype_changed_dm_;}
5393 {
return get_priv()->count_filtered_subtype_changed_dm(local);}
5405 {
return get_priv()->dms_replaced_by_adms_;}
5417 if (priv_->dms_replaced_by_adms_ordered_.empty())
5419 for (string_decl_base_sptr_map::const_iterator it =
5420 priv_->dms_replaced_by_adms_.begin();
5421 it != priv_->dms_replaced_by_adms_.end();
5428 priv_->dms_replaced_by_adms_ordered_.push_back(changed_dm);
5433 return priv_->dms_replaced_by_adms_ordered_;
5440 {
return get_priv()->member_fn_tmpls_changes_;}
5446 {
return get_priv()->member_fn_tmpls_changes_;}
5452 {
return get_priv()->member_class_tmpls_changes_;}
5458 {
return get_priv()->member_class_tmpls_changes_;}
5474 return ir::NO_CHANGE_KIND;
5487 context()->get_reporter()->report(*
this, out, indent);
5499 for (var_diff_sptrs_type::const_iterator i =
5500 get_priv()->sorted_subtype_changed_dm_.begin();
5501 i !=
get_priv()->sorted_subtype_changed_dm_.end();
5506 for (var_diff_sptrs_type::const_iterator i =
5507 get_priv()->sorted_changed_dm_.begin();
5508 i !=
get_priv()->sorted_changed_dm_.end();
5514 for (diff_sptrs_type::const_iterator i =
5515 get_priv()->sorted_changed_member_types_.begin();
5516 i !=
get_priv()->sorted_changed_member_types_.end();
5522 for (function_decl_diff_sptrs_type::const_iterator i =
5523 get_priv()->sorted_changed_member_functions_.begin();
5524 i !=
get_priv()->sorted_changed_member_functions_.end();
5539 class_diff::clear_lookup_tables(
void)
5541 priv_->deleted_bases_.clear();
5542 priv_->inserted_bases_.clear();
5543 priv_->changed_bases_.clear();
5550 class_diff::lookup_tables_empty(
void)
const
5552 return (priv_->deleted_bases_.empty()
5553 && priv_->inserted_bases_.empty()
5554 && priv_->changed_bases_.empty());
5564 static string_member_function_sptr_map::const_iterator
5567 for (string_member_function_sptr_map::const_iterator i = map.begin();
5581 class_diff::ensure_lookup_tables_populated(
void)
const
5585 if (!lookup_tables_empty())
5589 edit_script& e = get_priv()->base_changes_;
5591 for (vector<deletion>::const_iterator it = e.deletions().begin();
5592 it != e.deletions().end();
5595 unsigned i = it->index();
5598 string name = b->get_base_class()->get_qualified_name();
5599 ABG_ASSERT(get_priv()->deleted_bases_.find(name)
5600 == get_priv()->deleted_bases_.end());
5601 get_priv()->deleted_bases_[name] = b;
5604 for (vector<insertion>::const_iterator it = e.insertions().begin();
5605 it != e.insertions().end();
5608 for (vector<unsigned>::const_iterator iit =
5609 it->inserted_indexes().begin();
5610 iit != it->inserted_indexes().end();
5616 string name = b->get_base_class()->get_qualified_name();
5617 ABG_ASSERT(get_priv()->inserted_bases_.find(name)
5618 == get_priv()->inserted_bases_.end());
5619 string_base_sptr_map::const_iterator j =
5620 get_priv()->deleted_bases_.find(name);
5621 if (j != get_priv()->deleted_bases_.end())
5624 get_priv()->changed_bases_[name] =
5630 get_priv()->moved_bases_.push_back(b);
5631 get_priv()->deleted_bases_.erase(j);
5634 get_priv()->inserted_bases_[name] = b;
5640 get_priv()->sorted_deleted_bases_);
5642 get_priv()->sorted_inserted_bases_);
5644 get_priv()->sorted_changed_bases_);
5649 edit_script& e = p->member_fns_changes_;
5651 for (vector<deletion>::const_iterator it = e.deletions().begin();
5652 it != e.deletions().end();
5655 unsigned i = it->index();
5656 method_decl_sptr mem_fn =
5658 string name = mem_fn->get_linkage_name();
5660 name = mem_fn->get_pretty_representation();
5662 if (p->deleted_member_functions_.find(name)
5663 != p->deleted_member_functions_.end())
5665 p->deleted_member_functions_[name] = mem_fn;
5668 for (vector<insertion>::const_iterator it = e.insertions().begin();
5669 it != e.insertions().end();
5672 for (vector<unsigned>::const_iterator iit =
5673 it->inserted_indexes().begin();
5674 iit != it->inserted_indexes().end();
5679 method_decl_sptr mem_fn =
5681 string name = mem_fn->get_linkage_name();
5683 name = mem_fn->get_pretty_representation();
5685 if (p->inserted_member_functions_.find(name)
5686 != p->inserted_member_functions_.end())
5688 string_member_function_sptr_map::const_iterator j =
5689 p->deleted_member_functions_.find(name);
5691 if (j != p->deleted_member_functions_.end())
5693 if (*j->second != *mem_fn)
5694 p->changed_member_functions_[name] =
5695 compute_diff(static_pointer_cast<function_decl>(j->second),
5696 static_pointer_cast<function_decl>(mem_fn),
5698 p->deleted_member_functions_.erase(j);
5701 p->inserted_member_functions_[name] = mem_fn;
5748 vector<string> to_delete;
5749 corpus_sptr f =
context()->get_first_corpus(),
5750 s =
context()->get_second_corpus();
5752 for (string_member_function_sptr_map::const_iterator i =
5771 find_virtual_dtor_in_map(p->inserted_member_functions_);
5772 if (it != p->inserted_member_functions_.end())
5780 (!i->second->get_linkage_name().empty())
5781 ? i->second->get_linkage_name()
5782 : i->second->get_pretty_representation();
5783 to_delete.push_back(name);
5784 p->inserted_member_functions_.erase(it);
5791 if (!i->second->get_symbol()
5792 || s->lookup_function_symbol(*i->second->get_symbol()))
5793 to_delete.push_back(i->first);
5797 for (vector<string>::const_iterator i = to_delete.begin();
5798 i != to_delete.end();
5800 p->deleted_member_functions_.erase(*i);
5805 for (string_member_function_sptr_map::const_iterator i =
5814 if (!i->second->get_symbol()
5815 || f->lookup_function_symbol(*i->second->get_symbol()))
5816 to_delete.push_back(i->first);
5819 for (vector<string>::const_iterator i = to_delete.begin();
5820 i != to_delete.end();
5822 p->inserted_member_functions_.erase(*i);
5825 p->sorted_deleted_member_functions_);
5828 p->sorted_inserted_member_functions_);
5831 (p->changed_member_functions_,
5832 p->sorted_changed_member_functions_);
5839 class_diff::allocate_priv_data()
5843 priv_.reset(
new priv);
5856 string qname = d->get_base_class()->get_qualified_name();
5857 string_base_diff_sptr_map::const_iterator it =
5858 changed_bases_.find(qname);
5860 return (it == changed_bases_.end())
5862 : it->second->second_base();
5873 size_t num_filtered = 0;
5874 for (base_diff_sptrs_type::const_iterator i = sorted_changed_bases_.begin();
5875 i != sorted_changed_bases_.end();
5882 return num_filtered;
5896 for (base_diff_sptrs_type::const_iterator i =
5897 get_priv()->sorted_changed_bases_.begin();
5898 i != get_priv()->sorted_changed_bases_.end();
5923 class_diff::~class_diff()
5937 const class_diff::priv_ptr&
5938 class_diff::get_priv()
const
5950 return canonical->priv_;
5958 if (diff::priv_->pretty_representation_.empty())
5960 std::ostringstream o;
5966 diff::priv_->pretty_representation_ = o.str();
5968 return diff::priv_->pretty_representation_;
5987 return ir::NO_CHANGE_KIND;
5991 shared_ptr<class_decl>
5998 shared_ptr<class_decl>
6005 {
return get_priv()->base_changes_;}
6013 {
return get_priv()->deleted_bases_;}
6021 {
return get_priv()->inserted_bases_;}
6028 {
return get_priv()->sorted_changed_bases_;}
6036 const vector<class_decl::base_spec_sptr>&
6038 {
return get_priv()->moved_bases_;}
6043 {
return get_priv()->base_changes_;}
6054 context()->get_reporter()->report(*
this, out, indent);
6079 ctxt->initialize_canonical_diff(changes);
6082 if (!ctxt->get_canonical_diff_for(first, second))
6086 diff_sptr canonical_diff = ctxt->get_canonical_diff_for(changes);
6088 ctxt->set_canonical_diff_for(first, second, canonical_diff);
6104 if (
is_class_diff(changes->get_canonical_diff()) == changes.get())
6107 changes->allocate_priv_data();
6119 f->get_base_specifiers().end(),
6120 s->get_base_specifiers().begin(),
6121 s->get_base_specifiers().end(),
6122 changes->base_changes());
6128 f->get_member_types().end(),
6129 s->get_member_types().begin(),
6130 s->get_member_types().end(),
6131 changes->member_types_changes());
6136 f->get_non_static_data_members().end(),
6137 s->get_non_static_data_members().begin(),
6138 s->get_non_static_data_members().end(),
6139 changes->data_members_changes());
6143 f->get_virtual_mem_fns().end(),
6144 s->get_virtual_mem_fns().begin(),
6145 s->get_virtual_mem_fns().end(),
6146 changes->member_fns_changes());
6149 compute_diff(f->get_member_function_templates().begin(),
6150 f->get_member_function_templates().end(),
6151 s->get_member_function_templates().begin(),
6152 s->get_member_function_templates().end(),
6153 changes->member_fn_tmpls_changes());