Libabigail doesn't yet support generic range types like in Ada.
Ranges are supported as a kind of implementation detail of array
types. But then its use like in the construct below is not supported:
type My_Int is range 0 .. 5;
function My_Function return My_Int;
Here, the integer type "My_Int" can take the discrete values that go
from 0 to 5. It's represented in the DWARF debug info as being a
range type of length 6 and whose underlying type has a size of 8 bits.
This patch adds support for a range type to be (de-)serialized from
and to abixml, diffed, diff-analyzed and diff-reported.
The ABIXML version number has been bumped from 2.1 to 2.2 accordingly.
* configure.ac: Bump the abixml version to 2.2 from 2.1
* include/abg-comparison.h (diff_maps::get_subrange_diff_map):
Declare new member functions.
(class subrange_diff): Define new class.
(subrange_diff_sptr): Define new typedef.
(compute_diff): New overload for subrange_diff.
(is_subrange_diff): Declare new function.
* include/abg-ir.h (equals): Declare an overload for
subrange_type.
* include/abg-reporter.h (reporter_base::report): Declare an
overload for subrange_diff.
(default_reporter::report_underlying_changes_of_qualified_type):
Declare member function.
(leaf_reporter::report): Declare and overload for subrange_diff.
Declare new member function.
* include/abg-tools-utils.h
(get_anonymous_subrange_internal_name_prefix): Declare new function.
* src/abg-comparison-priv.h (struct subrange_diff::priv): Define
new type.
* src/abg-comparison.cc (diff_maps::priv::subrange_diff_map_):
Define data member.
(diff_maps::get_subrange_diff_map): Define member function.
(is_subrange_diff, compute_diff): Define new functions.
(compute_diff_for_types): Handle array_type::subrange_type types.
(subrange_diff::{subrange_diff, first_subrange, second_subrange,
get_pretty_representation, has_changes, has_local_changes, report,
chain_into_hierarchy}): Define member functions.
(diff_maps::insert_diff_node): Handle subrange diff nodes.
(corpus_diff::priv::count_leaf_type_changes): Count subranges diff
nodes.
* src/abg-default-reporter.cc (default_reporter::report): Define
an overload for subrange_diff.
* src/abg-ir.cc (has_generic_anonymous_internal_type_name):
Support subrange types.
* src/abg-leaf-reporter.cc (report_type_changes_from_diff_maps):
Report about subrange types.
(leaf_reporter::report): Define and overload for subrange_diff
nodes.
* src/abg-reader.cc (build_subrange_type): Add a boolean to add
the subrange type to the current scope.
(build_array_type_def): Adjust when calling build_subrange_type.
(build_type): Support building subrange types.
* src/abg-reporter-priv.cc (represent): Define a new overload for
the subrange_diff type.
* src/abg-reporter-priv.h (represent): Declare a new overload for
the subrange_diff type.
* src/abg-tools-utils.cc (ANONYMOUS_SUBRANGE_INTERNAL_NAME)
(ANONYMOUS_SUBRANGE_INTERNAL_NAME_LEN): Define new static const
variables.
(get_anonymous_subrange_internal_name_prefix): Define new
function.
* src/abg-writer.cc (write_array_subrange_type): Define new static
function.
(write_decl): Support emitting subrange_types.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt:
New reference output.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt:
Likewise.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.ad{b,s}:
Source code of the input binary below.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.o:
New input test.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.ad{b,s}:
Source code of the input binary below.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.o:
New input test.
* tests/data/Makefile.am: Add the new test files to source
distributions.
* tests/test-abidiff-exit.cc (in_out_specs): Add the new tests
input above to this test harness.
* tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi:
Adjust.
* tests/data/test-annotate/libtest23.so.abi: Likewise.
* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Likewise.
* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-annotate/test-anonymous-members-0.o.abi:
Likewise.
* tests/data/test-annotate/test0.abi: Likewise.
* tests/data/test-annotate/test1.abi: Likewise.
* tests/data/test-annotate/test13-pr18894.so.abi: Likewise.
* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-annotate/test2.so.abi: Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
* tests/data/test-annotate/test3.so.abi: Likewise.
* tests/data/test-annotate/test4.so.abi: Likewise.
* tests/data/test-annotate/test5.o.abi: Likewise.
* tests/data/test-annotate/test6.so.abi: Likewise.
* tests/data/test-annotate/test7.so.abi: Likewise.
* tests/data/test-annotate/test8-qualified-this-pointer.so.abi:
Likewise.
* tests/data/test-read-btf/test0.o.abi: Likewise.
* tests/data/test-read-btf/test1.o.abi: Likewise.
* tests/data/test-read-ctf/PR27700/test-PR27700.abi: Likewise.
* tests/data/test-read-ctf/test-PR26568-1.o.abi: Likewise.
* tests/data/test-read-ctf/test-PR26568-2.o.abi: Likewise.
* tests/data/test-read-ctf/test-alias.o.abi: Likewise.
* tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi:
Likewise.
* tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi:
Likewise.
* tests/data/test-read-ctf/test-anonymous-fields.o.abi: Likewise.
* tests/data/test-read-ctf/test-array-mdimension.abi: Likewise.
* tests/data/test-read-ctf/test-array-of-pointers.abi: Likewise.
* tests/data/test-read-ctf/test-array-size.abi: Likewise.
* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
* tests/data/test-read-ctf/test-callback.abi: Likewise.
* tests/data/test-read-ctf/test-callback2.abi: Likewise.
* tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi:
Likewise.
* tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi:
Likewise.
* tests/data/test-read-ctf/test-const-array.abi: Likewise.
* tests/data/test-read-ctf/test-dynamic-array.o.abi: Likewise.
* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Likewise.
* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
* tests/data/test-read-ctf/test-enum.o.abi: Likewise.
* tests/data/test-read-ctf/test-fallback.abi: Likewise.
* tests/data/test-read-ctf/test-forward-type-decl.abi: Likewise.
* tests/data/test-read-ctf/test-functions-declaration.abi:
Likewise.
* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
* tests/data/test-read-ctf/test-list-struct.abi: Likewise.
* tests/data/test-read-ctf/test0.abi: Likewise.
* tests/data/test-read-ctf/test0.hash.abi: Likewise.
* tests/data/test-read-ctf/test1.so.abi: Likewise.
* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
* tests/data/test-read-ctf/test2.so.abi: Likewise.
* tests/data/test-read-ctf/test2.so.hash.abi: Likewise.
* tests/data/test-read-ctf/test3.so.abi: Likewise.
* tests/data/test-read-ctf/test3.so.hash.abi: Likewise.
* tests/data/test-read-ctf/test4.so.abi: Likewise.
* tests/data/test-read-ctf/test4.so.hash.abi: Likewise.
* tests/data/test-read-ctf/test5.o.abi: Likewise.
* tests/data/test-read-ctf/test7.o.abi: Likewise.
* tests/data/test-read-ctf/test8.o.abi: Likewise.
* tests/data/test-read-ctf/test9.o.abi: Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
Likewise.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
* tests/data/test-read-dwarf/PR24378-fn-is-not-scope.abi:
Likewise.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
* tests/data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi:
Likewise.
* tests/data/test-read-dwarf/PR26261/PR26261-exe.abi: Likewise.
* tests/data/test-read-dwarf/PR27700/test-PR27700.abi: Likewise.
* tests/data/test-read-dwarf/PR28584/PR28584-smv.clang.o.abi:
Likewise.
* tests/data/test-read-dwarf/PR29443-missing-xx.o.abi: Likewise.
* tests/data/test-read-dwarf/PR29692-kdelibs3-libkjava.so.1.0.0.abi:
Likewise.
* tests/data/test-read-dwarf/libtest23.so.abi: Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-read-dwarf/test-PR26568-1.o.abi: Likewise.
* tests/data/test-read-dwarf/test-PR26568-2.o.abi: Likewise.
* tests/data/test-read-dwarf/test-fallback.abi: Likewise.
* tests/data/test-read-dwarf/test-libaaudio.so.abi: Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test-suppressed-alias.o.abi:
Likewise.
* tests/data/test-read-dwarf/test0.abi: Likewise.
* tests/data/test-read-dwarf/test0.hash.abi: Likewise.
* tests/data/test-read-dwarf/test1.abi: Likewise.
* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Likewise.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-read-dwarf/test2.so.abi: Likewise.
* tests/data/test-read-dwarf/test2.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Likewise.
* tests/data/test-read-dwarf/test3-alias-1.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-2.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-3.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-4.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3.so.abi: Likewise.
* tests/data/test-read-dwarf/test3.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test4.so.abi: Likewise.
* tests/data/test-read-dwarf/test4.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test5.o.abi: Likewise.
* tests/data/test-read-dwarf/test5.o.hash.abi: Likewise.
* tests/data/test-read-dwarf/test6.so.abi: Likewise.
* tests/data/test-read-dwarf/test6.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test7.so.abi: Likewise.
* tests/data/test-read-dwarf/test7.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi: Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
* tests/data/test-read-write/test-crc.xml: Likewise.
* tests/data/test-read-write/test26.xml: Likewise.
* tests/data/test-read-write/test27.xml: Likewise.
* tests/data/test-read-write/test28-without-std-fns-ref.xml: Likewise.
* tests/data/test-read-write/test28-without-std-vars-ref.xml:
Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
VERSION_MAJOR=version_major
VERSION_MINOR=version_minor
VERSION_REVISION=0
+dnl The major version number of the abixml version should be changed
+dnl only if a new version of libabigail cannot read an old version of
+dnl abixml. This should be very rare and should be avoided as much as
+dnl possible.
ABIXML_VERSION_MAJOR=2
-ABIXML_VERSION_MINOR=1
+dnl The minor version number of the abixml version should be changed
+dnl each time and old version of libabigail can't handle a new version
+dnl of abixml. Note however that when the major version number is
+dnl changed, the minor version number should be set to zero.
+ABIXML_VERSION_MINOR=2
LIBABIGAIL_SO_CURRENT=libabigail_so_current
LIBABIGAIL_SO_REVISION=libabigail_so_revision
LIBABIGAIL_SO_AGE=libabigail_so_age
string_diff_ptr_map&
get_typedef_diff_map();
+ const string_diff_ptr_map&
+ get_subrange_diff_map() const;
+
+ string_diff_ptr_map&
+ get_subrange_diff_map();
+
const string_diff_ptr_map&
get_array_diff_map() const;
reference_type_def_sptr second,
diff_context_sptr ctxt);
+
+class subrange_diff;
+
+/// A convenience typedef for a shared pointer to subrange_diff type.
+typedef shared_ptr<subrange_diff> subrange_diff_sptr;
+
+/// The abstraction of the diff between two subrange types.
+class subrange_diff : public type_diff_base
+{
+ struct priv;
+ std::unique_ptr<priv> priv_;
+
+protected:
+ subrange_diff(const array_type_def::subrange_sptr& first,
+ const array_type_def::subrange_sptr& second,
+ const diff_sptr& underlying_type_diff,
+ const diff_context_sptr ctxt = diff_context_sptr());
+
+public:
+ const array_type_def::subrange_sptr
+ first_subrange() const;
+
+ const array_type_def::subrange_sptr
+ second_subrange() const;
+
+ const diff_sptr
+ underlying_type_diff() const;
+
+ virtual const string&
+ get_pretty_representation() const;
+
+ virtual bool
+ has_changes() const;
+
+ virtual enum change_kind
+ has_local_changes() const;
+
+ virtual void
+ report(ostream&, const string& indent = "") const;
+
+ virtual void
+ chain_into_hierarchy();
+
+ friend subrange_diff_sptr
+ compute_diff(array_type_def::subrange_sptr first,
+ array_type_def::subrange_sptr second,
+ diff_context_sptr ctxt);
+}; // end subrange_diff
+
+subrange_diff_sptr
+compute_diff(array_type_def::subrange_sptr first,
+ array_type_def::subrange_sptr second,
+ diff_context_sptr ctxt);
+
+
class array_diff;
/// Convenience typedef for a shared pointer on a @ref
const class_or_union_diff*
is_anonymous_class_or_union_diff(const diff* d);
+const subrange_diff*
+is_subrange_diff(const diff* diff);
+
const array_diff*
is_array_diff(const diff* diff);
array_type_def::subrange_sptr
is_subrange_type(const type_or_decl_base_sptr &type);
+bool
+equals(const array_type_def::subrange_type&,
+ const array_type_def::subrange_type&,
+ change_kind*);
+
bool
equals(const enum_type_decl&, const enum_type_decl&, change_kind*);
class distinct_diff;
class pointer_diff;
class reference_diff;
+class subrange_diff;
class array_diff;
class base_diff;
class class_or_union_diff;
report(const array_diff& d, std::ostream& out,
const std::string& indent = "") const = 0;
+ virtual void
+ report(const subrange_diff& d, std::ostream& out,
+ const std::string& indent = "") const = 0;
+
virtual void
report(const base_diff& d, std::ostream& out,
const std::string& indent = "") const = 0;
std::ostream& out,
const std::string& indent) const;
+ void
+ report_underlying_changes_of_qualified_type (const qualified_type_diff& d,
+ ostream& out,
+ const string& indent) const;
+
virtual void
report(const qualified_type_diff& d, std::ostream& out,
const std::string& indent = "") const;
report(const function_type_diff& d, std::ostream& out,
const std::string& indent = "") const;
+ virtual void
+ report(const subrange_diff& d, std::ostream& out,
+ const std::string& indent = "") const;
+
virtual void
report(const array_diff& d, std::ostream& out,
const std::string& indent = "") const;
report(const function_type_diff& d, std::ostream& out,
const std::string& indent = "") const;
+ virtual void
+ report(const subrange_diff& d, std::ostream& out,
+ const std::string& indent = "") const;
+
virtual void
report(const array_diff& d, std::ostream& out,
const std::string& indent = "") const;
const char* get_anonymous_struct_internal_name_prefix();
const char* get_anonymous_union_internal_name_prefix();
const char* get_anonymous_enum_internal_name_prefix();
+const char* get_anonymous_subrange_internal_name_prefix();
bool file_exists(const string&);
bool is_regular_file(const string&);
{}
};//end struct pointer_diff::priv
+/// The internal type for the impl idiom implementation of @ref
+/// subrange_diff.
+struct subrange_diff::priv
+{
+ diff_sptr underlying_type_diff_;
+
+ priv(diff_sptr u)
+ : underlying_type_diff_(u)
+ {}
+}; // end struct subrange_diff::priv
+
struct array_diff::priv
{
/// The diff between the two array element types.
is_typedef_diff(const diff *diff)
{return dynamic_cast<const typedef_diff*>(diff);}
+/// Test if a diff node is a @ref subrange_diff node.
+///
+/// @param diff the diff node to consider.
+///
+/// @return a non-nil pointer to a @ref subrange_diff iff @p diff is a
+/// @ref subrange_diff node.
+const subrange_diff*
+is_subrange_diff(const diff* diff)
+{return dynamic_cast<const subrange_diff*>(diff);}
+
/// Test if a diff node is a @ref array_diff node.
///
/// @param diff the diff node to consider.
||(d = try_to_diff<class_decl>(f, s,ctxt))
||(d = try_to_diff<pointer_type_def>(f, s, ctxt))
||(d = try_to_diff<reference_type_def>(f, s, ctxt))
+ ||(d = try_to_diff<array_type_def::subrange_type>(f, s, ctxt))
||(d = try_to_diff<array_type_def>(f, s, ctxt))
||(d = try_to_diff<qualified_type_def>(f, s, ctxt))
||(d = try_to_diff<typedef_decl>(f, s, ctxt))
// </pointer_type_def>
+// <subrange_diff >
+
+/// Constructor of the @ref subrange_diff diff node type.
+///
+/// @param first the first subrange type to consider for the diff.
+///
+/// @param second the second subrange type to consider for the diff.
+///
+/// @param underlying_type_diff the underlying type diff between @p
+/// first and @p second.
+///
+/// @param ctxt the diff context to use.
+subrange_diff::subrange_diff
+(const array_type_def::subrange_sptr& first,
+ const array_type_def::subrange_sptr& second,
+ const diff_sptr& underlying_type_diff,
+ const diff_context_sptr ctxt)
+ : type_diff_base(first, second, ctxt),
+ priv_(new priv(underlying_type_diff))
+{}
+
+
+/// Getter of the first subrange of the current instance @ref
+/// subrange_diff.
+///
+/// @return The first subrange of the current instance @ref subrange_diff.
+const array_type_def::subrange_sptr
+subrange_diff::first_subrange() const
+{return is_subrange_type(first_subject());}
+
+/// Getter of the second subrange of the current instance @ref
+/// subrange_diff.
+///
+/// @return The second subrange of the current instance @ref
+/// subrange_diff.
+const array_type_def::subrange_sptr
+subrange_diff::second_subrange() const
+{return is_subrange_type(second_subject());}
+
+/// Getter of the diff node of the underlying types of the current
+/// @ref subrange_diff diff node.
+///
+/// @return The diff node of the underlying types of the current @ref
+/// subrange_diff diff node.
+const diff_sptr
+subrange_diff::underlying_type_diff() const
+{return priv_->underlying_type_diff_;}
+
+/// Getter the pretty representation of the @ref subrange_diff diff
+/// node.
+///
+/// @return The pretty representation of the @ref subrange_diff diff node.
+const string&
+subrange_diff::get_pretty_representation() const
+{
+ if (diff::priv_->pretty_representation_.empty())
+ {
+ std::ostringstream o;
+ o << "subrange_diff["
+ << first_subject()->get_pretty_representation()
+ << ","
+ << second_subject()->get_pretty_representation()
+ << "]";
+ diff::priv_->pretty_representation_ = o.str();
+ }
+ return diff::priv_->pretty_representation_;
+}
+
+/// Test if the current @ref subrange_diff node carries any change.
+///
+/// @return true iff the current @ref subrange_diff node carries any
+/// change.
+bool
+subrange_diff::has_changes() const
+{return *first_subrange() != *second_subrange();}
+
+/// Test if the current @ref subrange_diff node carries any local
+/// change.
+///
+/// @return true iff the current @ref subrange_diff node carries any
+/// local change.
+enum change_kind
+subrange_diff::has_local_changes() const
+{
+ ir::change_kind k = ir::NO_CHANGE_KIND;
+ if (!equals(*first_subrange(), *second_subrange(), &k))
+ return k & ir::ALL_LOCAL_CHANGES_MASK;
+ return ir::NO_CHANGE_KIND;
+}
+
+/// Report about the changes carried by this node.
+///
+/// @param out the output stream to send the report to.
+///
+/// @param indent the indentation string to use.
+void
+subrange_diff::report(ostream& out, const string& indent) const
+{context()->get_reporter()->report(*this, out, indent);}
+
+/// Populate the vector of children node of the @ref diff base type
+/// sub-object of this instance of @ref subrange_diff.
+///
+/// The children node can then later be retrieved using
+/// diff::children_node().
+void
+subrange_diff::chain_into_hierarchy()
+{append_child_node(underlying_type_diff());}
+
+/// Compute the diff between two instances of @ref subrange_diff.
+///
+/// Note that the two decls must have been created in the same @ref
+/// environment, otherwise, this function aborts.
+///
+/// @param first the first @ref subrange_diff to consider for the diff.
+///
+/// @param second the second @ref subrange_diff to consider for the diff.
+///
+/// @param ctxt the diff context to use.
+///
+/// @return the resulting diff between the two @ref subrange_diff.
+subrange_diff_sptr
+compute_diff(array_type_def::subrange_sptr first,
+ array_type_def::subrange_sptr second,
+ diff_context_sptr ctxt)
+{
+ diff_sptr d = compute_diff_for_types(first->get_underlying_type(),
+ second->get_underlying_type(),
+ ctxt);
+
+ subrange_diff_sptr result(new subrange_diff(first, second, d, ctxt));
+ ctxt->initialize_canonical_diff(result);
+ return result;
+}
+
+//</subrange_diff >
+
+
// <array_type_def>
/// Populate the vector of children node of the @ref diff base type
string_diff_ptr_map class_diff_map_;
string_diff_ptr_map union_diff_map_;
string_diff_ptr_map typedef_diff_map_;
+ string_diff_ptr_map subrange_diff_map_;
string_diff_ptr_map array_diff_map_;
string_diff_ptr_map reference_diff_map_;
string_diff_ptr_map function_type_diff_map_;
diff_maps::get_typedef_diff_map()
{return priv_->typedef_diff_map_;}
+/// Getter of the map that contains subrange type diffs.
+///
+/// @return the map that contains subrange type diffs.
+const string_diff_ptr_map&
+diff_maps::get_subrange_diff_map() const
+{return priv_->subrange_diff_map_;}
+
+/// Getter of the map that contains subrange type diffs.
+///
+/// @return the map that contains subrange type diffs.
+string_diff_ptr_map&
+diff_maps::get_subrange_diff_map()
+{return priv_->subrange_diff_map_;}
+
/// Getter of the map that contains array type diffs.
///
/// @return the map that contains array type diffs.
get_union_diff_map()[n] = const_cast<union_diff*>(d);
else if (const typedef_diff *d = is_typedef_diff(dif))
get_typedef_diff_map()[n] = const_cast<typedef_diff*>(d);
+ else if (const subrange_diff *d = is_subrange_diff(dif))
+ get_subrange_diff_map()[n] = const_cast<subrange_diff*>(d);
else if (const array_diff *d = is_array_diff(dif))
get_array_diff_map()[n] = const_cast<array_diff*>(d);
else if (const reference_diff *d = is_reference_diff(dif))
num_changes, num_filtered);
do_count_diff_map_changes(leaf_diffs_.get_typedef_diff_map(),
num_changes, num_filtered);
+ do_count_diff_map_changes(leaf_diffs_.get_subrange_diff_map(),
+ num_changes, num_filtered);
do_count_diff_map_changes(leaf_diffs_.get_array_diff_map(),
num_changes, num_filtered);
do_count_diff_map_changes(leaf_diffs_.get_distinct_diff_map(),
report_local_function_type_changes(d, out, indent);
}
+/// Report about the change carried by a @ref subrange_diff diff node
+/// in a serialized form.
+///
+/// @param d the diff node to consider.
+///
+/// @param out the output stream to report to.
+///
+/// @param indent the indentation string to use in the report.
+void
+default_reporter::report(const subrange_diff& d, std::ostream& out,
+ const std::string& indent) const
+{
+ if (!diff_to_be_reported(&d))
+ return;
+
+ RETURN_IF_BEING_REPORTED_OR_WAS_REPORTED_EARLIER3(d.first_subrange(),
+ d.second_subrange(),
+ "range type");
+
+ represent(d, d.context(), out,indent, /*local_only=*/false);
+}
+
/// Report a @ref array_diff in a serialized form.
///
/// @param d the @ref array_diff to consider.
static bool
has_generic_anonymous_internal_type_name(const decl_base *d)
{
- return is_class_or_union_type(d) || is_enum_type(d);
+ return (is_class_or_union_type(d)
+ || is_enum_type(d)
+ || is_subrange_type(d));
}
/// Return the generic internal name of an anonymous type.
else if (is_enum_type(d))
result =
env.intern(tools_utils::get_anonymous_enum_internal_name_prefix());
+ else if (is_subrange_type(d))
+ result =
+ env.intern(tools_utils::get_anonymous_subrange_internal_name_prefix());
else
ABG_ASSERT_NOT_REACHED;
// typedefs
report_diffs(reporter, maps.get_typedef_diff_map(), out, indent);
+ // subranges
+ report_diffs(reporter, maps.get_subrange_diff_map(), out, indent);
+
// arrays
report_diffs(reporter, maps.get_array_diff_map(), out, indent);
out << "\n";
}
+/// Report about the change carried by a @ref subrange_diff diff node
+/// in a serialized form.
+///
+/// @param d the diff node to consider.
+///
+/// @param out the output stream to report to.
+///
+/// @param indent the indentation string to use in the report.
+void
+leaf_reporter::report(const subrange_diff& d, std::ostream& out,
+ const std::string& indent) const
+{
+ if (!diff_to_be_reported(&d))
+ return;
+
+ RETURN_IF_BEING_REPORTED_OR_WAS_REPORTED_EARLIER3(d.first_subrange(),
+ d.second_subrange(),
+ "range type");
+
+ represent(d, d.context(), out,indent, /*local_only=*/true);
+
+ maybe_report_interfaces_impacted_by_diff(&d, out, indent);
+}
+
/// Report the changes carried by a @ref array_diff node.
///
/// @param out the output stream to report to.
build_function_type(reader&, const xmlNodePtr, bool);
static array_type_def::subrange_sptr
-build_subrange_type(reader&, const xmlNodePtr);
+build_subrange_type(reader&, const xmlNodePtr, bool);
static array_type_def_sptr
build_array_type_def(reader&, const xmlNodePtr, bool);
/// @return a pointer to a newly built array_type_def::subrange_type
/// upon successful completion, a null pointer otherwise.
static array_type_def::subrange_sptr
-build_subrange_type(reader& rdr,
- const xmlNodePtr node)
+build_subrange_type(reader& rdr,
+ const xmlNodePtr node,
+ bool add_to_current_scope)
{
array_type_def::subrange_sptr nil;
maybe_set_artificial_location(rdr, node, p);
p->is_infinite(is_infinite);
+ if (rdr.push_and_key_type_decl(p, id, add_to_current_scope))
+ rdr.map_xml_node_to_decl(node, p);
+
return p;
}
if (xmlStrEqual(n->name, BAD_CAST("subrange")))
{
if (array_type_def::subrange_sptr s =
- build_subrange_type(rdr, n))
+ build_subrange_type(rdr, n, /*add_to_current_scope=*/true))
{
MAYBE_MAP_TYPE_WITH_TYPE_ID(s, n);
if (add_to_current_scope)
|| (t = build_reference_type_def(rdr, node , add_to_current_scope))
|| (t = build_function_type(rdr, node, add_to_current_scope))
|| (t = build_array_type_def(rdr, node, add_to_current_scope))
+ || (t = build_subrange_type(rdr, node, add_to_current_scope))
|| (t = build_enum_type_decl_if_not_suppressed(rdr, node,
add_to_current_scope))
|| (t = build_typedef_decl(rdr, node, add_to_current_scope))
out << "\n";
}
+/// Represent the changes carried by an instance of @ref subrange_diff
+/// that represent a difference between two ranges.
+///
+/// @param diff diff the diff node to represent.
+///
+/// @param ctxt the diff context to use.
+///
+/// @param local_only if true, only display local changes.
+///
+/// @param out the output stream to send the representation to.
+///
+/// @param indent the indentation string to use for the change report.
+void
+represent(const subrange_diff& d,
+ const diff_context_sptr ctxt,
+ ostream& out,
+ const string& indent,
+ bool local_only)
+{
+ array_type_def::subrange_sptr o = d.first_subrange();
+ array_type_def::subrange_sptr n = d.second_subrange();
+ string oor = o->get_pretty_representation();
+ string nr = n->get_pretty_representation();
+ string on = o->get_name();
+ string nn = n->get_name();
+ int64_t olb = o->get_lower_bound();
+ int64_t nlb = n->get_lower_bound();
+ int64_t oub = o->get_upper_bound();
+ int64_t nub = n->get_upper_bound();
+
+ if (on != nn)
+ {
+ out << indent << "name of range changed from '"
+ << on << "' to '" << nn << "'\n";
+ }
+
+ if (olb != nlb)
+ {
+ out << indent << "lower bound of range '"
+ << on
+ << "' change from '";
+ emit_num_value(olb, *ctxt, out);
+ out << "' to '";
+ emit_num_value(nlb, *ctxt, out);
+ out << "'\n";
+ }
+
+ if (oub != nub)
+ {
+ out << indent << "upper bound of range '"
+ << on
+ << "' change from '";
+ emit_num_value(oub, *ctxt, out);
+ out << "' to '";
+ emit_num_value(nub, *ctxt, out);
+ out << "'\n";
+ }
+
+ if (!local_only)
+ {
+ diff_sptr dif = d.underlying_type_diff();
+ if (dif && dif->to_be_reported())
+ {
+ // report range underlying type changes
+ out << indent << "underlying type of range '"
+ << oor << "' changed:\n";
+ dif->report(out, indent + " ");
+ }
+ }
+}
+
/// Report the size and alignment changes of a type.
///
/// @param first the first type to consider.
const string& indent = "",
bool local_only = false);
+void
+represent(const subrange_diff& diff,
+ const diff_context_sptr ctxt,
+ ostream& out,
+ const string& indent = "",
+ bool local_only = false);
+
void
report_size_and_alignment_changes(type_or_decl_base_sptr first,
type_or_decl_base_sptr second,
return false;
}
-static const char* ANONYMOUS_STRUCT_INTERNAL_NAME = "__anonymous_struct__";
-static const char* ANONYMOUS_UNION_INTERNAL_NAME = "__anonymous_union__";
-static const char* ANONYMOUS_ENUM_INTERNAL_NAME = "__anonymous_enum__";
+static const char* ANONYMOUS_STRUCT_INTERNAL_NAME = "__anonymous_struct__";
+static const char* ANONYMOUS_UNION_INTERNAL_NAME = "__anonymous_union__";
+static const char* ANONYMOUS_ENUM_INTERNAL_NAME = "__anonymous_enum__";
+static const char* ANONYMOUS_SUBRANGE_INTERNAL_NAME = "__anonymous_range__";
static int ANONYMOUS_STRUCT_INTERNAL_NAME_LEN =
strlen(ANONYMOUS_STRUCT_INTERNAL_NAME);
get_anonymous_union_internal_name_prefix()
{return ANONYMOUS_UNION_INTERNAL_NAME;}
+static int ANONYMOUS_SUBRANGE_INTERNAL_NAME_LEN =
+ strlen(ANONYMOUS_SUBRANGE_INTERNAL_NAME);
+
/// Getter of the prefix for the name of anonymous enums.
///
/// @reaturn the prefix for the name of anonymous enums.
get_anonymous_enum_internal_name_prefix()
{return ANONYMOUS_ENUM_INTERNAL_NAME;}
+/// Getter of the prefix for the name of anonymous range.
+///
+/// @reaturn the prefix for the name of anonymous range.
+const char*
+get_anonymous_subrange_internal_name_prefix()
+{return ANONYMOUS_SUBRANGE_INTERNAL_NAME;}
+
/// Compare two fully qualified decl names by taking into account that
/// they might have compontents that are anonymous types/namespace names.
///
write_context&, unsigned);
static bool write_array_type_def(const array_type_def_sptr&,
write_context&, unsigned);
+static bool write_array_subrange_type(const array_type_def::subrange_sptr&,
+ write_context&,
+ unsigned);
static bool write_enum_type_decl(const enum_type_decl_sptr&,
write_context&, unsigned);
static bool write_typedef_decl(const typedef_decl_sptr&,
<reference_type_def>(decl), ctxt, indent)
|| write_array_type_def(dynamic_pointer_cast
<array_type_def>(decl), ctxt, indent)
+ || write_array_subrange_type(dynamic_pointer_cast
+ <array_type_def::subrange_type>(decl),
+ ctxt, indent)
|| write_enum_type_decl(dynamic_pointer_cast<enum_type_decl>(decl),
ctxt, indent)
|| write_typedef_decl(dynamic_pointer_cast<typedef_decl>(decl),
test-abidiff-exit/test-allow-type-region-v5.o \
test-abidiff-exit/test-allow-type-suppr2.txt \
test-abidiff-exit/test-allow-type-suppr1.txt \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.adb \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.ads \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.o \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.adb \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.ads \
+test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.o \
\
test-diff-dwarf/test0-v0.cc \
test-diff-dwarf/test0-v0.o \
--- /dev/null
+Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some indirect sub-type change:
+
+ [C] 'function test1__my_int[6] test1__first_function()' at test1.adb:6:1 has some indirect sub-type changes:
+ return type changed:
+ type name changed from 'test1__my_int[6]' to 'test1__my_int[7]'
+ array type size changed from 6000 to 7000
+ array type subrange 1 changed length from 6 to 7
+
+ [C] 'function test1__my_index test1__second_function()' at test1.adb:14:1 has some indirect sub-type changes:
+ return type changed:
+ upper bound of range 'test1__my_index' change from '5' to '6'
+
--- /dev/null
+Leaf changes summary: 3 artifacts changed
+Changed leaf types summary: 1 leaf type changed
+Removed/Changed/Added functions summary: 0 Removed, 2 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some sub-type change:
+
+ [C] 'function test1__my_int[6] test1__first_function()' at test1.adb:6:1 has some sub-type changes:
+ return type changed:
+ type name changed from 'test1__my_int[6]' to 'test1__my_int[7]'
+ array type size changed from 6000 to 7000
+ array type subrange 1 changed length from 6 to 7
+
+ [C] 'function test1__my_index test1__second_function()' at test1.adb:14:1 has some sub-type changes:
+ return type changed:
+ upper bound of range 'test1__my_index' change from '5' to '6'
+
+'<range test1__my_index>[6]' changed:
+ upper bound of range 'test1__my_index' change from '5' to '6'
--- /dev/null
+-- Compile this file with:
+-- gcc -g -c test1.adb
+
+package body Test1 is
+
+function First_Function return My_Int_Array is
+ A : My_Int_Array;
+begin
+ A := (1,2,3,4,5,6);
+ return A;
+end First_Function;
+
+
+function Second_Function return My_Index is
+begin
+ return My_Index'Last;
+end Second_Function;
+
+end Test1;
--- /dev/null
+package Test1 is
+
+type My_Int is range 0 .. 1000;
+type My_Index is range 0 .. 5;
+type My_Int_Array is array (My_Index) of My_Int;
+
+function First_Function return My_Int_Array;
+
+function Second_Function return My_Index;
+
+end Test1;
\ No newline at end of file
--- /dev/null
+-- Compile this file with:
+-- gcc -g -c test1.adb
+
+package body Test1 is
+
+function First_Function return My_Int_Array is
+ A : My_Int_Array;
+begin
+ A := (1,2,3,4,5,6,7);
+ return A;
+end First_Function;
+
+
+function Second_Function return My_Index is
+begin
+ return My_Index'Last;
+end Second_Function;
+
+end Test1;
--- /dev/null
+package Test1 is
+
+type My_Int is range 0 .. 1000;
+type My_Index is range 0 .. 6;
+type My_Int_Array is array (My_Index) of My_Int;
+
+function First_Function return My_Int_Array;
+
+function Second_Function return My_Index;
+
+end Test1;
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-variable-symbols>
<!-- signed char -->
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<!-- foo(S&) -->
<elf-symbol name='_Z3fooR1S' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' soname='libdbus-1.so.3'>
+<abi-corpus version='2.2' soname='libdbus-1.so.3'>
<elf-needed>
<dependency name='librt.so.1'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1' soname='libGLU.so.1'>
+<abi-corpus version='2.2' soname='libGLU.so.1'>
<elf-needed>
<dependency name='libGL.so.1'/>
<dependency name='libstdc++.so.6'/>
-<abi-corpus version='2.1' soname='libtsan.so.0'>
+<abi-corpus version='2.2' soname='libtsan.so.0'>
<elf-needed>
<dependency name='librt.so.1'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1' soname='libharfbuzz.so.0'>
+<abi-corpus version='2.2' soname='libharfbuzz.so.0'>
<elf-needed>
<dependency name='libglib-2.0.so.0'/>
<dependency name='libfreetype.so.6'/>
-<abi-corpus version='2.1' soname='libvtkRenderingLIC-6.1.so.1'>
+<abi-corpus version='2.2' soname='libvtkRenderingLIC-6.1.so.1'>
<elf-needed>
<dependency name='libvtkIOLegacy-6.1.so.1'/>
<dependency name='libvtkIOXML-6.1.so.1'/>
-<abi-corpus version='2.1' soname='libtcmalloc_and_profiler.so.4'>
+<abi-corpus version='2.2' soname='libtcmalloc_and_profiler.so.4'>
<elf-needed>
<dependency name='libunwind.so.8'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' soname='libvtkParallelCore-6.1.so.1'>
+<abi-corpus version='2.2' soname='libvtkParallelCore-6.1.so.1'>
<elf-needed>
<dependency name='libvtkIOLegacy-6.1.so.1'/>
<dependency name='libvtkIOCore-6.1.so.1'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<!-- bar(void*) -->
<elf-symbol name='_Z3barPv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<!-- foo(S&) -->
<elf-symbol name='_Z3fooR1S' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' path='data/test-read-btf/test0.o'>
+<abi-corpus version='2.2' path='data/test-read-btf/test0.o'>
<elf-function-symbols>
<elf-symbol name='fn0' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-btf/test1.o'>
+<abi-corpus version='2.2' path='data/test-read-btf/test1.o'>
<elf-function-symbols>
<elf-symbol name='fn0' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-common/PR27700/test-PR27700.o'>
+<abi-corpus version='2.2' path='data/test-read-common/PR27700/test-PR27700.o'>
<elf-function-symbols>
<elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-1.o'>
+<abi-corpus version='2.2' path='data/test-read-common/test-PR26568-1.o'>
<elf-function-symbols>
<elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-2.o'>
+<abi-corpus version='2.2' path='data/test-read-common/test-PR26568-2.o'>
<elf-function-symbols>
<elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-alias.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-alias.o'>
<elf-function-symbols>
<elf-symbol name='alias_func' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='main_func' type='func-type' binding='global-binding' visibility='default-visibility' alias='alias_func' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-ambiguous-struct-A.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-ambiguous-struct-A.o'>
<elf-variable-symbols>
<elf-symbol name='foo' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-ambiguous-struct-B.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-ambiguous-struct-B.o'>
<elf-variable-symbols>
<elf-symbol name='a' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-anonymous-fields.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-anonymous-fields.o'>
<elf-variable-symbols>
<elf-symbol name='t' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-array-mdimension.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-array-mdimension.o'>
<elf-variable-symbols>
<elf-symbol name='a' size='120' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-array-of-pointers.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-array-of-pointers.o'>
<elf-variable-symbols>
<elf-symbol name='t' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-array-size.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-array-size.o'>
<elf-variable-symbols>
<elf-symbol name='bar' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='baz' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield-enum.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-bitfield-enum.o'>
<elf-variable-symbols>
<elf-symbol name='e' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-bitfield.o'>
<elf-variable-symbols>
<elf-symbol name='f' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='fb' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-callback.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-callback.o'>
<elf-function-symbols>
<elf-symbol name='assign' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='f2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-callback2.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-callback2.o'>
<elf-variable-symbols>
<elf-symbol name='s0' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-conflicting-type-syms-a.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-conflicting-type-syms-a.o'>
<elf-variable-symbols>
<elf-symbol name='a' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='ignore2' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-conflicting-type-syms-b.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-conflicting-type-syms-b.o'>
<elf-variable-symbols>
<elf-symbol name='b' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='ignore1' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-const-array.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-const-array.o'>
<elf-variable-symbols>
<elf-symbol name='a' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-dynamic-array.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-dynamic-array.o'>
<elf-function-symbols>
<elf-symbol name='use_struct_s' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-enum-many.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-enum-many.o'>
<elf-variable-symbols>
<elf-symbol name='bar' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-enum-symbol.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-enum-symbol.o'>
<elf-variable-symbols>
<elf-symbol name='primary1' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-enum.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-enum.o'>
<elf-variable-symbols>
<elf-symbol name='bar' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-fallback.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-fallback.o'>
<elf-variable-symbols>
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-forward-type-decl.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-forward-type-decl.o'>
<elf-variable-symbols>
<elf-symbol name='addr' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-functions-declaration.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-functions-declaration.o'>
<elf-function-symbols>
<elf-symbol name='attribute_container_add_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='attribute_container_device_trigger' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-linux-module.ko'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-linux-module.ko'>
<elf-function-symbols>
<elf-symbol name='testexport' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x533ba8e8'/>
<elf-symbol name='testexport2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x65900b2f'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test-list-struct.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test-list-struct.o'>
<elf-variable-symbols>
<elf-symbol name='n1' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='n2' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test0'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test0'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test0'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test0'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test1.so'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test1.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test1.so'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test1.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test2.so'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test2.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test2.so'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test2.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.2' path='data/test-read-common/test3.so' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.2' path='data/test-read-common/test3.so' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
+<abi-corpus version='2.2' path='data/test-read-common/test4.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
+<abi-corpus version='2.2' path='data/test-read-common/test4.so'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' path='data/test-read-ctf/test5.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test5.o'>
<elf-function-symbols>
<elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='bar2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='data/test-read-ctf/test7.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test7.o'>
<elf-function-symbols>
<elf-symbol name='first_type_constructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test8.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test8.o'>
<elf-function-symbols>
<elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='data/test-read-ctf/test9.o'>
+<abi-corpus version='2.2' path='data/test-read-ctf/test9.o'>
<elf-function-symbols>
<elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/cached/third_party/boost-1.60.0/libboost_system.so'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/cached/third_party/s2/libs2.so'/>
<dependency name='build/cached/third_party/s2/util/math/libmath.so'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='_ZN4stac14buggy_functionEPFvPFfiiEE' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='__sdhci_add_host' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x74ae518'/>
<elf-symbol name='__sdhci_read_caps' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x711f65c'/>
-<abi-corpus version='2.1' soname='libgdbm.so.6'>
+<abi-corpus version='2.2' soname='libgdbm.so.6'>
<elf-needed>
<dependency name='libc.so.6'/>
<dependency name='ld-linux-x86-64.so.2'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-variable-symbols>
<elf-symbol name='_ZN1N1S1DE' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-variable-symbols>
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='xx' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' soname='libkjava.so.1'>
+<abi-corpus version='2.2' soname='libkjava.so.1'>
</abi-corpus>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-variable-symbols>
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
-<abi-corpus version='2.1' soname='libaaudio.so'>
+<abi-corpus version='2.2' soname='libaaudio.so'>
<elf-needed>
<dependency name='libaaudio_internal.so'/>
<dependency name='libaudioclient.so'/>
-<abi-corpus version='2.1' soname='libandroid.so'>
+<abi-corpus version='2.2' soname='libandroid.so'>
<elf-needed>
<dependency name='liblog.so'/>
<dependency name='libhidlbase.so'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='alias_func' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='main_func' type='func-type' binding='global-binding' visibility='default-visibility' alias='alias_func' is-defined='yes'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/debug/third_party/boost-1.56.0/libboost_system.so'/>
<dependency name='librt.so.1'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/debug/mongo/db/libserver_parameters.so'/>
<dependency name='build/debug/mongo/libbase.so'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/debug/mongo/bson/mutable/libmutable_bson.so'/>
<dependency name='build/debug/mongo/bson/util/libbson_extract.so'/>
-<abi-corpus version='2.1' soname='libdbus-1.so.3'>
+<abi-corpus version='2.2' soname='libdbus-1.so.3'>
<elf-needed>
<dependency name='librt.so.1'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1' soname='libGLU.so.1'>
+<abi-corpus version='2.2' soname='libGLU.so.1'>
<elf-needed>
<dependency name='libGL.so.1'/>
<dependency name='libstdc++.so.6'/>
-<abi-corpus version='2.1' soname='libtsan.so.0'>
+<abi-corpus version='2.2' soname='libtsan.so.0'>
<elf-needed>
<dependency name='librt.so.1'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1' soname='liboffloadmic_host.so.5'>
+<abi-corpus version='2.2' soname='liboffloadmic_host.so.5'>
<elf-needed>
<dependency name='libdl.so.2'/>
<dependency name='libstdc++.so.6'/>
-<abi-corpus version='2.1' soname='libharfbuzz.so.0'>
+<abi-corpus version='2.2' soname='libharfbuzz.so.0'>
<elf-needed>
<dependency name='libglib-2.0.so.0'/>
<dependency name='libfreetype.so.6'/>
-<abi-corpus version='2.1' soname='libvtkRenderingLIC-6.1.so.1'>
+<abi-corpus version='2.2' soname='libvtkRenderingLIC-6.1.so.1'>
<elf-needed>
<dependency name='libvtkIOLegacy-6.1.so.1'/>
<dependency name='libvtkIOXML-6.1.so.1'/>
-<abi-corpus version='2.1' soname='libtcmalloc_and_profiler.so.4'>
+<abi-corpus version='2.2' soname='libtcmalloc_and_profiler.so.4'>
<elf-needed>
<dependency name='libunwind.so.8'/>
<dependency name='libpthread.so.0'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' soname='libvtkParallelCore-6.1.so.1'>
+<abi-corpus version='2.2' soname='libvtkParallelCore-6.1.so.1'>
<elf-needed>
<dependency name='libvtkIOLegacy-6.1.so.1'/>
<dependency name='libvtkIOCore-6.1.so.1'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' soname='libstdc++.so.6'>
+<abi-corpus version='2.2' soname='libstdc++.so.6'>
<elf-needed>
<dependency name='libm.so.6'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1' soname='test3.so.1'>
+<abi-corpus version='2.2' soname='test3.so.1'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libc.so.6'/>
</elf-needed>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='_Z3barPv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='_Z3barPv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='_Z3fooR1S' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-function-symbols>
<elf-symbol name='_Z3fooR1S' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='libstdc++.so.6'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1'>
+<abi-corpus version='2.2'>
<elf-needed>
<dependency name='build/debug/third_party/boost-1.56.0/libboost_system.so'/>
<dependency name='libm.so.6'/>
-<abi-corpus version='2.1' path='tests/data/test-symtab/kernel-modversions/one_of_each.ko' architecture='elf-amd-x86_64'>
+<abi-corpus version='2.2' path='tests/data/test-symtab/kernel-modversions/one_of_each.ko' architecture='elf-amd-x86_64'>
<elf-function-symbols>
<elf-symbol name='exported_function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xe52d5bcf'/>
<elf-symbol name='exported_function_gpl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xfda43846'/>
-<abi-corpus version='2.1' path='libtest-v0.so'>
+<abi-corpus version='2.2' path='libtest-v0.so'>
<elf-function-symbols>
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-<abi-corpus version='2.1' path='repr7' architecture='elf-amd-x86_64'>
+<abi-corpus version='2.2' path='repr7' architecture='elf-amd-x86_64'>
<elf-function-symbols>
<elf-symbol name='_Z2fni' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
-<abi-corpus version='2.1' path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
+<abi-corpus version='2.2' path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
-<abi-corpus version='2.1' path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
+<abi-corpus version='2.2' path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
<elf-needed>
<dependency name='libgcc_s.so.1'/>
<dependency name='libc.so.6'/>
"data/test-abidiff-exit/test-allow-type-region-v0--v5-report-2.txt",
"output/test-abidiff-exit/test-allow-type-region-v0--v5-report-2.txt"
},
+ {
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.o",
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.o",
+ "",
+ "",
+ "",
+ "--no-default-suppression",
+ abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt",
+ "output/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt"
+ },
+ {
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v0/test1.o",
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/v1/test1.o",
+ "",
+ "",
+ "",
+ "--no-default-suppression --leaf-changes-only",
+ abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+ "data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt",
+ "output/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt"
+ },
#ifdef WITH_BTF
{
"data/test-abidiff-exit/btf/test0-v0.o",