libabigail
abg-comparison-priv.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2// -*- Mode: C++ -*-
3//
4// Copyright (C) 2017-2024 Red Hat, Inc.
5//
6// Author: Dodji Seketeli
7
8/// @file
9///
10/// The private data and functions of the @ref abigail::ir::comparison types.
11///
12/// Interfaces declared/defined in this file are to be used by parts
13/// of libabigail but *NOT* by clients of libabigail.
14///
15
16#ifndef __ABG_COMPARISON_PRIV_H__
17#define __ABG_COMPARISON_PRIV_H__
18
19#include "abg-internal.h"
20// <headers defining libabigail's API go under here>
21#include <memory>
22#include <unordered_set>
23ABG_BEGIN_EXPORT_DECLARATIONS
24
25#include "abg-hash.h"
26#include "abg-suppression.h"
27#include "abg-comparison.h"
28#include "abg-comp-filter.h"
29#include "abg-sptr-utils.h"
30#include "abg-tools-utils.h"
31
32ABG_END_EXPORT_DECLARATIONS
33// </headers defining libabigail's API>
34
35namespace abigail
36{
37
38namespace comparison
39{
40
41using std::unordered_set;
42using namespace abigail::suppr;
43
44// Inject types from outside in here.
45using std::vector;
46using std::dynamic_pointer_cast;
47using std::static_pointer_cast;
49
50/// Convenience typedef for a pair of decls or types.
51typedef std::pair<const type_or_decl_base_sptr,
53
54/// A hashing functor for @ref types_or_decls_type.
56{
57 size_t
58 operator()(const types_or_decls_type& d) const
59 {
60 size_t h1 = hash_type_or_decl(d.first);
61 size_t h2 = hash_type_or_decl(d.second);
62 return *hashing::combine_hashes(hash_t(h1), hash_t(h2));
63 }
64};
65
66/// An equality functor for @ref types_or_decls_type.
68{
69 bool
70 operator()(const types_or_decls_type &d1, const types_or_decls_type &d2) const
71 {return d1.first == d2.first && d1.second == d2.second;}
72};
73
74/// A convenience typedef for a map of @ref types_or_decls_type and
75/// diff_sptr.
76typedef unordered_map<types_or_decls_type, diff_sptr,
79
80/// A hashing functor for using @ref diff_sptr and @ref diff* in a
81/// hash map or set.
83{
84 /// The function-call operator to hash a @ref diff node.
85 ///
86 /// @param d the @ref diff node to hash.
87 ///
88 /// @return the hash value of @p d.
89 size_t
90 operator()(const diff_sptr& d) const
91 {return operator()(*d);}
92
93 /// The function-call operator to hash a @ref diff node.
94 ///
95 /// @param d the @ref diff node to hash.
96 ///
97 /// @return the hash value of @p d.
98 size_t
99 operator()(const diff *d) const
100 {return operator()(*d);}
101
102 /// The function-call operator to hash a @ref diff node.
103 ///
104 /// @param d the @ref diff node to hash.
105 ///
106 /// @return the hash value of @p d.
107 size_t
108 operator()(const diff& d) const
109 {
110 diff* canonical_diff = d.get_canonical_diff();
111 ABG_ASSERT(canonical_diff);
112 return reinterpret_cast<size_t>(canonical_diff);
113 }
114}; // end struct diff_hash
115
116/// A comparison functor for using @ref diff_sptr and @ref diff* in a
117/// hash map or set.
119{
120 /// The function-call operator to compare two @ref diff nodes.
121 ///
122 /// @param d1 the first diff node involved in the comparison.
123 ///
124 /// @param d2 the second diff node involved in the comparison.
125 ///
126 /// @return true iff @p d1 equals @p d2.
127 bool
128 operator()(const diff* d1, const diff* d2) const
129 {return operator()(*d1, *d2);}
130
131 /// The function-call operator to compare two @ref diff nodes.
132 ///
133 /// @param d1 the first diff node involved in the comparison.
134 ///
135 /// @param d2 the second diff node involved in the comparison.
136 ///
137 /// @return true iff @p d1 equals @p d2.
138 bool
139 operator()(const diff_sptr& d1, const diff_sptr& d2) const
140 {return operator()(*d1, *d2);}
141
142 /// The function-call operator to compare two @ref diff nodes.
143 ///
144 /// @param d1 the first diff node involved in the comparison.
145 ///
146 /// @param d2 the second diff node involved in the comparison.
147 ///
148 /// @return true iff @p d1 equals @p d2.
149 bool
150 operator()(const diff& d1, const diff& d2) const
151 {
152 diff* canonical_diff1 = d1.get_canonical_diff();
153 ABG_ASSERT(canonical_diff1);
154
155 diff *canonical_diff2 = d2.get_canonical_diff();
156 ABG_ASSERT(canonical_diff2);
157
158 return canonical_diff1 == canonical_diff2;
159 }
160}; // end struct diff_equal
161
162/// A convenience typedef for an unordered_map which key is a @ref
163/// diff* and which value is a @ref artifact_sptr_set_type.
164typedef unordered_map<const diff*, artifact_sptr_set_type,
167
168/// The private member (pimpl) for @ref diff_context.
170{
171 diff_category allowed_category_;
172 reporter_base_sptr reporter_;
173 types_or_decls_diff_map_type types_or_decls_diff_map;
174 unordered_diff_sptr_set live_diffs_;
175 vector<diff_sptr> canonical_diffs;
176 vector<filtering::filter_base_sptr> filters_;
177 // All the suppressions specifications are stored in this data
178 // member.
179 suppressions_type suppressions_;
180 // The negated suppressions specifications that are in
181 // suppressions_ are stored here. Each time suppressions_ is
182 // modified, this data member should be cleared.
183 suppressions_type negated_suppressions_;
184 // The non-negated suppressions specifications that are in
185 // suppressions_ are stored here. Each time suppressions_ is
186 // modified, this data member should be cleared.
187 suppressions_type direct_suppressions_;
188 pointer_map visited_diff_nodes_;
189 corpus_diff_sptr corpus_diff_;
190 ostream* default_output_stream_;
191 ostream* error_output_stream_;
192 bool perform_change_categorization_;
193 bool leaf_changes_only_;
194 bool forbid_visiting_a_node_twice_;
195 bool reset_visited_diffs_for_each_interface_;
196 bool hex_values_;
197 bool show_offsets_sizes_in_bits_;
198 bool show_relative_offset_changes_;
199 bool show_stats_only_;
200 bool show_soname_change_;
201 bool show_architecture_change_;
202 bool show_deleted_fns_;
203 bool show_changed_fns_;
204 bool show_added_fns_;
205 bool show_deleted_vars_;
206 bool show_changed_vars_;
207 bool show_added_vars_;
208 bool show_linkage_names_;
209 bool show_locs_;
210 bool show_redundant_changes_;
211 bool show_syms_unreferenced_by_di_;
212 bool show_added_syms_unreferenced_by_di_;
213 bool show_unreachable_types_;
214 bool show_impacted_interfaces_;
215 bool dump_diff_tree_;
216 bool do_log_;
217
218 priv()
219 : allowed_category_(EVERYTHING_CATEGORY),
220 reporter_(),
221 default_output_stream_(),
222 error_output_stream_(),
223 perform_change_categorization_(true),
224 leaf_changes_only_(),
225 forbid_visiting_a_node_twice_(true),
226 reset_visited_diffs_for_each_interface_(),
227 hex_values_(),
228 show_offsets_sizes_in_bits_(true),
229 show_relative_offset_changes_(true),
230 show_stats_only_(false),
231 show_soname_change_(true),
232 show_architecture_change_(true),
233 show_deleted_fns_(true),
234 show_changed_fns_(true),
235 show_added_fns_(true),
236 show_deleted_vars_(true),
237 show_changed_vars_(true),
238 show_added_vars_(true),
239 show_linkage_names_(false),
240 show_locs_(true),
241 show_redundant_changes_(true),
242 show_syms_unreferenced_by_di_(true),
243 show_added_syms_unreferenced_by_di_(true),
244 show_unreachable_types_(false),
245 show_impacted_interfaces_(true),
246 dump_diff_tree_(),
247 do_log_()
248 {}
249};// end struct diff_context::priv
250
252{
253public:
254 friend class type_diff_base;
255}; // end class type_diff_base
256
257/// Private data for the @ref diff type. The details of generic view
258/// of the diff node are expressed here.
260{
261 bool finished_;
262 bool traversing_;
263 type_or_decl_base_sptr first_subject_;
264 type_or_decl_base_sptr second_subject_;
265 vector<diff*> children_;
266 diff* parent_;
267 diff* parent_interface_;
268 diff* canonical_diff_;
269 diff_context_wptr ctxt_;
270 diff_category local_category_;
271 diff_category category_;
272 mutable bool reported_once_;
273 mutable bool currently_reporting_;
274 mutable string pretty_representation_;
275
276 priv();
277
278public:
279
283 diff_category category,
284 bool reported_once,
286 : finished_(),
287 traversing_(),
288 first_subject_(first_subject),
289 second_subject_(second_subject),
290 parent_(),
291 parent_interface_(),
292 canonical_diff_(),
293 ctxt_(ctxt),
294 local_category_(category),
295 category_(category),
296 reported_once_(reported_once),
297 currently_reporting_(currently_reporting)
298 {}
299
300 /// Getter of the diff context associated with this diff.
301 ///
302 /// @returnt a smart pointer to the diff context.
305 {return ctxt_.lock();}
306
307 /// Check if a given categorization of a diff node should make it be
308 /// filtered out.
309 ///
310 /// @param category the categorization to take into account.
311 bool
313 {
315 if (!ctxt)
316 return false;
317
318 if (ctxt->get_allowed_category() == EVERYTHING_CATEGORY)
319 return false;
320
321 // If this node is on the path of a node that *must* be reported,
322 // then do not filter it.
326 return false;
327
328 /// We don't want to display nodes suppressed by a user-provided
329 /// suppression specification or by a "private type" suppression
330 /// specification.
332 return true;
333
334 // We don't want to display redundant diff nodes, when the user
335 // asked to avoid seeing redundant diff nodes.
336 if (!ctxt->show_redundant_changes()
337 && (category & REDUNDANT_CATEGORY))
338 return true;
339
340 if (category == NO_CHANGE_CATEGORY)
341 return false;
342
343 // Ignore the REDUNDANT_CATEGORY bit when comparing allowed
344 // categories and the current set of categories.
345 return !((category & ~REDUNDANT_CATEGORY)
346 & (ctxt->get_allowed_category()
347 & ~REDUNDANT_CATEGORY));
348 }
349};// end class diff::priv
350
351/// A functor to compare two instances of @ref diff_sptr.
353{
354 /// An operator that takes two instances of @ref diff_sptr returns
355 /// true if its first operand compares less than its second operand.
356 ///
357 /// @param l the first operand to consider.
358 ///
359 /// @param r the second operand to consider.
360 ///
361 /// @return true if @p l compares less than @p r.
362 bool
363 operator()(const diff* l, const diff* r) const
364 {
365 if (!l || !r || !l->first_subject() || !r->first_subject())
366 return false;
367
368 string l_qn = get_name(l->first_subject());
369 string r_qn = get_name(r->first_subject());
370
371 return l_qn < r_qn;
372 }
373
374 /// An operator that takes two instances of @ref diff_sptr returns
375 /// true if its first operand compares less than its second operand.
376 ///
377 /// @param l the first operand to consider.
378 ///
379 /// @param r the second operand to consider.
380 ///
381 /// @return true if @p l compares less than @p r.
382 bool
383 operator()(const diff_sptr& l, const diff_sptr& r) const
384 {return operator()(l.get(), r.get());}
385}; // end struct diff_less_than_functor
386
388{
389public:
390 friend class decl_diff_base;
391};//end class priv
392
393/// The private data structure for @ref distinct_diff.
395{
396 diff_sptr compatible_child_diff;
397};// end struct distinct_diff
398
399/// The internal type for the impl idiom implementation of @ref
400/// var_diff.
402{
403 diff_wptr type_diff_;
404};//end struct var_diff
405
406/// The internal type for the impl idiom implementation of @ref
407/// pointer_diff.
409{
410 diff_sptr underlying_type_diff_;
411
412 priv(diff_sptr ud)
413 : underlying_type_diff_(ud)
414 {}
415};//end struct pointer_diff::priv
416
417/// The internal type for the impl idiom implementation of @ref
418/// subrange_diff.
420{
421 diff_sptr underlying_type_diff_;
422
423 priv(diff_sptr u)
424 : underlying_type_diff_(u)
425 {}
426}; // end struct subrange_diff::priv
427
429{
430 /// The diff between the two array element types.
432 vector<subrange_diff_sptr> subrange_diffs_;
433
435 vector<subrange_diff_sptr>& subrange_diffs)
437 subrange_diffs_(subrange_diffs)
438 {}
439};//end struct array_diff::priv
440
442{
443 diff_sptr underlying_type_diff_;
444 priv(diff_sptr underlying)
445 : underlying_type_diff_(underlying)
446 {}
447};//end struct reference_diff::priv
448
449/// The private data of the @ref ptr_to_mbr_diff type.
451{
452 diff_sptr member_type_diff_;
453 diff_sptr containing_type_diff_;
454
457 : member_type_diff_(member_type_diff),
458 containing_type_diff_(containing_type_diff)
459 {}
460};//end ptr_to_mbr_diff::priv
461
463{
464 diff_sptr underlying_type_diff;
465 mutable diff_sptr leaf_underlying_type_diff;
466
467 priv(diff_sptr underlying)
468 : underlying_type_diff(underlying)
469 {}
470};// end struct qualified_type_diff::priv
471
473{
474 diff_sptr underlying_type_diff_;
475 edit_script enumerators_changes_;
476 string_enumerator_map deleted_enumerators_;
477 string_enumerator_map inserted_enumerators_;
478 string_changed_enumerator_map changed_enumerators_;
479
480 priv(diff_sptr underlying)
481 : underlying_type_diff_(underlying)
482 {}
483};//end struct enum_diff::priv
484
485/// A functor to compare two enumerators based on their value. This
486/// implements the "less than" operator.
488{
489 bool
490 operator()(const enum_type_decl::enumerator& f,
491 const enum_type_decl::enumerator& s) const
492 {return f.get_value() < s.get_value();}
493};//end struct enumerator_value_comp
494
495/// A functor to compare two changed enumerators, based on their
496/// initial value.
498{
499 bool
500 operator()(const changed_enumerator& f,
501 const changed_enumerator& s) const
502 {return f.first.get_value() < s.first.get_value();}
503};// end struct changed_enumerator_comp.
504
505/// The type of private data of @ref class_or_union_diff.
507{
508 edit_script member_types_changes_;
509 edit_script data_members_changes_;
510 edit_script member_fns_changes_;
511 edit_script member_fn_tmpls_changes_;
512 edit_script member_class_tmpls_changes_;
513
514 string_decl_base_sptr_map deleted_member_types_;
515 string_decl_base_sptr_map inserted_member_types_;
516 string_diff_sptr_map changed_member_types_;
517 diff_sptrs_type sorted_changed_member_types_;
518 string_decl_base_sptr_map deleted_data_members_;
519 unsigned_decl_base_sptr_map deleted_dm_by_offset_;
520 string_decl_base_sptr_map inserted_data_members_;
521 unsigned_decl_base_sptr_map inserted_dm_by_offset_;
522 // This map contains the data member which sub-type changed.
523 string_var_diff_sptr_map subtype_changed_dm_;
524 var_diff_sptrs_type sorted_subtype_changed_dm_;
525 // This one contains the list of data members changes that can be
526 // represented as a data member foo that got removed from offset N,
527 // and a data member bar that got inserted at offset N; IOW, this
528 // can be translated as data member foo that got changed into data
529 // member bar at offset N.
530 unsigned_var_diff_sptr_map changed_dm_;
531 var_diff_sptrs_type sorted_changed_dm_;
532
533 // This is a data structure to represent data members that have been
534 // replaced by anonymous data members. It's a map that associates
535 // the name of the data member to the anonymous data member that
536 // replaced it.
537 string_decl_base_sptr_map dms_replaced_by_adms_;
538 mutable changed_var_sptrs_type dms_replaced_by_adms_ordered_;
539 string_member_function_sptr_map deleted_member_functions_;
540 class_or_union::member_functions sorted_deleted_member_functions_;
541 string_member_function_sptr_map inserted_member_functions_;
542 class_or_union::member_functions sorted_inserted_member_functions_;
543 string_function_decl_diff_sptr_map changed_member_functions_;
544 function_decl_diff_sptrs_type sorted_changed_member_functions_;
545 string_decl_base_sptr_map deleted_member_class_tmpls_;
546 string_decl_base_sptr_map inserted_member_class_tmpls_;
547 string_diff_sptr_map changed_member_class_tmpls_;
548 diff_sptrs_type sorted_changed_member_class_tmpls_;
549
551 member_type_has_changed(decl_base_sptr) const;
552
553 decl_base_sptr
554 subtype_changed_dm(decl_base_sptr) const;
555
556 decl_base_sptr
557 member_class_tmpl_has_changed(decl_base_sptr) const;
558
559 size_t
561
562 size_t
564
565 size_t
566 count_filtered_subtype_changed_dm(bool local_only = false);
567
568 size_t
569 count_filtered_changed_dm(bool local_only = false);
570
571 size_t
573
574 size_t
576
577 size_t
579
580 priv()
581 {}
582}; // end struct class_or_union_diff::priv
583
584/// A comparison functor to compare two data members based on their
585/// offset.
587{
588
589 /// Compare two data members.
590 ///
591 /// First look at their offset and then their name.
592 ///
593 /// @parm first_dm the first data member to consider.
594 ///
595 /// @param second_dm the second data member to consider.
596 bool
598 const var_decl_sptr& second_dm) const
599 {
600 ABG_ASSERT(first_dm);
601 ABG_ASSERT(second_dm);
602
603 size_t first_offset = get_data_member_offset(first_dm);
604 size_t second_offset = get_data_member_offset(second_dm);
605
606 // The data member at the smallest offset comes first.
607 if (first_offset != second_offset)
608 return first_offset < second_offset;
609
610 string first_dm_name = first_dm->get_name();
611 string second_dm_name = second_dm->get_name();
612
613 // But in case the two data members are at the same offset, then
614 // sort them lexicographically.
615 return first_dm_name < second_dm_name;
616 }
617
618 /// Compare two data members.
619 ///
620 /// First look at their offset and then their name.
621 ///
622 /// @parm first_dm the first data member to consider.
623 ///
624 /// @param second_dm the second data member to consider.
625 bool
626 operator()(const decl_base_sptr& f,
627 const decl_base_sptr& s) const
628 {
629 var_decl_sptr first_dm = is_data_member(f);
630 var_decl_sptr second_dm = is_data_member(s);
631
632 return compare_data_members(first_dm, second_dm);
633 }
634
635 /// Compare two data members.
636 ///
637 /// First look at their offset and then their name.
638 ///
639 /// @parm first_dm the first data member to consider.
640 ///
641 /// @param second_dm the second data member to consider.
642 bool
644 const changed_var_sptr& s) const
645 {
646 var_decl_sptr first_dm = is_data_member(is_decl(f.first));
647 var_decl_sptr second_dm = is_data_member(is_decl(s.first));
648
649 return compare_data_members(first_dm, second_dm);
650 }
651};//end struct data_member_comp
652
653/// The type of the private data (pimpl sub-object) of the @ref
654/// class_diff type.
656{
657 edit_script base_changes_;
658 string_base_sptr_map deleted_bases_;
659 class_decl::base_specs sorted_deleted_bases_;
660 string_base_sptr_map inserted_bases_;
661 class_decl::base_specs sorted_inserted_bases_;
662 string_base_diff_sptr_map changed_bases_;
663 base_diff_sptrs_type sorted_changed_bases_;
664 vector<class_decl::base_spec_sptr> moved_bases_;
665
668
669 size_t
671
672 priv()
673 {}
674};//end struct class_diff::priv
675
676/// A functor to compare instances of @ref class_decl::base_spec.
678{
679 bool
680 operator()(const class_decl::base_spec&l,
681 const class_decl::base_spec&r)
682 {
683 string str1 = l.get_pretty_representation();
684 string str2 = r.get_pretty_representation();
685 return str1 < str2;
686 }
687 bool
688 operator()(const class_decl::base_spec_sptr&l,
690 {return operator()(*l, *r);}
691}; // end base_spec_comp
692
693/// A comparison function for instances of @ref base_diff.
695{
696 bool
697 operator()(const base_diff& l, const base_diff& r) const
698 {
700 if (f->get_offset_in_bits() >= 0
701 && s->get_offset_in_bits() >= 0)
702 return f->get_offset_in_bits() < s->get_offset_in_bits();
703 else
704 return (f->get_base_class()->get_pretty_representation()
705 < s->get_base_class()->get_pretty_representation());
706 }
707
708 bool
709 operator()(const base_diff* l, const base_diff* r) const
710 {return operator()(*l, *r);}
711
712 bool
713 operator()(const base_diff_sptr l, const base_diff_sptr r) const
714 {return operator()(l.get(), r.get());}
715}; // end struct base_diff_comp
716
717/// A comparison functor to compare two instances of @ref var_diff
718/// that represent changed data members based on the offset of the
719/// initial data members, or if equal, based on their qualified name.
720/// If equal again, then the offset and qualified name of the new data
721/// members are considered.
723{
724 /// @param f the first change to data member to take into account
725 ///
726 /// @param s the second change to data member to take into account.
727 ///
728 /// @return true iff f is before s.
729 bool
731 const var_diff_sptr s) const
732 {
733 var_decl_sptr first_dm = f->first_var();
734 var_decl_sptr second_dm = s->first_var();
735
736 ABG_ASSERT(is_data_member(first_dm));
737 ABG_ASSERT(is_data_member(second_dm));
738
739 size_t off1 = get_data_member_offset(first_dm);
740 size_t off2 = get_data_member_offset(second_dm);
741
742 if (off1 != off2)
743 return off1 < off2;
744
745 // The two offsets of the initial data members are the same. So
746 // lets compare the qualified name of these initial data members.
747
748 string name1 = first_dm->get_qualified_name();
749 string name2 = second_dm->get_qualified_name();
750
751 if (name1 != name2)
752 return name1 < name2;
753
754 // The offsets and the qualified names of the initial data members
755 // are the same. Let's now compare the offsets of the *new* data
756 // members.
757
758 first_dm = f->second_var();
759 second_dm = s->second_var();
760
761 ABG_ASSERT(is_data_member(first_dm));
762 ABG_ASSERT(is_data_member(second_dm));
763
764 off1 = get_data_member_offset(first_dm);
765 off2 = get_data_member_offset(second_dm);
766
767 if (off1 != off2)
768 return off1 < off2;
769
770 // The offsets of the new data members are the same, dang! Let's
771 // compare the qualified names of these new data members then.
772
773 name1 = first_dm->get_qualified_name();
774 name2 = second_dm->get_qualified_name();
775
776 return name1 < name2;
777 }
778}; // end struct var_diff_comp
779
780bool
781is_less_than(const function_decl_diff& first, const function_decl_diff& second);
782
783/// A comparison functor for instances of @ref function_decl_diff that
784/// represent changes between two virtual member functions.
786{
787 bool
788 operator()(const function_decl_diff& l,
789 const function_decl_diff& r) const
790 {
793
796 if (l_offset != r_offset)
797 return l_offset < r_offset;
798
799 return is_less_than(l, r);
800 }
801
802 bool
803 operator()(const function_decl_diff* l,
804 const function_decl_diff* r)
805 {return operator()(*l, *r);}
806
807 bool
808 operator()(const function_decl_diff_sptr l,
810 {return operator()(l.get(), r.get());}
811}; // end struct virtual_member_function_diff_comp
812
814{
815 class_diff_sptr underlying_class_diff_;
816
817 priv(class_diff_sptr underlying)
818 : underlying_class_diff_(underlying)
819 {}
820}; // end struct base_diff::priv
821
823{
824 // The edit script built by the function compute_diff.
825 edit_script member_changes_;
826
827 // Below are the useful lookup tables.
828 //
829 // If you add a new lookup table, please update member functions
830 // clear_lookup_tables, lookup_tables_empty and
831 // ensure_lookup_tables_built.
832
833 // The deleted/inserted types/decls. These basically map what is
834 // inside the member_changes_ data member. Note that for instance,
835 // a given type T might be deleted from the first scope and added to
836 // the second scope again; this means that the type was *changed*.
837 string_decl_base_sptr_map deleted_types_;
838 string_decl_base_sptr_map deleted_decls_;
839 string_decl_base_sptr_map inserted_types_;
840 string_decl_base_sptr_map inserted_decls_;
841
842 // The changed types/decls lookup tables.
843 //
844 // These lookup tables are populated from the lookup tables above.
845 //
846 // Note that the value stored in each of these tables is a pair
847 // containing the old decl/type and the new one. That way it is
848 // easy to run a diff between the old decl/type and the new one.
849 //
850 // A changed type/decl is one that has been deleted from the first
851 // scope and that has been inserted into the second scope.
852 string_diff_sptr_map changed_types_;
853 diff_sptrs_type sorted_changed_types_;
854 string_diff_sptr_map changed_decls_;
855 diff_sptrs_type sorted_changed_decls_;
856
857 // The removed types/decls lookup tables.
858 //
859 // A removed type/decl is one that has been deleted from the first
860 // scope and that has *NOT* been inserted into it again.
861 string_decl_base_sptr_map removed_types_;
862 string_decl_base_sptr_map removed_decls_;
863
864 // The added types/decls lookup tables.
865 //
866 // An added type/decl is one that has been inserted to the first
867 // scope but that has not been deleted from it.
868 string_decl_base_sptr_map added_types_;
869 string_decl_base_sptr_map added_decls_;
870};//end struct scope_diff::priv
871
872/// A comparison functor for instances of @ref diff.
874{
875 /// Lexicographically compare two diff nodes.
876 ///
877 /// Compare the pretty representation of the first subjects of two
878 /// diff nodes.
879 ///
880 /// @return true iff @p l is less than @p r.
881 bool
882 operator()(const diff& l, diff& r) const
883 {
885 <
887 }
888
889 /// Lexicographically compare two diff nodes.
890 ///
891 /// Compare the pretty representation of the first subjects of two
892 /// diff nodes.
893 ///
894 /// @return true iff @p l is less than @p r.
895 bool
896 operator()(const diff* l, diff* r) const
897 {return operator()(*l, *r);}
898
899 /// Lexicographically compare two diff nodes.
900 ///
901 /// Compare the pretty representation of the first subjects of two
902 /// diff nodes.
903 ///
904 /// @return true iff @p l is less than @p r.
905 bool
907 {return operator()(l.get(), r.get());}
908}; // end struct diff_comp;
909
911{
912 mutable diff_sptr type_diff;
913}; // end struct fn_parm_diff::priv
914
916{
917 diff_sptr return_type_diff_;
918 edit_script parm_changes_;
919
920 // useful lookup tables.
921 string_parm_map deleted_parms_;
922 vector<function_decl::parameter_sptr> sorted_deleted_parms_;
923 string_parm_map added_parms_;
924 vector<function_decl::parameter_sptr> sorted_added_parms_;
925 // This map contains parameters sub-type changes that don't change
926 // the name of the type of the parameter.
927 string_fn_parm_diff_sptr_map subtype_changed_parms_;
928 vector<fn_parm_diff_sptr> sorted_subtype_changed_parms_;
929 // This map contains parameter type changes that actually change the
930 // name of the type of the parameter, but in a compatible way;
931 // otherwise, the mangling of the function would have changed (in
932 // c++ at least).
933 unsigned_fn_parm_diff_sptr_map changed_parms_by_id_;
934 vector<fn_parm_diff_sptr> sorted_changed_parms_by_id_;
935 unsigned_parm_map deleted_parms_by_id_;
936 unsigned_parm_map added_parms_by_id_;
937
938 priv()
939 {}
940}; // end struct function_type_diff::priv
941
943{
944 function_type_diff_sptr type_diff_;
945
946 priv()
947 {}
948};// end struct function_decl_diff::priv
949
950/// A comparison functor to compare two instances of @ref fn_parm_diff
951/// based on their indexes.
953{
954 /// @param f the first diff
955 ///
956 /// @param s the second diff
957 ///
958 /// @return true if the index of @p f is less than the index of @p
959 /// s.
960 bool
962 {return f.first_parameter()->get_index() < s.first_parameter()->get_index();}
963
964 bool
966 {return operator()(*f, *s);}
967}; // end struct fn_parm_diff_comp
968
969/// Functor that compares two function parameters for the purpose of
970/// sorting them.
972{
973 /// Returns true iff the index of the first parameter is smaller
974 /// than the of the second parameter.
975 ///
976 /// @param l the first parameter to compare.
977 ///
978 /// @param r the second parameter to compare.
979 ///
980 /// @return true iff the index of the first parameter is smaller
981 /// than the of the second parameter.
982 bool
985 {return l.get_index() < r.get_index();}
986
987 /// Returns true iff the index of the first parameter is smaller
988 /// than the of the second parameter.
989 ///
990 /// @param l the first parameter to compare.
991 ///
992 /// @param r the second parameter to compare.
993 ///
994 /// @return true iff the index of the first parameter is smaller
995 /// than the of the second parameter.
996 bool
999 {return operator()(*l, *r);}
1000}; // end struct parm_comp
1001
1002/// A functor to compare instances of @ref var_decl base on their
1003/// qualified names.
1005{
1006 bool
1007 operator() (const var_decl& l, const var_decl& r) const
1008 {
1009 string name1 = l.get_qualified_name(), name2 = r.get_qualified_name();
1010 return name1 < name2;
1011 }
1012
1013 bool
1014 operator() (const var_decl* l, const var_decl* r) const
1015 {return operator()(*l, *r);}
1016
1017 bool
1018 operator() (const var_decl_sptr& l, const var_decl_sptr& r) const
1019 {return operator()(l.get(), r.get());}
1020};// end struct var_comp
1021
1022/// A functor to compare instances of @ref elf_symbol base on their
1023/// names.
1025{
1026 bool
1027 operator()(const elf_symbol& l, const elf_symbol& r)
1028 {
1029 string name1 = l.get_id_string(), name2 = r.get_id_string();
1030 return name1 < name2;
1031 }
1032
1033 bool
1034 operator()(const elf_symbol* l, const elf_symbol* r)
1035 {return operator()(*l, *r);}
1036
1037 bool
1038 operator()(const elf_symbol_sptr& l, const elf_symbol_sptr& r)
1039 {return operator()(l.get(), r.get());}
1040}; //end struct elf_symbol_comp
1041
1043{
1044 diff_sptr underlying_type_diff_;
1045
1047 : underlying_type_diff_(underlying_type_diff)
1048 {}
1049};//end struct typedef_diff::priv
1050
1052{
1053 translation_unit_sptr first_;
1054 translation_unit_sptr second_;
1055
1057 : first_(f), second_(s)
1058 {}
1059};//end struct translation_unit_diff::priv
1060
1062{
1063 bool finished_;
1064 string pretty_representation_;
1065 vector<diff*> children_;
1066 corpus_sptr first_;
1067 corpus_sptr second_;
1068 diff_context_wptr ctxt_;
1069 corpus_diff::diff_stats_sptr diff_stats_;
1070 bool sonames_equal_;
1071 bool architectures_equal_;
1072 edit_script fns_edit_script_;
1073 edit_script vars_edit_script_;
1074 edit_script unrefed_fn_syms_edit_script_;
1075 edit_script unrefed_var_syms_edit_script_;
1076 string_function_ptr_map deleted_fns_;
1077 string_function_ptr_map suppressed_deleted_fns_;
1078 string_function_ptr_map added_fns_;
1079 string_function_ptr_map suppressed_added_fns_;
1080 string_function_decl_diff_sptr_map changed_fns_map_;
1081 function_decl_diff_sptrs_type changed_fns_;
1082 string_var_ptr_map deleted_vars_;
1083 string_var_ptr_map suppressed_deleted_vars_;
1084 string_var_ptr_map added_vars_;
1085 string_var_ptr_map suppressed_added_vars_;
1086 string_var_diff_sptr_map changed_vars_map_;
1087 var_diff_sptrs_type sorted_changed_vars_;
1088 string_elf_symbol_map added_unrefed_fn_syms_;
1089 string_elf_symbol_map suppressed_added_unrefed_fn_syms_;
1090 string_elf_symbol_map deleted_unrefed_fn_syms_;
1091 string_elf_symbol_map suppressed_deleted_unrefed_fn_syms_;
1092 string_elf_symbol_map added_unrefed_var_syms_;
1093 string_elf_symbol_map suppressed_added_unrefed_var_syms_;
1094 string_elf_symbol_map deleted_unrefed_var_syms_;
1095 string_elf_symbol_map suppressed_deleted_unrefed_var_syms_;
1096 edit_script unreachable_types_edit_script_;
1097 string_type_base_sptr_map deleted_unreachable_types_;
1098 vector<type_base_sptr> deleted_unreachable_types_sorted_;
1099 string_type_base_sptr_map suppressed_deleted_unreachable_types_;
1100 string_type_base_sptr_map added_unreachable_types_;
1101 vector<type_base_sptr> added_unreachable_types_sorted_;
1102 string_type_base_sptr_map suppressed_added_unreachable_types_;
1103 string_diff_sptr_map changed_unreachable_types_;
1104 mutable vector<diff_sptr> changed_unreachable_types_sorted_;
1105 diff_maps leaf_diffs_;
1106
1107 /// Default constructor of corpus_diff::priv.
1109 : finished_(false),
1110 sonames_equal_(false),
1111 architectures_equal_(false)
1112 {}
1113
1114 /// Constructor of corpus_diff::priv.
1115 ///
1116 /// @param first the first corpus of this diff.
1117 ///
1118 /// @param second the second corpus of this diff.
1119 ///
1120 /// @param ctxt the context of the diff.
1121 priv(corpus_sptr first,
1122 corpus_sptr second,
1123 diff_context_sptr ctxt)
1124 : finished_(false),
1125 first_(first),
1126 second_(second),
1127 ctxt_(ctxt),
1128 sonames_equal_(false),
1129 architectures_equal_(false)
1130 {}
1131
1133 get_context();
1134
1135 bool
1136 lookup_tables_empty() const;
1137
1138 void
1140
1141 void
1143
1144 void
1146
1147 bool
1149
1150 bool
1152
1153 bool
1155
1156 bool
1158
1159 bool
1161
1162 bool
1164
1165 bool
1167
1168 bool
1170
1171 bool
1173
1174 bool
1176
1177 void count_leaf_changes(size_t &num_changes, size_t &num_filtered);
1178
1179 void count_leaf_type_changes(size_t &num_type_changes,
1180 size_t &num_type_changes_filtered);
1181
1182 void count_unreachable_types(size_t &num_added,
1183 size_t &num_removed,
1184 size_t &num_changed,
1185 size_t &num_filtered_added,
1186 size_t &num_filtered_removed,
1187 size_t &num_filtered_changed);
1188
1191
1192 const vector<diff_sptr>&
1194
1195 void
1197
1198 void
1199 emit_diff_stats(const diff_stats& stats,
1200 ostream& out,
1201 const string& indent);
1202
1203 void
1205
1206 void
1208
1209 void
1211}; // end corpus::priv
1212
1213/// "Less than" functor to compare instances of @ref function_decl.
1215{
1216 /// The actual "less than" operator for instances of @ref
1217 /// function_decl. It returns true if the first @ref function_decl
1218 /// is lest than the second one.
1219 ///
1220 /// @param f the first @ref function_decl to take in account.
1221 ///
1222 /// @param s the second @ref function_decl to take in account.
1223 ///
1224 /// @return true iff @p f is less than @p s.
1225 bool
1228
1229 /// The actual "less than" operator for instances of @ref
1230 /// function_decl. It returns true if the first @ref function_decl
1231 /// is lest than the second one.
1232 ///
1233 /// @param f the first @ref function_decl to take in account.
1234 ///
1235 /// @param s the second @ref function_decl to take in account.
1236 ///
1237 /// @return true iff @p f is less than @p s.
1238 bool
1240 {return operator()(*f, *s);}
1241
1242 /// The actual "less than" operator for instances of @ref
1243 /// function_decl. It returns true if the first @ref function_decl
1244 /// is lest than the second one.
1245 ///
1246 /// @param f the first @ref function_decl to take in account.
1247 ///
1248 /// @param s the second @ref function_decl to take in account.
1249 ///
1250 /// @return true iff @p f is less than @p s.
1251 bool
1253 {return operator()(f.get(), s.get());}
1254}; // end function_comp
1255
1256/// A "Less Than" functor to compare instance of @ref
1257/// function_decl_diff.
1259{
1260 /// The actual less than operator.
1261 ///
1262 /// It returns true if the first @ref function_decl_diff is less
1263 /// than the second one.
1264 ///
1265 /// param first the first @ref function_decl_diff to consider.
1266 ///
1267 /// @param second the second @ref function_decl_diff to consider.
1268 ///
1269 /// @return true iff @p first is less than @p second.
1270 bool
1272 const function_decl_diff& second)
1273 {
1274 return is_less_than(first, second);
1275 }
1276
1277 /// The actual less than operator.
1278 ///
1279 /// It returns true if the first @ref function_decl_diff_sptr is
1280 /// less than the second one.
1281 ///
1282 /// param first the first @ref function_decl_diff_sptr to consider.
1283 ///
1284 /// @param second the second @ref function_decl_diff_sptr to
1285 /// consider.
1286 ///
1287 /// @return true iff @p first is less than @p second.
1288 bool
1290 const function_decl_diff_sptr second)
1291 {return operator()(*first, *second);}
1292}; // end struct function_decl_diff_comp
1293
1294/// Functor to sort instances of @ref var_diff_sptr
1296{
1297 /// Return true if the first argument is less than the second one.
1298 ///
1299 /// @param f the first argument to consider.
1300 ///
1301 /// @param s the second argument to consider.
1302 ///
1303 /// @return true if @p f is less than @p s.
1304 bool
1306 const var_diff_sptr s)
1307 {
1308 return (f->first_var()->get_qualified_name()
1309 < s->first_var()->get_qualified_name());
1310 }
1311}; // end struct var_diff_sptr_comp
1312
1313/// The type of the private data of corpus_diff::diff_stats.
1315{
1316 friend class corpus_diff::diff_stats;
1317
1318 diff_context_wptr ctxt_;
1319 size_t num_func_removed;
1320 size_t num_removed_func_filtered_out;
1321 size_t num_func_added;
1322 size_t num_added_func_filtered_out;
1323 size_t num_func_changed;
1324 size_t num_changed_func_filtered_out;
1325 size_t num_func_with_virt_offset_changes;
1326 size_t num_vars_removed;
1327 size_t num_removed_vars_filtered_out;
1328 size_t num_vars_added;
1329 size_t num_added_vars_filtered_out;
1330 size_t num_vars_changed;
1331 size_t num_changed_vars_filtered_out;
1332 size_t num_func_syms_removed;
1333 size_t num_removed_func_syms_filtered_out;
1334 size_t num_func_syms_added;
1335 size_t num_added_func_syms_filtered_out;
1336 size_t num_var_syms_removed;
1337 size_t num_removed_var_syms_filtered_out;
1338 size_t num_var_syms_added;
1339 size_t num_added_var_syms_filtered_out;
1340 size_t num_leaf_changes;
1341 size_t num_leaf_changes_filtered_out;
1342 size_t num_leaf_type_changes;
1343 size_t num_leaf_type_changes_filtered_out;
1344 size_t num_leaf_func_changes;
1345 size_t num_leaf_func_changes_filtered_out;
1346 size_t num_leaf_var_changes;
1347 size_t num_leaf_var_changes_filtered_out;
1348 size_t num_added_unreachable_types;
1349 size_t num_added_unreachable_types_filtered_out;
1350 size_t num_removed_unreachable_types;
1351 size_t num_removed_unreachable_types_filtered_out;
1352 size_t num_changed_unreachable_types;
1353 size_t num_changed_unreachable_types_filtered_out;
1354
1356 : ctxt_(ctxt),
1357 num_func_removed(),
1358 num_removed_func_filtered_out(),
1359 num_func_added(),
1360 num_added_func_filtered_out(),
1361 num_func_changed(),
1362 num_changed_func_filtered_out(),
1363 num_func_with_virt_offset_changes(),
1364 num_vars_removed(),
1365 num_removed_vars_filtered_out(),
1366 num_vars_added(),
1367 num_added_vars_filtered_out(),
1368 num_vars_changed(),
1369 num_changed_vars_filtered_out(),
1370 num_func_syms_removed(),
1371 num_removed_func_syms_filtered_out(),
1372 num_func_syms_added(),
1373 num_added_func_syms_filtered_out(),
1374 num_var_syms_removed(),
1375 num_removed_var_syms_filtered_out(),
1376 num_var_syms_added(),
1377 num_added_var_syms_filtered_out(),
1378 num_leaf_changes(),
1379 num_leaf_changes_filtered_out(),
1380 num_leaf_type_changes(),
1381 num_leaf_type_changes_filtered_out(),
1382 num_leaf_func_changes(),
1383 num_leaf_func_changes_filtered_out(),
1384 num_leaf_var_changes(),
1385 num_leaf_var_changes_filtered_out(),
1386 num_added_unreachable_types(),
1387 num_added_unreachable_types_filtered_out(),
1388 num_removed_unreachable_types(),
1389 num_removed_unreachable_types_filtered_out(),
1390 num_changed_unreachable_types(),
1391 num_changed_unreachable_types_filtered_out()
1392 {}
1393
1395 ctxt()
1396 {return ctxt_.lock();}
1397}; // end class corpus_diff::diff_stats::priv
1398
1399void
1400sort_enumerators(const string_enumerator_map& enumerators_map,
1402
1403void
1405 changed_enumerators_type& sorted);
1406
1407void
1409 vector<decl_base_sptr>& sorted);
1410
1411void
1413
1414void
1416 vector<const function_decl*>& sorted);
1417
1418void
1421
1422void
1424 vector<type_base_sptr>& sorted);
1425
1426void
1430
1431void
1433 var_diff_sptrs_type& sorted);
1434
1435void
1437 vector<elf_symbol_sptr>& sorted);
1438
1439void
1441 vector<var_decl_sptr>& sorted);
1442
1443void
1445 var_diff_sptrs_type& sorted);
1446
1447void
1449 var_diff_sptrs_type& sorted);
1450
1451void
1455
1456void
1458 diff_sptrs_type& sorted);
1459
1460void
1462 diff_ptrs_type& sorted);
1463
1464void
1466 base_diff_sptrs_type& sorted);
1467
1468void
1470 class_decl::base_specs& sorted);
1471
1472void
1474 vector<fn_parm_diff_sptr>& sorted);
1475void
1477 vector<fn_parm_diff_sptr>& sorted);
1478void
1480 vector<function_decl::parameter_sptr>& sorted);
1481
1482void
1484 vector<type_or_decl_base_sptr>& sorted);
1485
1486type_base_sptr
1487get_leaf_type(qualified_type_def_sptr t);
1488
1489diff*
1490get_fn_decl_or_var_decl_diff_ancestor(const diff *);
1491
1492bool
1494
1495} // end namespace comparison
1496
1497} // namespace abigail
1498
1499#endif // __ABG_COMPARISON_PRIV_H__
This header declares filters for the diff trees resulting from comparing ABI Corpora.
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects,...
Definition: abg-fwd.h:1718
Utilities to ease the wrapping of C types into std::shared_ptr.
const diff_sptr & element_type_diff() const
Getter for the diff between the two types of array elements.
const vector< subrange_diff_sptr > & subrange_diffs() const
Getter for the diffs between the array subranges.
An abstraction of a diff between two instances of class_decl::base_spec.
class_decl::base_spec_sptr first_base() const
Getter for the first base spec of the diff object.
This is a document class that aims to capture statistics about the changes carried by a corpus_diff t...
shared_ptr< diff_stats > diff_stats_sptr
A convenience typedef for a shared pointer to diff_stats.
The base class of diff between decls.
This type contains maps. Each map associates a type name to a diff of that type. Not all kinds of dif...
The abstraction of a change between two ABI artifacts, a.k.a an artifact change.
type_or_decl_base_sptr second_subject() const
Getter of the second subject of the diff.
type_or_decl_base_sptr first_subject() const
Getter of the first subject of the diff.
diff * get_canonical_diff() const
Getter for the canonical diff of the current instance of diff.
bool currently_reporting() const
Tests if we are currently in the middle of emitting a report for this diff.
bool reported_once() const
Tests if a report has already been emitted for the current diff.
Abstraction of a diff between two function parameters.
const function_decl::parameter_sptr first_parameter() const
Getter for the first subject of this diff node.
Abstraction of a diff between two function_decl.
const function_decl_sptr first_function_decl() const
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...
The base class of diff between types.
const diff_sptr underlying_type_diff() const
Getter for the diff between the two underlying types of the typedefs.
The abstraction of an edit script for transforming a sequence A into a sequence B.
Abstraction of a base specifier in a class declaration.
Definition: abg-ir.h:4314
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
Definition: abg-ir.h:4145
vector< base_spec_sptr > base_specs
Convenience typedef.
Definition: abg-ir.h:4146
vector< method_decl_sptr > member_functions
Convenience typedef.
Definition: abg-ir.h:3960
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representatin of the current declaration.
Definition: abg-ir.cc:4670
Abstraction of an elf symbol.
Definition: abg-ir.h:932
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
Definition: abg-ir.cc:2440
The abstraction of an enumerator.
Definition: abg-ir.h:2844
int64_t get_value() const
Getter for the value of enum_type_decl::enumerator.
Definition: abg-ir.cc:20506
std::vector< enumerator > enumerators
Convenience typedef for a list of enumerator.
Definition: abg-ir.h:2772
Abstraction of a function parameter.
Definition: abg-ir.h:3287
Abstraction for a function declaration.
Definition: abg-ir.h:3117
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
Definition: abg-ir.h:3139
An abstraction helper for type declarations.
Definition: abg-ir.h:1974
Abstracts a variable declaration.
Definition: abg-ir.h:3020
virtual const interned_string & get_qualified_name(bool internal=false) const
Get the qualified name of a given variable or data member.
Definition: abg-ir.cc:21226
shared_ptr< diff > diff_sptr
Convenience typedef for a shared_ptr for the diff class.
Definition: abg-fwd.h:78
std::pair< enum_type_decl::enumerator, enum_type_decl::enumerator > changed_enumerator
Convenience typedef for a changed enumerator. The first element of the pair is the old enumerator and...
weak_ptr< diff > diff_wptr
Convenience typedef for a weak_ptr for the diff class.
Definition: abg-fwd.h:81
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 ...
@ SUPPRESSED_CATEGORY
This means that a diff node was marked as suppressed by a user-provided suppression specification.
@ REDUNDANT_CATEGORY
A diff node in this category is redundant. That means it's present as a child of a other nodes in the...
@ 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...
@ 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...
@ EVERYTHING_CATEGORY
A special enumerator that is the logical 'or' all the enumerators above.
@ NO_CHANGE_CATEGORY
This means the diff node does not carry any (meaningful) change, or that it carries changes that have...
@ 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....
@ 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...
shared_ptr< reporter_base > reporter_base_sptr
A convenience typedef for a shared pointer to a reporter_base.
Definition: abg-reporter.h:54
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...
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...
unordered_map< unsigned, function_decl::parameter_sptr > unsigned_parm_map
Convenience typedef for a map which key is an integer and which value is a parameter.
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.
vector< diff_sptr > diff_sptrs_type
Convenience typedef for a vector of diff_sptr.
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.
shared_ptr< diff_context > diff_context_sptr
Convenience typedef for a shared pointer of diff_context.
Definition: abg-fwd.h:70
bool is_diff_of_global_decls(const diff *)
Tests if a given diff node is to represent the changes between two gobal decls.
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.
weak_ptr< diff_context > diff_context_wptr
Convenience typedef for a weak pointer of diff_context.
Definition: abg-fwd.h:73
unordered_map< types_or_decls_type, diff_sptr, types_or_decls_hash, types_or_decls_equal > types_or_decls_diff_map_type
A convenience typedef for a map of types_or_decls_type and diff_sptr.
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.
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.
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.
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 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.
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...
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.
unordered_map< string, var_decl_sptr > 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_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.
shared_ptr< base_diff > base_diff_sptr
Convenience typedef for a shared pointer to a base_diff type.
shared_ptr< class_diff > class_diff_sptr
Convenience typedef for a shared pointer on a class_diff type.
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...
std::pair< const type_or_decl_base_sptr, const type_or_decl_base_sptr > types_or_decls_type
Convenience typedef for a pair of decls or types.
vector< changed_var_sptr > changed_var_sptrs_type
Convenience typedef for a vector of @changed_var_sptr.gg381.
unordered_map< unsigned, decl_base_sptr > unsigned_decl_base_sptr_map
Convenience typedef for a map which key is an unsigned integer and which value is a decl_base_sptr.
void sort_string_var_ptr_map(const string_var_ptr_map &map, vector< var_decl_sptr > &sorted)
Sort a map of string -> pointer to var_decl.
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.
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.
unordered_map< size_t, size_t > pointer_map
Convenience typedef for a map of pointer values. The Key is a pointer value and the value is potentia...
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.
bool is_less_than(const function_decl_diff &first, const function_decl_diff &second)
Compare two function_decl_diff for the purpose of sorting.
unordered_set< diff_sptr, diff_sptr_hasher > unordered_diff_sptr_set
Convenience typedef for an unoredered set of diff_sptr.
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...
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.
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.
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.
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...
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.
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...
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.
hash_t combine_hashes(hash_t val1, hash_t val2)
Combine two hash values to produce a third hash value.
Definition: abg-hash.cc:172
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
Definition: abg-fwd.h:269
ssize_t get_member_function_vtable_offset(const function_decl &f)
Get the vtable offset of a member function.
Definition: abg-ir.cc:6402
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.
Definition: abg-ir.h:559
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
Definition: abg-ir.h:897
string get_name(const type_or_decl_base *tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type or a decl.
Definition: abg-ir.cc:8510
abg_compat::optional< uint64_t > hash_t
The abstraction for an 8 bytes hash value.
Definition: abg-ir.h:105
bool function_decl_is_less_than(const function_decl &f, const function_decl &s)
Test if the pretty representation of a given function_decl is lexicographically less then the pretty ...
Definition: abg-ir.cc:28219
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
Definition: abg-fwd.h:256
size_t hash_type_or_decl(const type_or_decl_base *tod)
Hash an ABI artifact that is either a type or a decl.
Definition: abg-ir.cc:27920
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
Definition: abg-fwd.h:120
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
Definition: abg-fwd.h:136
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.
Definition: abg-fwd.h:157
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
Definition: abg-ir.cc:10374
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
Definition: abg-ir.cc:6008
bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
Definition: abg-ir.cc:6465
bool is_data_member(const var_decl &v)
Test if a var_decl is a data member.
Definition: abg-ir.cc:5437
an engine to suppress the parts of the result of comparing two sets of ABI artifacts.
vector< suppression_sptr > suppressions_type
Convenience typedef for a vector of suppression_sptr.
Definition: abg-fwd.h:1662
Toplevel namespace for libabigail.
diff_sptr element_type_diff_
The diff between the two array element types.
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.
The type of the private data (pimpl sub-object) of the class_diff type.
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.
priv()
Default constructor of corpus_diff::priv.
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 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_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...
priv(corpus_sptr first, corpus_sptr second, diff_context_sptr ctxt)
Constructor of corpus_diff::priv.
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 ...
bool deleted_variable_is_suppressed(const var_decl_sptr &var) const
Test if the change reports for a give given deleted variable has been deleted.
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_variable_is_suppressed(const var_decl_sptr &var) const
Test if the change reports for a given added variable have been suppressed.
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.
bool compare_data_members(const var_decl_sptr &first_dm, const var_decl_sptr &second_dm) const
Compare two data members.
bool operator()(const changed_var_sptr &f, const changed_var_sptr &s) const
Compare two data members.
bool operator()(const decl_base_sptr &f, const decl_base_sptr &s) const
Compare two data members.
A comparison functor to compare two instances of var_diff that represent changed data members based o...
bool operator()(const var_diff_sptr f, const var_diff_sptr s) const
Private data for the diff type. The details of generic view of the diff node are expressed here.
bool is_filtered_out(diff_category category)
Check if a given categorization of a diff node should make it be filtered out.
diff_context_sptr get_context() const
Getter of the diff context associated with this diff.
A comparison functor for instances of diff.
bool operator()(const diff_sptr l, diff_sptr r) const
Lexicographically compare two diff nodes.
bool operator()(const diff &l, diff &r) const
Lexicographically compare two diff nodes.
bool operator()(const diff *l, diff *r) const
Lexicographically compare two diff nodes.
The private member (pimpl) for diff_context.
A comparison functor for using diff_sptr and diff* in a hash map or set.
bool operator()(const diff_sptr &d1, const diff_sptr &d2) const
The function-call operator to compare two diff nodes.
bool operator()(const diff &d1, const diff &d2) const
The function-call operator to compare two diff nodes.
bool operator()(const diff *d1, const diff *d2) const
The function-call operator to compare two diff nodes.
A hashing functor for using diff_sptr and diff* in a hash map or set.
size_t operator()(const diff_sptr &d) const
The function-call operator to hash a diff node.
size_t operator()(const diff &d) const
The function-call operator to hash a diff node.
size_t operator()(const diff *d) const
The function-call operator to hash a diff node.
A functor to compare two instances of diff_sptr.
bool operator()(const diff_sptr &l, const diff_sptr &r) const
An operator that takes two instances of diff_sptr returns true if its first operand compares less tha...
bool operator()(const diff *l, const diff *r) const
An operator that takes two instances of diff_sptr returns true if its first operand compares less tha...
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.
bool operator()(const fn_parm_diff &f, const fn_parm_diff &s)
"Less than" functor to compare instances of function_decl.
bool operator()(const function_decl &f, const function_decl &s)
The actual "less than" operator for instances of function_decl. It returns true if the first function...
bool operator()(const function_decl *f, const function_decl *s)
The actual "less than" operator for instances of function_decl. It returns true if the first function...
bool operator()(const function_decl_sptr f, const function_decl_sptr s)
The actual "less than" operator for instances of function_decl. It returns true if the first function...
A "Less Than" functor to compare instance of function_decl_diff.
bool operator()(const function_decl_diff &first, const function_decl_diff &second)
The actual less than operator.
bool operator()(const function_decl_diff_sptr first, const function_decl_diff_sptr second)
The actual less than operator.
Functor that compares two function parameters for the purpose of sorting them.
bool operator()(const function_decl::parameter_sptr &l, const function_decl::parameter_sptr &r)
Returns true iff the index of the first parameter is smaller than the of the second parameter.
bool operator()(const function_decl::parameter &l, const function_decl::parameter &r)
Returns true iff the index of the first parameter is smaller than the of the second parameter.
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.
An equality functor for types_or_decls_type.
A hashing functor for types_or_decls_type.
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.
bool operator()(const var_diff_sptr f, const var_diff_sptr s)
Return true if the first argument is less than the second one.
A comparison functor for instances of function_decl_diff that represent changes between two virtual m...
A deleter for shared pointers that ... doesn't delete the object managed by the shared pointer.