mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-23 18:22:08 +00:00
2a77bead11
* include/abg-comp-filter.h (apply_filter): Declare new overload that takes a corpus_diff_sptr ... * src/abg-comp-filter.cc (apply_filter): ... and define it. On the existing overload for diff_sptr, make sure to traverse all diff nodes, even those that have already been traversed. * include/abg-comparison.h (enum diff_category): Remove NOT_REDUNDANT_CATEGORY, add REDUNDANT_CATEGORY. (operator&=, +operator<<): Declare new operators for enum diff_category. (diff_context::{forbid_traversing_a_node_twice, traversing_a_node_twice_is_forbidden): (diff_context::categorizing_redundancy): Remove this declaration. (diff_context::maybe_apply_filters): Declare a new overload that takes a corpus_diff_sptr. And a take a new flag that says if it should visit all nodes including those that have already been visited. (diff::priv_): Make this data member protected. (diff::{begin_traversing, is_traversing, end_traversing, finish_diff_type, children_nodes, append_child_node, get_pretty_representation, chain_into_hierarchy, traverse}): Declare new member functions. (distinct_diff::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Likewise. (distinct_diff::traverse): Remove. (pointer_diff::pointer_diff): Take the underlying type diff in parameter. (pointer_diff::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. (pointer_diff::traverse): Remove. (reference_type_def::reference_type_def): Take the underlying type diff in parameter. ({array_type_def, reference_type_def}::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. ({array_type_diff, reference_type_def}::traverse): Remove. (qualified_type_diff::qualified_type_diff): Take the underlying type diff in parameter. ({enum_diff, qualified_type_diff, class_diff}::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. ({enum_diff, qualified_type_diff, class_diff}::traverse): Remove. (is_class_diff): Declare new function. (base_diff::base_diff): Take the underlying type diff in parameter. ({scope_diff, base_diff}::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. ({scope_diff, base_diff}::traverse): Remove. (function_decl_diff::function_decl_diff): Take the return type diff as parameter. ({function_decl_diff, type_decl_diff}::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. ({function_decl_diff, type_decl_diff}::traverse): Remove. (typedef_diff::typedef_diff): Take the underlying type diff as parameter. (typedef::{finish_diff_type, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. ({typedef, translation_unit_diff}::traverse): Remove member function. (corpus_diff::{finish_diff_type, children_nodes, append_child_node, changed_variables, get_pretty_representation, chain_into_hierarchy}): Declare new member functions. (class diff_node_visitor::{visit_begin, visit_end}): Declare new member functions. (propagate_categories, print_diff_tree, categorizing_redundancy) (clear_redundancy_categorization, apply_filters): New functions and function overloads. * src/abg-comparison.cc (TRY_PRE_VISIT, TRY_PRE_VISIT_CLASS_DIFF) (TRY_POST_VISIT, TRY_POST_VISIT_CLASS_DIFF) (CATEGORIZE_REDUNDANCY_FROM_CHILD_NODE) (UPDATE_REDUNDANCY_CATEGORIZATION_FROM_NODE_SUBTREE) (TRAVERSE_DIFF_NODE_AND_PROPAGATE_CATEGORY) (TRAVERSE_MEM_DIFF_NODE_AND_PROPAGATE_CATEGORY) (TRAVERSE_MEM_FN_DIFF_NODE_AND_PROPAGATE_CATEGORY) (ENSURE_DIFF_NODE_TRAVERSED_ONCE) (ENSURE_MEM_DIFF_NODE_TRAVERSED_ONCE): Remove these macros. Hurrah. (diff_context::priv::categorizing_redundancy_): Remove. (diff_context::priv::forbid_traversing_a_node_twice_): Add new data member. (diff_context::priv::priv): Adjust. (diff_context::{forbid_traversing_a_node_twice, traversing_a_node_twice_is_forbidden}): Define new member functions. (diff_context::maybe_apply_filters): Once filters are applied (and categories are set to the relevant diff tree nodes, run a pass over the diff tree to propagate the categories to the relevant diff tree parent nodes. Add an overload for corpus_diff_sptr. (diff_context::categorizing_redundancy): Remove member function. (diff_context::maybe_apply_filters): Define a new overload for corpus_diff_sptr (struct diff::priv::{finished_, traversing_, children_, pretty_representation_}): New data members. (diff::priv::priv): Adjust. (diff::{begin_traversing, is_traversing, end_traversing, finish_diff_type, children_nodes, append_child_node, traverse, set_category, get_pretty_representation, chain_into_hierarchy}): Define new member functions. (diff::is_filtered_out): Do not refer to NOT_REDUNDANT_CATEGORY anymore. Rather, use the new REDUNDANT_CATEGORY. ({distinct_diff, var_diff, pointer_diff, array_diff, reference_diff, qualified_type_diff, enum_diff, class_diff, base_diff, scope_diff, function_decl_diff, type_decl_diff, typedef_diff}::{get_pretty_representation, chain_into_hierarchy, finish_diff_type}): Define new member functions. ({distinct_diff, var_diff, pointer_diff, array_diff, reference_diff, qualified_type_diff, enum_diff, class_diff, base_diff, scope_diff, function_decl_diff, type_decl_diff, typedef_diff, translation_unit_diff}::traverse): Remove member functions. (operator&=, operator<<): Define new operators for diff_category. ({function_decl_diff, typedef_diff}::priv::priv): Add a new constructor. (pointer_diff::{priv::priv, pointer_diff}) (reference_diff::{priv::priv, reference_diff}) (qualified_type_diff::{priv::priv, qualified_type_diff}) (enum_diff::{priv::priv, enum_diff}, base_diff::{priv::priv, base_diff}, function_decl_diff::function_decl_diff): Take the underlying type diff in parameter. (compute_diff): Adjust the pointer_diff, reference_diff, qualified_type_diff, base_diff, function_decl_diff overloads. (class_diff::priv::{count_filtered_bases, count_filtered_subtype_changed_dm, count_filtered_changed_dm, count_filtered_changed_mem_fns, count_filtered_inserted_mem_fns, count_filtered_deleted_mem_fns}): Adjust for the call to diff_context::maybe_apply_filters. (corpus_diff::priv::{finished_, pretty_representation_}): New data member. (corpus_diff::priv::priv): New constructor. (corpus_diff::priv::clear_redundancy_categorization): Define new member function. (corpus_diff::priv::apply_filters_and_compute_diff_stats): Adjust for call to diff_context::maybe_apply_filters. Also, call clear_redundancy_categorization at the end. (corpus_diff::priv::categorize_redundant_changed_sub_nodes): Revisit logic. (corpus_diff::{chain_into_hierarchy, finish_diff_type, children_nodes, append_child_node, changed_variables, get_pretty_representation}): Define new member functions. (corpus_diff::report): Categorize redundancy for every top level function/variable diff. (corpus_diff::traverse): Adjust to the new traversing interface. (diff_node_visitor::{visit_begin, visit_end}): Define new member functions. (struct category_propagation_visitor, struct diff_node_printer) (struct redundancy_marking_visitor, struct redundancy_clearing_visitor): New diff tree node visitors. (propagate_categories, print_diff_tree, categorize_redundancy) (clear_redundancy_categorization, apply_filters): Define new functions. * tests/Makefile.am: Add the new tests/print-diff-tree.cc to the source distribution. Build it into a tests/printdifftree binary. * tools/abidiff.cc (print_diff_tree): Add debugging functions to call from within the debugger. By default, this function and its overloads are not compiled. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
157 lines
7.6 KiB
Plaintext
157 lines
7.6 KiB
Plaintext
Implement generic diff tree walking and port categorization over it
|
|
|
|
* include/abg-comp-filter.h (apply_filter): Declare new overload
|
|
that takes a corpus_diff_sptr ...
|
|
* src/abg-comp-filter.cc (apply_filter): ... and define it. On
|
|
the existing overload for diff_sptr, make sure to traverse all
|
|
diff nodes, even those that have already been traversed.
|
|
* include/abg-comparison.h (enum diff_category): Remove
|
|
NOT_REDUNDANT_CATEGORY, add REDUNDANT_CATEGORY.
|
|
(operator&=, +operator<<): Declare new operators for enum diff_category.
|
|
(diff_context::{forbid_traversing_a_node_twice,
|
|
traversing_a_node_twice_is_forbidden):
|
|
(diff_context::categorizing_redundancy): Remove this declaration.
|
|
(diff_context::maybe_apply_filters): Declare a new overload that
|
|
takes a corpus_diff_sptr. And a take a new flag that says if it
|
|
should visit all nodes including those that have already been
|
|
visited.
|
|
(diff::priv_): Make this data member protected.
|
|
(diff::{begin_traversing, is_traversing, end_traversing,
|
|
finish_diff_type, children_nodes, append_child_node,
|
|
get_pretty_representation, chain_into_hierarchy, traverse}):
|
|
Declare new member functions.
|
|
(distinct_diff::{finish_diff_type, get_pretty_representation,
|
|
chain_into_hierarchy}): Likewise.
|
|
(distinct_diff::traverse): Remove.
|
|
(pointer_diff::pointer_diff): Take the underlying type diff in
|
|
parameter.
|
|
(pointer_diff::{finish_diff_type, get_pretty_representation,
|
|
chain_into_hierarchy}): Declare new member functions.
|
|
(pointer_diff::traverse): Remove.
|
|
(reference_type_def::reference_type_def): Take the underlying type
|
|
diff in parameter.
|
|
({array_type_def, reference_type_def}::{finish_diff_type,
|
|
get_pretty_representation, chain_into_hierarchy}): Declare new
|
|
member functions.
|
|
({array_type_diff, reference_type_def}::traverse): Remove.
|
|
(qualified_type_diff::qualified_type_diff): Take the underlying
|
|
type diff in parameter.
|
|
({enum_diff, qualified_type_diff, class_diff}::{finish_diff_type,
|
|
get_pretty_representation, chain_into_hierarchy}): Declare new
|
|
member functions.
|
|
({enum_diff, qualified_type_diff, class_diff}::traverse): Remove.
|
|
(is_class_diff): Declare new function.
|
|
(base_diff::base_diff): Take the underlying type diff in
|
|
parameter.
|
|
({scope_diff, base_diff}::{finish_diff_type, get_pretty_representation,
|
|
chain_into_hierarchy}): Declare new member functions.
|
|
({scope_diff, base_diff}::traverse): Remove.
|
|
(function_decl_diff::function_decl_diff): Take the return type
|
|
diff as parameter.
|
|
({function_decl_diff, type_decl_diff}::{finish_diff_type,
|
|
get_pretty_representation, chain_into_hierarchy}): Declare new
|
|
member functions.
|
|
({function_decl_diff, type_decl_diff}::traverse): Remove.
|
|
(typedef_diff::typedef_diff): Take the underlying type diff as
|
|
parameter.
|
|
(typedef::{finish_diff_type, get_pretty_representation,
|
|
chain_into_hierarchy}): Declare new member functions.
|
|
({typedef, translation_unit_diff}::traverse): Remove member
|
|
function.
|
|
(corpus_diff::{finish_diff_type, children_nodes,
|
|
append_child_node, changed_variables, get_pretty_representation,
|
|
chain_into_hierarchy}): Declare new member functions.
|
|
(class diff_node_visitor::{visit_begin, visit_end}): Declare new
|
|
member functions.
|
|
(propagate_categories, print_diff_tree, categorizing_redundancy)
|
|
(clear_redundancy_categorization, apply_filters): New functions
|
|
and function overloads.
|
|
* src/abg-comparison.cc (TRY_PRE_VISIT, TRY_PRE_VISIT_CLASS_DIFF)
|
|
(TRY_POST_VISIT, TRY_POST_VISIT_CLASS_DIFF)
|
|
(CATEGORIZE_REDUNDANCY_FROM_CHILD_NODE)
|
|
(UPDATE_REDUNDANCY_CATEGORIZATION_FROM_NODE_SUBTREE)
|
|
(TRAVERSE_DIFF_NODE_AND_PROPAGATE_CATEGORY)
|
|
(TRAVERSE_MEM_DIFF_NODE_AND_PROPAGATE_CATEGORY)
|
|
(TRAVERSE_MEM_FN_DIFF_NODE_AND_PROPAGATE_CATEGORY)
|
|
(ENSURE_DIFF_NODE_TRAVERSED_ONCE)
|
|
(ENSURE_MEM_DIFF_NODE_TRAVERSED_ONCE): Remove these macros.
|
|
Hurrah.
|
|
(diff_context::priv::categorizing_redundancy_): Remove.
|
|
(diff_context::priv::forbid_traversing_a_node_twice_): Add new
|
|
data member.
|
|
(diff_context::priv::priv): Adjust.
|
|
(diff_context::{forbid_traversing_a_node_twice,
|
|
traversing_a_node_twice_is_forbidden}): Define new member
|
|
functions.
|
|
(diff_context::maybe_apply_filters): Once filters are applied (and
|
|
categories are set to the relevant diff tree nodes, run a pass
|
|
over the diff tree to propagate the categories to the relevant
|
|
diff tree parent nodes. Add an overload for corpus_diff_sptr.
|
|
(diff_context::categorizing_redundancy): Remove member function.
|
|
(diff_context::maybe_apply_filters): Define a new overload for
|
|
corpus_diff_sptr
|
|
(struct diff::priv::{finished_, traversing_, children_,
|
|
pretty_representation_}): New data members.
|
|
(diff::priv::priv): Adjust.
|
|
(diff::{begin_traversing, is_traversing, end_traversing,
|
|
finish_diff_type, children_nodes, append_child_node, traverse,
|
|
set_category, get_pretty_representation, chain_into_hierarchy}):
|
|
Define new member functions.
|
|
(diff::is_filtered_out): Do not refer to NOT_REDUNDANT_CATEGORY
|
|
anymore. Rather, use the new REDUNDANT_CATEGORY.
|
|
({distinct_diff, var_diff, pointer_diff, array_diff,
|
|
reference_diff, qualified_type_diff, enum_diff, class_diff,
|
|
base_diff, scope_diff, function_decl_diff, type_decl_diff,
|
|
typedef_diff}::{get_pretty_representation, chain_into_hierarchy,
|
|
finish_diff_type}): Define new member functions.
|
|
({distinct_diff, var_diff, pointer_diff, array_diff,
|
|
reference_diff, qualified_type_diff, enum_diff, class_diff,
|
|
base_diff, scope_diff, function_decl_diff, type_decl_diff,
|
|
typedef_diff, translation_unit_diff}::traverse): Remove member
|
|
functions.
|
|
(operator&=, operator<<): Define new operators for diff_category.
|
|
({function_decl_diff, typedef_diff}::priv::priv): Add a new
|
|
constructor.
|
|
(pointer_diff::{priv::priv, pointer_diff})
|
|
(reference_diff::{priv::priv, reference_diff})
|
|
(qualified_type_diff::{priv::priv, qualified_type_diff})
|
|
(enum_diff::{priv::priv, enum_diff}, base_diff::{priv::priv,
|
|
base_diff}, function_decl_diff::function_decl_diff): Take the
|
|
underlying type diff in parameter.
|
|
(compute_diff): Adjust the pointer_diff, reference_diff,
|
|
qualified_type_diff, base_diff, function_decl_diff overloads.
|
|
(class_diff::priv::{count_filtered_bases,
|
|
count_filtered_subtype_changed_dm, count_filtered_changed_dm,
|
|
count_filtered_changed_mem_fns, count_filtered_inserted_mem_fns,
|
|
count_filtered_deleted_mem_fns}): Adjust for the call to
|
|
diff_context::maybe_apply_filters.
|
|
(corpus_diff::priv::{finished_, pretty_representation_}): New data
|
|
member.
|
|
(corpus_diff::priv::priv): New constructor.
|
|
(corpus_diff::priv::clear_redundancy_categorization): Define new
|
|
member function.
|
|
(corpus_diff::priv::apply_filters_and_compute_diff_stats):
|
|
Adjust for call to diff_context::maybe_apply_filters. Also, call
|
|
clear_redundancy_categorization at the end.
|
|
(corpus_diff::priv::categorize_redundant_changed_sub_nodes):
|
|
Revisit logic.
|
|
(corpus_diff::{chain_into_hierarchy, finish_diff_type,
|
|
children_nodes, append_child_node, changed_variables,
|
|
get_pretty_representation}): Define new member functions.
|
|
(corpus_diff::report): Categorize redundancy for every top level
|
|
function/variable diff.
|
|
(corpus_diff::traverse): Adjust to the new traversing interface.
|
|
(diff_node_visitor::{visit_begin, visit_end}): Define new member
|
|
functions.
|
|
(struct category_propagation_visitor, struct diff_node_printer)
|
|
(struct redundancy_marking_visitor, struct
|
|
redundancy_clearing_visitor): New diff tree node visitors.
|
|
(propagate_categories, print_diff_tree, categorize_redundancy)
|
|
(clear_redundancy_categorization, apply_filters): Define new
|
|
functions.
|
|
* tests/Makefile.am: Add the new tests/print-diff-tree.cc to the
|
|
source distribution. Build it into a tests/printdifftree binary.
|
|
* tools/abidiff.cc (print_diff_tree): Add debugging functions to
|
|
call from within the debugger. By default, this function and its
|
|
overloads are not compiled.
|