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-2023 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(h1, 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
435 {}
436};//end struct array_diff::priv
437
439{
440 diff_sptr underlying_type_diff_;
441 priv(diff_sptr underlying)
442 : underlying_type_diff_(underlying)
443 {}
444};//end struct reference_diff::priv
445
446/// The private data of the @ref ptr_to_mbr_diff type.
448{
449 diff_sptr member_type_diff_;
450 diff_sptr containing_type_diff_;
451
454 : member_type_diff_(member_type_diff),
455 containing_type_diff_(containing_type_diff)
456 {}
457};//end ptr_to_mbr_diff::priv
458
460{
461 diff_sptr underlying_type_diff;
462 mutable diff_sptr leaf_underlying_type_diff;
463
464 priv(diff_sptr underlying)
465 : underlying_type_diff(underlying)
466 {}
467};// end struct qualified_type_diff::priv
468
470{
471 diff_sptr underlying_type_diff_;
472 edit_script enumerators_changes_;
473 string_enumerator_map deleted_enumerators_;
474 string_enumerator_map inserted_enumerators_;
475 string_changed_enumerator_map changed_enumerators_;
476
477 priv(diff_sptr underlying)
478 : underlying_type_diff_(underlying)
479 {}
480};//end struct enum_diff::priv
481
482/// A functor to compare two enumerators based on their value. This
483/// implements the "less than" operator.
485{
486 bool
487 operator()(const enum_type_decl::enumerator& f,
488 const enum_type_decl::enumerator& s) const
489 {return f.get_value() < s.get_value();}
490};//end struct enumerator_value_comp
491
492/// A functor to compare two changed enumerators, based on their
493/// initial value.
495{
496 bool
497 operator()(const changed_enumerator& f,
498 const changed_enumerator& s) const
499 {return f.first.get_value() < s.first.get_value();}
500};// end struct changed_enumerator_comp.
501
502/// The type of private data of @ref class_or_union_diff.
504{
505 edit_script member_types_changes_;
506 edit_script data_members_changes_;
507 edit_script member_fns_changes_;
508 edit_script member_fn_tmpls_changes_;
509 edit_script member_class_tmpls_changes_;
510
511 string_decl_base_sptr_map deleted_member_types_;
512 string_decl_base_sptr_map inserted_member_types_;
513 string_diff_sptr_map changed_member_types_;
514 diff_sptrs_type sorted_changed_member_types_;
515 string_decl_base_sptr_map deleted_data_members_;
516 unsigned_decl_base_sptr_map deleted_dm_by_offset_;
517 string_decl_base_sptr_map inserted_data_members_;
518 unsigned_decl_base_sptr_map inserted_dm_by_offset_;
519 // This map contains the data member which sub-type changed.
520 string_var_diff_sptr_map subtype_changed_dm_;
521 var_diff_sptrs_type sorted_subtype_changed_dm_;
522 // This one contains the list of data members changes that can be
523 // represented as a data member foo that got removed from offset N,
524 // and a data member bar that got inserted at offset N; IOW, this
525 // can be translated as data member foo that got changed into data
526 // member bar at offset N.
527 unsigned_var_diff_sptr_map changed_dm_;
528 var_diff_sptrs_type sorted_changed_dm_;
529
530 // This is a data structure to represent data members that have been
531 // replaced by anonymous data members. It's a map that associates
532 // the name of the data member to the anonymous data member that
533 // replaced it.
534 string_decl_base_sptr_map dms_replaced_by_adms_;
535 mutable changed_var_sptrs_type dms_replaced_by_adms_ordered_;
536 string_member_function_sptr_map deleted_member_functions_;
537 class_or_union::member_functions sorted_deleted_member_functions_;
538 string_member_function_sptr_map inserted_member_functions_;
539 class_or_union::member_functions sorted_inserted_member_functions_;
540 string_function_decl_diff_sptr_map changed_member_functions_;
541 function_decl_diff_sptrs_type sorted_changed_member_functions_;
542 string_decl_base_sptr_map deleted_member_class_tmpls_;
543 string_decl_base_sptr_map inserted_member_class_tmpls_;
544 string_diff_sptr_map changed_member_class_tmpls_;
545 diff_sptrs_type sorted_changed_member_class_tmpls_;
546
548 member_type_has_changed(decl_base_sptr) const;
549
550 decl_base_sptr
551 subtype_changed_dm(decl_base_sptr) const;
552
553 decl_base_sptr
554 member_class_tmpl_has_changed(decl_base_sptr) const;
555
556 size_t
558
559 size_t
561
562 size_t
563 count_filtered_subtype_changed_dm(bool local_only = false);
564
565 size_t
566 count_filtered_changed_dm(bool local_only = false);
567
568 size_t
570
571 size_t
573
574 size_t
576
577 priv()
578 {}
579}; // end struct class_or_union_diff::priv
580
581/// A comparison functor to compare two data members based on their
582/// offset.
584{
585
586 /// Compare two data members.
587 ///
588 /// First look at their offset and then their name.
589 ///
590 /// @parm first_dm the first data member to consider.
591 ///
592 /// @param second_dm the second data member to consider.
593 bool
595 const var_decl_sptr& second_dm) const
596 {
597 ABG_ASSERT(first_dm);
598 ABG_ASSERT(second_dm);
599
600 size_t first_offset = get_data_member_offset(first_dm);
601 size_t second_offset = get_data_member_offset(second_dm);
602
603 // The data member at the smallest offset comes first.
604 if (first_offset != second_offset)
605 return first_offset < second_offset;
606
607 string first_dm_name = first_dm->get_name();
608 string second_dm_name = second_dm->get_name();
609
610 // But in case the two data members are at the same offset, then
611 // sort them lexicographically.
612 return first_dm_name < second_dm_name;
613 }
614
615 /// Compare two data members.
616 ///
617 /// First look at their offset and then their name.
618 ///
619 /// @parm first_dm the first data member to consider.
620 ///
621 /// @param second_dm the second data member to consider.
622 bool
623 operator()(const decl_base_sptr& f,
624 const decl_base_sptr& s) const
625 {
626 var_decl_sptr first_dm = is_data_member(f);
627 var_decl_sptr second_dm = is_data_member(s);
628
629 return compare_data_members(first_dm, second_dm);
630 }
631
632 /// Compare two data members.
633 ///
634 /// First look at their offset and then their name.
635 ///
636 /// @parm first_dm the first data member to consider.
637 ///
638 /// @param second_dm the second data member to consider.
639 bool
641 const changed_var_sptr& s) const
642 {
643 var_decl_sptr first_dm = is_data_member(is_decl(f.first));
644 var_decl_sptr second_dm = is_data_member(is_decl(s.first));
645
646 return compare_data_members(first_dm, second_dm);
647 }
648};//end struct data_member_comp
649
650/// The type of the private data (pimpl sub-object) of the @ref
651/// class_diff type.
653{
654 edit_script base_changes_;
655 string_base_sptr_map deleted_bases_;
656 class_decl::base_specs sorted_deleted_bases_;
657 string_base_sptr_map inserted_bases_;
658 class_decl::base_specs sorted_inserted_bases_;
659 string_base_diff_sptr_map changed_bases_;
660 base_diff_sptrs_type sorted_changed_bases_;
661 vector<class_decl::base_spec_sptr> moved_bases_;
662
665
666 size_t
668
669 priv()
670 {}
671};//end struct class_diff::priv
672
673/// A functor to compare instances of @ref class_decl::base_spec.
675{
676 bool
677 operator()(const class_decl::base_spec&l,
678 const class_decl::base_spec&r)
679 {
680 string str1 = l.get_pretty_representation();
681 string str2 = r.get_pretty_representation();
682 return str1 < str2;
683 }
684 bool
685 operator()(const class_decl::base_spec_sptr&l,
687 {return operator()(*l, *r);}
688}; // end base_spec_comp
689
690/// A comparison function for instances of @ref base_diff.
692{
693 bool
694 operator()(const base_diff& l, const base_diff& r) const
695 {
697 if (f->get_offset_in_bits() >= 0
698 && s->get_offset_in_bits() >= 0)
699 return f->get_offset_in_bits() < s->get_offset_in_bits();
700 else
701 return (f->get_base_class()->get_pretty_representation()
702 < s->get_base_class()->get_pretty_representation());
703 }
704
705 bool
706 operator()(const base_diff* l, const base_diff* r) const
707 {return operator()(*l, *r);}
708
709 bool
710 operator()(const base_diff_sptr l, const base_diff_sptr r) const
711 {return operator()(l.get(), r.get());}
712}; // end struct base_diff_comp
713
714/// A comparison functor to compare two instances of @ref var_diff
715/// that represent changed data members based on the offset of the
716/// initial data members, or if equal, based on their qualified name.
717/// If equal again, then the offset and qualified name of the new data
718/// members are considered.
720{
721 /// @param f the first change to data member to take into account
722 ///
723 /// @param s the second change to data member to take into account.
724 ///
725 /// @return true iff f is before s.
726 bool
728 const var_diff_sptr s) const
729 {
730 var_decl_sptr first_dm = f->first_var();
731 var_decl_sptr second_dm = s->first_var();
732
733 ABG_ASSERT(is_data_member(first_dm));
734 ABG_ASSERT(is_data_member(second_dm));
735
736 size_t off1 = get_data_member_offset(first_dm);
737 size_t off2 = get_data_member_offset(second_dm);
738
739 if (off1 != off2)
740 return off1 < off2;
741
742 // The two offsets of the initial data members are the same. So
743 // lets compare the qualified name of these initial data members.
744
745 string name1 = first_dm->get_qualified_name();
746 string name2 = second_dm->get_qualified_name();
747
748 if (name1 != name2)
749 return name1 < name2;
750
751 // The offsets and the qualified names of the initial data members
752 // are the same. Let's now compare the offsets of the *new* data
753 // members.
754
755 first_dm = f->second_var();
756 second_dm = s->second_var();
757
758 ABG_ASSERT(is_data_member(first_dm));
759 ABG_ASSERT(is_data_member(second_dm));
760
761 off1 = get_data_member_offset(first_dm);
762 off2 = get_data_member_offset(second_dm);
763
764 if (off1 != off2)
765 return off1 < off2;
766
767 // The offsets of the new data members are the same, dang! Let's
768 // compare the qualified names of these new data members then.
769
770 name1 = first_dm->get_qualified_name();
771 name2 = second_dm->get_qualified_name();
772
773 return name1 < name2;
774 }
775}; // end struct var_diff_comp
776
777/// A comparison functor for instances of @ref function_decl_diff that
778/// represent changes between two virtual member functions.
780{
781 bool
782 operator()(const function_decl_diff& l,
783 const function_decl_diff& r) const
784 {
787
790 }
791
792 bool
793 operator()(const function_decl_diff* l,
794 const function_decl_diff* r)
795 {return operator()(*l, *r);}
796
797 bool
798 operator()(const function_decl_diff_sptr l,
800 {return operator()(l.get(), r.get());}
801}; // end struct virtual_member_function_diff_comp
802
804{
805 class_diff_sptr underlying_class_diff_;
806
807 priv(class_diff_sptr underlying)
808 : underlying_class_diff_(underlying)
809 {}
810}; // end struct base_diff::priv
811
813{
814 // The edit script built by the function compute_diff.
815 edit_script member_changes_;
816
817 // Below are the useful lookup tables.
818 //
819 // If you add a new lookup table, please update member functions
820 // clear_lookup_tables, lookup_tables_empty and
821 // ensure_lookup_tables_built.
822
823 // The deleted/inserted types/decls. These basically map what is
824 // inside the member_changes_ data member. Note that for instance,
825 // a given type T might be deleted from the first scope and added to
826 // the second scope again; this means that the type was *changed*.
827 string_decl_base_sptr_map deleted_types_;
828 string_decl_base_sptr_map deleted_decls_;
829 string_decl_base_sptr_map inserted_types_;
830 string_decl_base_sptr_map inserted_decls_;
831
832 // The changed types/decls lookup tables.
833 //
834 // These lookup tables are populated from the lookup tables above.
835 //
836 // Note that the value stored in each of these tables is a pair
837 // containing the old decl/type and the new one. That way it is
838 // easy to run a diff between the old decl/type and the new one.
839 //
840 // A changed type/decl is one that has been deleted from the first
841 // scope and that has been inserted into the second scope.
842 string_diff_sptr_map changed_types_;
843 diff_sptrs_type sorted_changed_types_;
844 string_diff_sptr_map changed_decls_;
845 diff_sptrs_type sorted_changed_decls_;
846
847 // The removed types/decls lookup tables.
848 //
849 // A removed type/decl is one that has been deleted from the first
850 // scope and that has *NOT* been inserted into it again.
851 string_decl_base_sptr_map removed_types_;
852 string_decl_base_sptr_map removed_decls_;
853
854 // The added types/decls lookup tables.
855 //
856 // An added type/decl is one that has been inserted to the first
857 // scope but that has not been deleted from it.
858 string_decl_base_sptr_map added_types_;
859 string_decl_base_sptr_map added_decls_;
860};//end struct scope_diff::priv
861
862/// A comparison functor for instances of @ref diff.
864{
865 /// Lexicographically compare two diff nodes.
866 ///
867 /// Compare the pretty representation of the first subjects of two
868 /// diff nodes.
869 ///
870 /// @return true iff @p l is less than @p r.
871 bool
872 operator()(const diff& l, diff& r) const
873 {
875 <
877 }
878
879 /// Lexicographically compare two diff nodes.
880 ///
881 /// Compare the pretty representation of the first subjects of two
882 /// diff nodes.
883 ///
884 /// @return true iff @p l is less than @p r.
885 bool
886 operator()(const diff* l, diff* r) const
887 {return operator()(*l, *r);}
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
897 {return operator()(l.get(), r.get());}
898}; // end struct diff_comp;
899
901{
902 mutable diff_sptr type_diff;
903}; // end struct fn_parm_diff::priv
904
906{
907 diff_sptr return_type_diff_;
908 edit_script parm_changes_;
909
910 // useful lookup tables.
911 string_parm_map deleted_parms_;
912 vector<function_decl::parameter_sptr> sorted_deleted_parms_;
913 string_parm_map added_parms_;
914 vector<function_decl::parameter_sptr> sorted_added_parms_;
915 // This map contains parameters sub-type changes that don't change
916 // the name of the type of the parameter.
917 string_fn_parm_diff_sptr_map subtype_changed_parms_;
918 vector<fn_parm_diff_sptr> sorted_subtype_changed_parms_;
919 // This map contains parameter type changes that actually change the
920 // name of the type of the parameter, but in a compatible way;
921 // otherwise, the mangling of the function would have changed (in
922 // c++ at least).
923 unsigned_fn_parm_diff_sptr_map changed_parms_by_id_;
924 vector<fn_parm_diff_sptr> sorted_changed_parms_by_id_;
925 unsigned_parm_map deleted_parms_by_id_;
926 unsigned_parm_map added_parms_by_id_;
927
928 priv()
929 {}
930}; // end struct function_type_diff::priv
931
933{
934 function_type_diff_sptr type_diff_;
935
936 priv()
937 {}
938};// end struct function_decl_diff::priv
939
940/// A comparison functor to compare two instances of @ref fn_parm_diff
941/// based on their indexes.
943{
944 /// @param f the first diff
945 ///
946 /// @param s the second diff
947 ///
948 /// @return true if the index of @p f is less than the index of @p
949 /// s.
950 bool
952 {return f.first_parameter()->get_index() < s.first_parameter()->get_index();}
953
954 bool
956 {return operator()(*f, *s);}
957}; // end struct fn_parm_diff_comp
958
959/// Functor that compares two function parameters for the purpose of
960/// sorting them.
962{
963 /// Returns true iff the index of the first parameter is smaller
964 /// than the of the second parameter.
965 ///
966 /// @param l the first parameter to compare.
967 ///
968 /// @param r the second parameter to compare.
969 ///
970 /// @return true iff the index of the first parameter is smaller
971 /// than the of the second parameter.
972 bool
975 {return l.get_index() < r.get_index();}
976
977 /// Returns true iff the index of the first parameter is smaller
978 /// than the of the second parameter.
979 ///
980 /// @param l the first parameter to compare.
981 ///
982 /// @param r the second parameter to compare.
983 ///
984 /// @return true iff the index of the first parameter is smaller
985 /// than the of the second parameter.
986 bool
989 {return operator()(*l, *r);}
990}; // end struct parm_comp
991
992/// A functor to compare instances of @ref var_decl base on their
993/// qualified names.
995{
996 bool
997 operator() (const var_decl& l, const var_decl& r) const
998 {
999 string name1 = l.get_qualified_name(), name2 = r.get_qualified_name();
1000 return name1 < name2;
1001 }
1002
1003 bool
1004 operator() (const var_decl* l, const var_decl* r) const
1005 {return operator()(*l, *r);}
1006};// end struct var_comp
1007
1008/// A functor to compare instances of @ref elf_symbol base on their
1009/// names.
1011{
1012 bool
1013 operator()(const elf_symbol& l, const elf_symbol& r)
1014 {
1015 string name1 = l.get_id_string(), name2 = r.get_id_string();
1016 return name1 < name2;
1017 }
1018
1019 bool
1020 operator()(const elf_symbol* l, const elf_symbol* r)
1021 {return operator()(*l, *r);}
1022
1023 bool
1024 operator()(const elf_symbol_sptr& l, const elf_symbol_sptr& r)
1025 {return operator()(l.get(), r.get());}
1026}; //end struct elf_symbol_comp
1027
1029{
1030 diff_sptr underlying_type_diff_;
1031
1033 : underlying_type_diff_(underlying_type_diff)
1034 {}
1035};//end struct typedef_diff::priv
1036
1038{
1039 translation_unit_sptr first_;
1040 translation_unit_sptr second_;
1041
1043 : first_(f), second_(s)
1044 {}
1045};//end struct translation_unit_diff::priv
1046
1048{
1049 bool finished_;
1050 string pretty_representation_;
1051 vector<diff*> children_;
1052 corpus_sptr first_;
1053 corpus_sptr second_;
1054 diff_context_wptr ctxt_;
1055 corpus_diff::diff_stats_sptr diff_stats_;
1056 bool sonames_equal_;
1057 bool architectures_equal_;
1058 edit_script fns_edit_script_;
1059 edit_script vars_edit_script_;
1060 edit_script unrefed_fn_syms_edit_script_;
1061 edit_script unrefed_var_syms_edit_script_;
1062 string_function_ptr_map deleted_fns_;
1063 string_function_ptr_map suppressed_deleted_fns_;
1064 string_function_ptr_map added_fns_;
1065 string_function_ptr_map suppressed_added_fns_;
1066 string_function_decl_diff_sptr_map changed_fns_map_;
1067 function_decl_diff_sptrs_type changed_fns_;
1068 string_var_ptr_map deleted_vars_;
1069 string_var_ptr_map suppressed_deleted_vars_;
1070 string_var_ptr_map added_vars_;
1071 string_var_ptr_map suppressed_added_vars_;
1072 string_var_diff_sptr_map changed_vars_map_;
1073 var_diff_sptrs_type sorted_changed_vars_;
1074 string_elf_symbol_map added_unrefed_fn_syms_;
1075 string_elf_symbol_map suppressed_added_unrefed_fn_syms_;
1076 string_elf_symbol_map deleted_unrefed_fn_syms_;
1077 string_elf_symbol_map suppressed_deleted_unrefed_fn_syms_;
1078 string_elf_symbol_map added_unrefed_var_syms_;
1079 string_elf_symbol_map suppressed_added_unrefed_var_syms_;
1080 string_elf_symbol_map deleted_unrefed_var_syms_;
1081 string_elf_symbol_map suppressed_deleted_unrefed_var_syms_;
1082 edit_script unreachable_types_edit_script_;
1083 string_type_base_sptr_map deleted_unreachable_types_;
1084 vector<type_base_sptr> deleted_unreachable_types_sorted_;
1085 string_type_base_sptr_map suppressed_deleted_unreachable_types_;
1086 string_type_base_sptr_map added_unreachable_types_;
1087 vector<type_base_sptr> added_unreachable_types_sorted_;
1088 string_type_base_sptr_map suppressed_added_unreachable_types_;
1089 string_diff_sptr_map changed_unreachable_types_;
1090 mutable vector<diff_sptr> changed_unreachable_types_sorted_;
1091 diff_maps leaf_diffs_;
1092
1093 /// Default constructor of corpus_diff::priv.
1095 : finished_(false),
1096 sonames_equal_(false),
1097 architectures_equal_(false)
1098 {}
1099
1100 /// Constructor of corpus_diff::priv.
1101 ///
1102 /// @param first the first corpus of this diff.
1103 ///
1104 /// @param second the second corpus of this diff.
1105 ///
1106 /// @param ctxt the context of the diff.
1107 priv(corpus_sptr first,
1108 corpus_sptr second,
1109 diff_context_sptr ctxt)
1110 : finished_(false),
1111 first_(first),
1112 second_(second),
1113 ctxt_(ctxt),
1114 sonames_equal_(false),
1115 architectures_equal_(false)
1116 {}
1117
1119 get_context();
1120
1121 bool
1122 lookup_tables_empty() const;
1123
1124 void
1126
1127 void
1129
1130 void
1132
1133 bool
1135
1136 bool
1138
1139 bool
1140 deleted_variable_is_suppressed(const var_decl* var) const;
1141
1142 bool
1143 added_variable_is_suppressed(const var_decl* var) const;
1144
1145 bool
1147
1148 bool
1150
1151 bool
1153
1154 bool
1156
1157 bool
1159
1160 bool
1162
1163 void count_leaf_changes(size_t &num_changes, size_t &num_filtered);
1164
1165 void count_leaf_type_changes(size_t &num_type_changes,
1166 size_t &num_type_changes_filtered);
1167
1168 void count_unreachable_types(size_t &num_added,
1169 size_t &num_removed,
1170 size_t &num_changed,
1171 size_t &num_filtered_added,
1172 size_t &num_filtered_removed,
1173 size_t &num_filtered_changed);
1174
1177
1178 const vector<diff_sptr>&
1180
1181 void
1183
1184 void
1185 emit_diff_stats(const diff_stats& stats,
1186 ostream& out,
1187 const string& indent);
1188
1189 void
1191
1192 void
1194
1195 void
1197}; // end corpus::priv
1198
1199/// "Less than" functor to compare instances of @ref function_decl.
1201{
1202 /// The actual "less than" operator for instances of @ref
1203 /// function_decl. It returns true if the first @ref function_decl
1204 /// is lest than the second one.
1205 ///
1206 /// @param f the first @ref function_decl to take in account.
1207 ///
1208 /// @param s the second @ref function_decl to take in account.
1209 ///
1210 /// @return true iff @p f is less than @p s.
1211 bool
1214
1215 /// The actual "less than" operator for instances of @ref
1216 /// function_decl. It returns true if the first @ref function_decl
1217 /// is lest than the second one.
1218 ///
1219 /// @param f the first @ref function_decl to take in account.
1220 ///
1221 /// @param s the second @ref function_decl to take in account.
1222 ///
1223 /// @return true iff @p f is less than @p s.
1224 bool
1226 {return operator()(*f, *s);}
1227
1228 /// The actual "less than" operator for instances of @ref
1229 /// function_decl. It returns true if the first @ref function_decl
1230 /// is lest than the second one.
1231 ///
1232 /// @param f the first @ref function_decl to take in account.
1233 ///
1234 /// @param s the second @ref function_decl to take in account.
1235 ///
1236 /// @return true iff @p f is less than @p s.
1237 bool
1239 {return operator()(f.get(), s.get());}
1240}; // end function_comp
1241
1242/// A "Less Than" functor to compare instance of @ref
1243/// function_decl_diff.
1245{
1246 /// The actual less than operator.
1247 ///
1248 /// It returns true if the first @ref function_decl_diff is less
1249 /// than the second one.
1250 ///
1251 /// param first the first @ref function_decl_diff to consider.
1252 ///
1253 /// @param second the second @ref function_decl_diff to consider.
1254 ///
1255 /// @return true iff @p first is less than @p second.
1256 bool
1258 const function_decl_diff& second)
1259 {
1261 s = second.first_function_decl();
1262
1263 string fr = f->get_qualified_name(),
1264 sr = s->get_qualified_name();
1265
1266 if (fr == sr)
1267 {
1268 if (f->get_symbol())
1269 fr = f->get_symbol()->get_id_string();
1270 else if (!f->get_linkage_name().empty())
1271 fr = f->get_linkage_name();
1272 else
1273 fr = f->get_pretty_representation();
1274
1275 if (s->get_symbol())
1276 sr = s->get_symbol()->get_id_string();
1277 else if (!s->get_linkage_name().empty())
1278 sr = s->get_linkage_name();
1279 else
1280 sr = s->get_pretty_representation();
1281 }
1282
1283 return (fr.compare(sr) < 0);
1284 }
1285
1286 /// The actual less than operator.
1287 ///
1288 /// It returns true if the first @ref function_decl_diff_sptr is
1289 /// less than the second one.
1290 ///
1291 /// param first the first @ref function_decl_diff_sptr to consider.
1292 ///
1293 /// @param second the second @ref function_decl_diff_sptr to
1294 /// consider.
1295 ///
1296 /// @return true iff @p first is less than @p second.
1297 bool
1299 const function_decl_diff_sptr second)
1300 {return operator()(*first, *second);}
1301}; // end struct function_decl_diff_comp
1302
1303/// Functor to sort instances of @ref var_diff_sptr
1305{
1306 /// Return true if the first argument is less than the second one.
1307 ///
1308 /// @param f the first argument to consider.
1309 ///
1310 /// @param s the second argument to consider.
1311 ///
1312 /// @return true if @p f is less than @p s.
1313 bool
1315 const var_diff_sptr s)
1316 {
1317 return (f->first_var()->get_qualified_name()
1318 < s->first_var()->get_qualified_name());
1319 }
1320}; // end struct var_diff_sptr_comp
1321
1322/// The type of the private data of corpus_diff::diff_stats.
1324{
1325 friend class corpus_diff::diff_stats;
1326
1327 diff_context_wptr ctxt_;
1328 size_t num_func_removed;
1329 size_t num_removed_func_filtered_out;
1330 size_t num_func_added;
1331 size_t num_added_func_filtered_out;
1332 size_t num_func_changed;
1333 size_t num_changed_func_filtered_out;
1334 size_t num_func_with_virt_offset_changes;
1335 size_t num_vars_removed;
1336 size_t num_removed_vars_filtered_out;
1337 size_t num_vars_added;
1338 size_t num_added_vars_filtered_out;
1339 size_t num_vars_changed;
1340 size_t num_changed_vars_filtered_out;
1341 size_t num_func_syms_removed;
1342 size_t num_removed_func_syms_filtered_out;
1343 size_t num_func_syms_added;
1344 size_t num_added_func_syms_filtered_out;
1345 size_t num_var_syms_removed;
1346 size_t num_removed_var_syms_filtered_out;
1347 size_t num_var_syms_added;
1348 size_t num_added_var_syms_filtered_out;
1349 size_t num_leaf_changes;
1350 size_t num_leaf_changes_filtered_out;
1351 size_t num_leaf_type_changes;
1352 size_t num_leaf_type_changes_filtered_out;
1353 size_t num_leaf_func_changes;
1354 size_t num_leaf_func_changes_filtered_out;
1355 size_t num_leaf_var_changes;
1356 size_t num_leaf_var_changes_filtered_out;
1357 size_t num_added_unreachable_types;
1358 size_t num_added_unreachable_types_filtered_out;
1359 size_t num_removed_unreachable_types;
1360 size_t num_removed_unreachable_types_filtered_out;
1361 size_t num_changed_unreachable_types;
1362 size_t num_changed_unreachable_types_filtered_out;
1363
1365 : ctxt_(ctxt),
1366 num_func_removed(),
1367 num_removed_func_filtered_out(),
1368 num_func_added(),
1369 num_added_func_filtered_out(),
1370 num_func_changed(),
1371 num_changed_func_filtered_out(),
1372 num_func_with_virt_offset_changes(),
1373 num_vars_removed(),
1374 num_removed_vars_filtered_out(),
1375 num_vars_added(),
1376 num_added_vars_filtered_out(),
1377 num_vars_changed(),
1378 num_changed_vars_filtered_out(),
1379 num_func_syms_removed(),
1380 num_removed_func_syms_filtered_out(),
1381 num_func_syms_added(),
1382 num_added_func_syms_filtered_out(),
1383 num_var_syms_removed(),
1384 num_removed_var_syms_filtered_out(),
1385 num_var_syms_added(),
1386 num_added_var_syms_filtered_out(),
1387 num_leaf_changes(),
1388 num_leaf_changes_filtered_out(),
1389 num_leaf_type_changes(),
1390 num_leaf_type_changes_filtered_out(),
1391 num_leaf_func_changes(),
1392 num_leaf_func_changes_filtered_out(),
1393 num_leaf_var_changes(),
1394 num_leaf_var_changes_filtered_out(),
1395 num_added_unreachable_types(),
1396 num_added_unreachable_types_filtered_out(),
1397 num_removed_unreachable_types(),
1398 num_removed_unreachable_types_filtered_out(),
1399 num_changed_unreachable_types(),
1400 num_changed_unreachable_types_filtered_out()
1401 {}
1402
1404 ctxt()
1405 {return ctxt_.lock();}
1406}; // end class corpus_diff::diff_stats::priv
1407
1408void
1409sort_enumerators(const string_enumerator_map& enumerators_map,
1411
1412void
1414 changed_enumerators_type& sorted);
1415
1416void
1418 vector<decl_base_sptr>& sorted);
1419
1420void
1422
1423void
1425 vector<const function_decl*>& sorted);
1426
1427void
1430
1431void
1433 vector<type_base_sptr>& sorted);
1434
1435void
1439
1440void
1442 var_diff_sptrs_type& sorted);
1443
1444void
1446 vector<elf_symbol_sptr>& sorted);
1447
1448void
1450 vector<const var_decl*>& sorted);
1451
1452void
1454 var_diff_sptrs_type& sorted);
1455
1456void
1458 var_diff_sptrs_type& sorted);
1459
1460void
1464
1465void
1467 diff_sptrs_type& sorted);
1468
1469void
1471 diff_ptrs_type& sorted);
1472
1473void
1475 base_diff_sptrs_type& sorted);
1476
1477void
1479 class_decl::base_specs& sorted);
1480
1481void
1483 vector<fn_parm_diff_sptr>& sorted);
1484void
1486 vector<fn_parm_diff_sptr>& sorted);
1487void
1489 vector<function_decl::parameter_sptr>& sorted);
1490
1491void
1493 vector<type_or_decl_base_sptr>& sorted);
1494
1495type_base_sptr
1496get_leaf_type(qualified_type_def_sptr t);
1497
1498diff*
1499get_fn_decl_or_var_decl_diff_ancestor(const diff *);
1500
1501bool
1503
1504} // end namespace comparison
1505
1506} // namespace abigail
1507
1508#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:1695
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.
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:4425
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
Definition: abg-ir.h:4246
vector< base_spec_sptr > base_specs
Convenience typedef.
Definition: abg-ir.h:4247
vector< method_decl_sptr > member_functions
Convenience typedef.
Definition: abg-ir.h:4057
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:5079
Abstraction of an elf symbol.
Definition: abg-ir.h:923
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
Definition: abg-ir.cc:2521
std::vector< enumerator > enumerators
Convenience typedef for a list of enumerator.
Definition: abg-ir.h:2766
Abstraction of a function parameter.
Definition: abg-ir.h:3283
Abstraction for a function declaration.
Definition: abg-ir.h:3111
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
Definition: abg-ir.h:3135
An abstraction helper for type declarations.
Definition: abg-ir.h:1973
Abstracts a variable declaration.
Definition: abg-ir.h:3008
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:20964
shared_ptr< diff > diff_sptr
Convenience typedef for a shared_ptr for the diff class.
Definition: abg-fwd.h:79
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:82
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:71
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:74
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.
unordered_map< string, const var_decl * > string_var_ptr_map
Convenience typedef for a map which key is a string and which value is a point to var_decl.
void sort_unsigned_data_member_diff_sptr_map(const unsigned_var_diff_sptr_map map, var_diff_sptrs_type &sorted)
Sort the values of a unsigned_var_diff_sptr_map map and store the result into a vector of var_diff_sp...
void sort_string_fn_parm_diff_sptr_map(const unsigned_fn_parm_diff_sptr_map &map, vector< fn_parm_diff_sptr > &sorted)
Sort a map of fn_parm_diff by the indexes of the function parameters.
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.
void sort_artifacts_set(const artifact_sptr_set_type &set, vector< type_or_decl_base_sptr > &sorted)
Sort the set of ABI artifacts contained in a artifact_sptr_set_type.
unordered_map< string, decl_base_sptr > string_decl_base_sptr_map
Convenience typedef for a map which key is a string and which value is a decl_base_sptr.
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_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.
unordered_set< diff_sptr, diff_sptr_hasher > unordered_diff_sptr_set
Convenience typedef for an unoredered set of diff_sptr.
void sort_string_var_ptr_map(const string_var_ptr_map &map, vector< const var_decl * > &sorted)
Sort a map of string -> pointer to var_decl.
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.
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
Definition: abg-fwd.h:266
ssize_t get_member_function_vtable_offset(const function_decl &f)
Get the vtable offset of a member function.
Definition: abg-ir.cc:6744
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:550
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
Definition: abg-ir.h:888
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:8736
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:27971
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
Definition: abg-fwd.h:253
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:27706
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:121
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
Definition: abg-fwd.h:137
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
Definition: abg-ir.cc:10481
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
Definition: abg-ir.cc:6350
bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
Definition: abg-ir.cc:6807
bool is_data_member(const var_decl &v)
Test if a var_decl is a data member.
Definition: abg-ir.cc:5847
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:1639
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 added_variable_is_suppressed(const var_decl *var) const
Test if the change reports for a given added variable have been suppressed.
bool deleted_unreachable_type_is_suppressed(const type_base *t) const
Test if a deleted type that is unreachable from public interface has been suppressed by a suppression...
bool deleted_variable_is_suppressed(const var_decl *var) const
Test if the change reports for a give given deleted variable has been deleted.
bool deleted_unrefed_var_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given deleted variable symbol (that is not referenced by any debug i...
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 ...
void clear_redundancy_categorization()
Walk the changed functions and variables diff nodes and clear the redundancy categorization they migh...
void count_leaf_changes(size_t &num_changes, size_t &num_filtered)
Count the number of leaf changes as well as the number of the changes that have been filtered out.
void count_leaf_type_changes(size_t &num_type_changes, size_t &num_type_changes_filtered)
Count the number of leaf *type* changes as well as the number of the leaf type changes that have been...
bool added_unrefed_fn_sym_is_suppressed(const elf_symbol *) const
Test if the change reports for a given added function symbol (that is not referenced by any debug inf...
bool deleted_function_is_suppressed(const function_decl *fn) const
Test if the change reports for a given deleted function have been deleted.
void apply_supprs_to_added_removed_fns_vars_unreachable_types()
Apply suppression specifications for this corpus diff to the set of added/removed functions/variables...
void emit_diff_stats(const diff_stats &stats, ostream &out, const string &indent)
Emit the summary of the functions & variables that got removed/changed/added.
bool added_function_is_suppressed(const function_decl *fn) const
Test if the change reports for a give given added function has been deleted.
void clear_lookup_tables()
Clear the lookup tables useful for reporting an enum_diff.
A comparison functor to compare two data members based on their offset.
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.