From patchwork Fri Jun 12 09:59:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39569 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id ADC5D39551D7; Fri, 12 Jun 2020 09:59:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ADC5D39551D7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1591955972; bh=liUItKTZw7cczRyGU0WDYJc1h/yLpRtDQI8qP2oOknM=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=UhgoUGv8cjDQ++yLu8Vum8E3uqT5fyXLSfNirxL9QOmWuIPHII+BtYzIeFRhB2PRP Uk+++bLrM+J+Q8E1xdNX7SmnqqwCS5k8uYRD3HF6LIWwjAzP3KsKzjXNiDtJCY7V8D uO/tzkplg7l7c4OPLBcbE52aW9Y4TuFllkjeqVDw= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by sourceware.org (Postfix) with ESMTPS id 1E8A43954C7B for ; Fri, 12 Jun 2020 09:59:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1E8A43954C7B Received: by mail-qk1-x74a.google.com with SMTP id m29so7560730qkm.17 for ; Fri, 12 Jun 2020 02:59:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=liUItKTZw7cczRyGU0WDYJc1h/yLpRtDQI8qP2oOknM=; b=V+lxETOvUjioDfAvldKn4ebMLCkIQlAH8CT6JuaEP/cY8pGv6vXNqlpeWBt+/yE7TQ xP2iMjhzrMQHEYNuFJ72mz9pgDKWPM/dy7aaA8I7V5ZMQYBaHKJqAoc8KB/vMa1ZJNWX 5upWRPUN1bE3mLxYv1G+ypH4ubpuye3aFneaTG2m8yTJym7ipMR61xvv5yL07N/xmqir YoWM3QQEtZFXkHdq6veqPX+AIYBPVtx2rJJ79nNU7opqGtwvqXlRR2rFw2l/wxzCnuEA L7+6fKWmo4Kpq4O0MRb7TdlrKMOdzSveZ931aFvEr4mR5l9oUgveOoqXCKZ264oSKMJQ mHNw== X-Gm-Message-State: AOAM531emwuDnOrZaVFzY4E3tkXO+TqmcJvq22TPn0KC8DCD5+1a1gDY Hs9bxtYqnwIJhquKKaDMYxXw2wQYw+eU1bocvHMaLsVAfaAEGeQkd//4GpVnoqpF5Q+lIYeNAoQ /d/9f3ICOccJlqJoA6HIhPL8zxr+b+thQ0Fcq1aU8//Ym1rKK09x83mdKyesJ/6/hU+GVm14= X-Google-Smtp-Source: ABdhPJwi7OSOtp0CGnf12yXBVAprFV6xV4xnSzHQNq0Cv7qDiDFcLtiUlDPH6cdeZxJNqRy5kOEyYtSH7fvpUg== X-Received: by 2002:ad4:4309:: with SMTP id c9mr11830295qvs.50.1591955968481; Fri, 12 Jun 2020 02:59:28 -0700 (PDT) Date: Fri, 12 Jun 2020 10:59:16 +0100 In-Reply-To: <20200612095917.2146-1-gprocida@google.com> Message-Id: <20200612095917.2146-2-gprocida@google.com> Mime-Version: 1.0 References: <20200612095917.2146-1-gprocida@google.com> X-Mailer: git-send-email 2.27.0.290.gba653c62da-goog Subject: [PATCH 1/2] abg-writer: Add support for stable hash type ids. To: libabigail@sourceware.org X-Spam-Status: No, score=-24.6 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Giuliano Procida via Libabigail From: Giuliano Procida Reply-To: Giuliano Procida Cc: kernel-team@android.com, gprocida@google.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" The type ids currently emitted by the XML writer are simply type-id-1, type-id-2 etc. Additions or removals of types early in this sequence result in cascading changes to many other XML elements. This commit adds support for stable type ids in the form of hashes of libabigail's internal type names. On fairly rare occasions (typically involving unnamed types), the names of two distinct types can be the same. In any case, if there is a hash collision the XML writer will find the next unused id and so preserve uniqueness. Diffs between XML files produced using --type-id-style hash will be much smaller and easier to review. * doc/manuals/abidw.rst: Replace stray documentation of --named-type-ids with documention of new --type-id-style option. * include/abg-writer.h (type_id_style_kind): Add new enum. (set_type_id_style): Add new write_context setter. (set_common_options): Set type id style in write context. * src/abg-writer.cc (stable_hash): Add new 32-bit FNV-1a hash function. (write_context): Add m_type_id_style member to record type style to use, defaulting to COUNTER. Add m_used_type_id_hashes to record already used hashes. (write_context::get_type_id_style): Add new getter. (write_context::set_type_id_style): Add new setter. (get_id_for_type): Add support for HASH style. (set_type_id_style): Add new helper function. * tools/abidw.cc (options): Add type_id_style member. (display_usage): Add description of --type-id-style option. (parse_command_line): Parse --type-id-style option. Signed-off-by: Giuliano Procida --- doc/manuals/abidw.rst | 15 +++---- include/abg-writer.h | 10 +++++ src/abg-writer.cc | 95 +++++++++++++++++++++++++++++++++++++++---- tools/abidw.cc | 20 ++++++++- 4 files changed, 125 insertions(+), 15 deletions(-) diff --git a/doc/manuals/abidw.rst b/doc/manuals/abidw.rst index e1fce997..9472cfe8 100644 --- a/doc/manuals/abidw.rst +++ b/doc/manuals/abidw.rst @@ -197,13 +197,14 @@ Options 1.8 will not set the default size and will interpret types without a size-in-bits attribute as zero sized. - * ``--named-type-ids`` - - Without this option ids used to reference types in the XML file - use simple numbers. With this option the ids used are derived - from the type name to make it easier to see which type is - referenced and make the XML file more stable in case new types are - added (without this option that might mean all id numbers change). + * ``--type-id-style`` ( ``counter`` | ``hash`` ) + + This option controls how types are idenfied in the generated XML + files. The default ``counter`` style just numbers (with + ``type-id-`` as prefix) the types in the order they are + encountered. The ``hash`` style uses a (stable, portable) hash of + the type names that libabigail uses internally and is intended + to make the XML files easier to diff. * ``--check-alternate-debug-info-base-name`` <*elf-path*> diff --git a/include/abg-writer.h b/include/abg-writer.h index 8086d828..021a95b7 100644 --- a/include/abg-writer.h +++ b/include/abg-writer.h @@ -38,6 +38,12 @@ namespace xml_writer using namespace abigail::ir; +enum type_id_style_kind +{ + COUNTER, + HASH +}; + class write_context; /// A convenience typedef for a shared pointer to write_context. @@ -74,6 +80,9 @@ set_short_locs(write_context& ctxt, bool flag); void set_write_parameter_names(write_context& ctxt, bool flag); +void +set_type_id_style(write_context& ctxt, type_id_style_kind style); + /// A convenience generic function to set common options (usually used /// by Libabigail tools) from a generic options carrying-object, into /// a given @ref write_context. @@ -96,6 +105,7 @@ set_common_options(write_context& ctxt, const OPTS& opts) set_write_parameter_names(ctxt, opts.write_parameter_names); set_short_locs(ctxt, opts.short_locs); set_write_default_sizes(ctxt, opts.default_sizes); + set_type_id_style(ctxt, opts.type_id_style); } void diff --git a/src/abg-writer.cc b/src/abg-writer.cc index bafa3024..f0dbd096 100644 --- a/src/abg-writer.cc +++ b/src/abg-writer.cc @@ -27,6 +27,7 @@ #include "config.h" #include +#include #include #include #include @@ -56,6 +57,39 @@ ABG_BEGIN_EXPORT_DECLARATIONS ABG_END_EXPORT_DECLARATIONS // +namespace +{ +/// Compute a stable string hash. +/// +/// std::hash has no portability or stability guarantees so is +/// unsuitable where reproducibility is a requirement. +/// +/// This is the 32-bit FNV-1a algorithm. The algorithm, reference code +/// and constants are all unencumbered. It is fast and has reasonable +/// distribution properties. +/// +/// https://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function +/// +/// @param str the string to hash. +/// +/// @return an unsigned 32 bit hash value. +uint32_t +stable_hash(const std::string& str) +{ + const uint32_t prime = 0x01000193; + const uint32_t offset_basis = 0x811c9dc5; + uint32_t hash = offset_basis; + for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) + { + uint8_t byte = *i; + hash = hash ^ byte; + hash = hash * prime; + } + return hash; +} + +} // namespace + namespace abigail { using std::cerr; @@ -177,7 +211,9 @@ class write_context bool m_write_parameter_names; bool m_short_locs; bool m_write_default_sizes; + type_id_style_kind m_type_id_style; mutable type_ptr_map m_type_id_map; + mutable std::unordered_set m_used_type_id_hashes; mutable type_ptr_set_type m_emitted_type_set; type_ptr_set_type m_emitted_decl_only_set; // A map of types that are referenced by emitted pointers, @@ -214,7 +250,8 @@ public: m_write_elf_needed(true), m_write_parameter_names(true), m_short_locs(false), - m_write_default_sizes(true) + m_write_default_sizes(true), + m_type_id_style(COUNTER) {} /// Getter of the environment we are operating from. @@ -374,6 +411,24 @@ public: set_show_locs(bool f) {m_show_locs = f;} + /// Getter of the "type-id-style" option. + /// + /// This option controls the kind of type ids used in XML output. + /// + /// @return the value of the "type-id-style" option. + type_id_style_kind + get_type_id_style() const + {return m_type_id_style;} + + /// Setter of the "type-id-style" option. + /// + /// This option controls the kind of type ids used in XML output. + /// + /// @param style the new value of the "type-id-style" option. + void + set_type_id_style(type_id_style_kind style) + {m_type_id_style = style;} + /// Getter of the @ref id_manager. /// /// @return the @ref id_manager used by the current instance of @ref @@ -421,14 +476,29 @@ public: c = const_cast(t); type_ptr_map::const_iterator it = m_type_id_map.find(c); - if (it == m_type_id_map.end()) + if (it != m_type_id_map.end()) + return it->second; + + switch (m_type_id_style) { - interned_string id = - get_id_manager().get_id_with_prefix("type-id-"); - m_type_id_map[c] = id; - return id; + case COUNTER: + { + interned_string id = get_id_manager().get_id_with_prefix("type-id-"); + return m_type_id_map[c] = id; + } + case HASH: + { + interned_string pretty = c->get_cached_pretty_representation(true); + size_t hash = stable_hash(*pretty.raw()); + while (!m_used_type_id_hashes.insert(hash).second) + ++hash; + std::ostringstream os; + os << std::hex << std::setfill('0') << std::setw(8) << hash; + return m_type_id_map[c] = c->get_environment()->intern(os.str()); + } } - return it->second; + ABG_ASSERT_NOT_REACHED; + return interned_string(); } string @@ -2131,6 +2201,17 @@ void set_write_default_sizes(write_context& ctxt, bool flag) {ctxt.set_write_default_sizes(flag);} +/// Set the 'type-id-style' property. +/// +/// This property controls the kind of type ids used in XML output. +/// +/// @param ctxt the context to set this property on. +/// +/// @param style the new value of the 'type-id-style' property. +void +set_type_id_style(write_context& ctxt, type_id_style_kind style) +{ctxt.set_type_id_style(style);} + /// Serialize the canonical types of a given scope. /// /// @param scope the scope to consider. diff --git a/tools/abidw.cc b/tools/abidw.cc index 9aec3112..7de31737 100644 --- a/tools/abidw.cc +++ b/tools/abidw.cc @@ -70,7 +70,10 @@ using abigail::comparison::corpus_diff_sptr; using abigail::comparison::compute_diff; using abigail::comparison::diff_context_sptr; using abigail::comparison::diff_context; +using abigail::xml_writer::COUNTER; +using abigail::xml_writer::HASH; using abigail::xml_writer::create_write_context; +using abigail::xml_writer::type_id_style_kind; using abigail::xml_writer::write_context_sptr; using abigail::xml_writer::write_corpus; using abigail::xml_reader::read_corpus_from_native_xml_file; @@ -114,6 +117,7 @@ struct options bool do_log; bool drop_private_types; bool drop_undefined_syms; + type_id_style_kind type_id_style; options() : display_version(), @@ -136,7 +140,8 @@ struct options annotate(), do_log(), drop_private_types(false), - drop_undefined_syms(false) + drop_undefined_syms(false), + type_id_style(COUNTER) {} ~options() @@ -175,6 +180,7 @@ display_usage(const string& prog_name, ostream& out) << " --no-write-default-sizes do not emit pointer size when it equals" " the default address size of the translation unit\n" << " --no-parameter-names do not show names of function parameters\n" + << " --type-id-style (counter|hash) type-id style (counter(default): type-id-number; hash: hexdigits\n" << " --check-alternate-debug-info check alternate debug info " "of \n" << " --check-alternate-debug-info-base-name check alternate " @@ -301,6 +307,18 @@ parse_command_line(int argc, char* argv[], options& opts) opts.default_sizes = false; else if (!strcmp(argv[i], "--no-parameter-names")) opts.write_parameter_names = false; + else if (!strcmp(argv[i], "--type-id-style")) + { + ++i; + if (i >= argc) + return false; + if (!strcmp(argv[i], "counter")) + opts.type_id_style = COUNTER; + else if (!strcmp(argv[i], "hash")) + opts.type_id_style = HASH; + else + return false; + } else if (!strcmp(argv[i], "--check-alternate-debug-info") || !strcmp(argv[i], "--check-alternate-debug-info-base-name")) { From patchwork Fri Jun 12 09:59:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39570 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 296EF3954C7B; Fri, 12 Jun 2020 09:59:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 296EF3954C7B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1591955977; bh=Nom/Zpr0vaFIW7+BzVDWORTUtSbIPSXzERLVnKKXSU0=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=JyB22HxmkZUWHBDb1pm4M2iEguIRr4wHx8dKz3pOkuebe2nAmmf4cgIlFR9SoxaAO uVPCnfx7RVQSM5k340VKzfBk2K9KSUolPVq00EJCrrfF/ZWezhtXm30xGb7eaC9ul6 dFfs7y5kco6ztXUrm/v8qd9yb1jvtG8Yw5u6rzeo= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by sourceware.org (Postfix) with ESMTPS id 5D7C23870869 for ; Fri, 12 Jun 2020 09:59:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5D7C23870869 Received: by mail-yb1-xb4a.google.com with SMTP id o140so9872990yba.16 for ; Fri, 12 Jun 2020 02:59:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=Nom/Zpr0vaFIW7+BzVDWORTUtSbIPSXzERLVnKKXSU0=; b=tt5oo4UczPIxcbBXhxW5h66CdK564hCUpKINQY1O4nlcsb06v9wbdkJNFkemgp9X2x 1/FPBABeGUpHyYT5/fveot+H5XgtJh/IBvmB8lXHvG4bLy7XrL8MHKcyYt0zciFUbZ4r QiylUa/8lMfYsOLywHu4tgx9nZV7pOoiBre9UhBDMY3Q9MICy4KqXoF5/XzTv8282rBY v106rGQLz8WPDnqcsrsoQbtCgKxG/9IHtTAaWH5B2L2WL5rFkGGdEq72KguW+XL5r9er KZwkL+QhhFDYumNufTF69d+V2bOLD4OQy2XCHgs/GrSImW278W2ZVo9tekIJm5r4GYPl zXWA== X-Gm-Message-State: AOAM532HTf4IF+0UpedXR5SQbxDiC6g9fhAHHblTRb3VX3bdm2MSN10L /kxZ6J0AAX7ppjrXceURhbUZ2rjMTAge4OzWqqH/y7u0YSWTDvbAhG677hWIRMpni+0EnNM1ZRj dg7cBXkwkeGnW6Ki8MaA7QSKViADwDpoyQhfCAOWHagrjaPlanh7dglOjTQJTQSYqy2SyK6A= X-Google-Smtp-Source: ABdhPJwLy14G9eQQSUXBZ5vdSGUyqEFpUuYGv/uLHikRmPhbYUrw7bVw4WtWYmT4kdOsuDNME2uPz1MxNSwuRw== X-Received: by 2002:a25:dc0e:: with SMTP id y14mr19655055ybe.198.1591955970775; Fri, 12 Jun 2020 02:59:30 -0700 (PDT) Date: Fri, 12 Jun 2020 10:59:17 +0100 In-Reply-To: <20200612095917.2146-1-gprocida@google.com> Message-Id: <20200612095917.2146-3-gprocida@google.com> Mime-Version: 1.0 References: <20200612095917.2146-1-gprocida@google.com> X-Mailer: git-send-email 2.27.0.290.gba653c62da-goog Subject: [PATCH 2/2] Add tests for abidw --type-id-style hash. To: libabigail@sourceware.org X-Spam-Status: No, score=-24.1 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Giuliano Procida via Libabigail From: Giuliano Procida Reply-To: Giuliano Procida Cc: kernel-team@android.com, gprocida@google.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" This commit adds some test cases to verify that the hashing is actually stable across architectures. * tests/data/Makefile.am: Add new hash type id ABI files. * tests/test-read-dwarf.cc: (InOutSpec): Add type_id_style member. (in_out_specs): Set type_id_style to COUNTER in existing test specifications. Duplicate first 9 test cases with type_id_style set to HASH. * tests/data/test-read-dwarf/test0.hash.abi: New ABI XML file with hash type ids. * tests/data/test-read-dwarf/test1.hash.abi: Ditto. * tests/data/test-read-dwarf/test2.so.hash.abi: Ditto. * tests/data/test-read-dwarf/test3.so.hash.abi: Ditto. * tests/data/test-read-dwarf/test4.so.hash.abi: Ditto. * tests/data/test-read-dwarf/test5.o.hash.abi: Ditto. * tests/data/test-read-dwarf/test6.so.hash.abi: Ditto. * tests/data/test-read-dwarf/test7.so.hash.abi: Ditto. * tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi: Ditto. Signed-off-by: Giuliano Procida --- tests/data/Makefile.am | 9 ++ tests/data/test-read-dwarf/test0.hash.abi | 70 ++++++++++ tests/data/test-read-dwarf/test1.hash.abi | 129 ++++++++++++++++++ tests/data/test-read-dwarf/test2.so.hash.abi | 79 +++++++++++ tests/data/test-read-dwarf/test3.so.hash.abi | 19 +++ tests/data/test-read-dwarf/test4.so.hash.abi | 23 ++++ tests/data/test-read-dwarf/test5.o.hash.abi | 13 ++ tests/data/test-read-dwarf/test6.so.hash.abi | 42 ++++++ tests/data/test-read-dwarf/test7.so.hash.abi | 77 +++++++++++ .../test8-qualified-this-pointer.so.hash.abi | 37 +++++ tests/test-read-dwarf.cc | 107 ++++++++++++++- 11 files changed, 603 insertions(+), 2 deletions(-) create mode 100644 tests/data/test-read-dwarf/test0.hash.abi create mode 100644 tests/data/test-read-dwarf/test1.hash.abi create mode 100644 tests/data/test-read-dwarf/test2.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test3.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test4.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test5.o.hash.abi create mode 100644 tests/data/test-read-dwarf/test6.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test7.so.hash.abi create mode 100644 tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 6592ba32..8ccd50a0 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -395,33 +395,42 @@ test-diff-dwarf/PR25058-liblttng-ctl2.10.so \ \ test-read-dwarf/test0 \ test-read-dwarf/test0.abi \ +test-read-dwarf/test0.hash.abi \ test-read-dwarf/test0.cc \ test-read-dwarf/test1 \ test-read-dwarf/test1.abi \ +test-read-dwarf/test1.hash.abi \ test-read-dwarf/test1.cc \ test-read-dwarf/test2.h \ test-read-dwarf/test2-0.cc \ test-read-dwarf/test2-1.cc \ test-read-dwarf/test2.so \ test-read-dwarf/test2.so.abi \ +test-read-dwarf/test2.so.hash.abi \ test-read-dwarf/test3.c \ test-read-dwarf/test3.so \ test-read-dwarf/test3.so.abi \ +test-read-dwarf/test3.so.hash.abi \ test-read-dwarf/test4.c \ test-read-dwarf/test4.so \ test-read-dwarf/test4.so.abi \ +test-read-dwarf/test4.so.hash.abi \ test-read-dwarf/test5.cc \ test-read-dwarf/test5.o \ test-read-dwarf/test5.o.abi \ +test-read-dwarf/test5.o.hash.abi \ test-read-dwarf/test6.cc \ test-read-dwarf/test6.so \ test-read-dwarf/test6.so.abi \ +test-read-dwarf/test6.so.hash.abi \ test-read-dwarf/test7.cc \ test-read-dwarf/test7.so \ test-read-dwarf/test7.so.abi \ +test-read-dwarf/test7.so.hash.abi \ test-read-dwarf/test8-qualified-this-pointer.cc \ test-read-dwarf/test8-qualified-this-pointer.so \ test-read-dwarf/test8-qualified-this-pointer.so.abi \ +test-read-dwarf/test8-qualified-this-pointer.so.hash.abi \ test-read-dwarf/test9-pr18818-clang.so \ test-read-dwarf/test10-pr18818-gcc.so \ test-read-dwarf/test9-pr18818-clang.so.abi \ diff --git a/tests/data/test-read-dwarf/test0.hash.abi b/tests/data/test-read-dwarf/test0.hash.abi new file mode 100644 index 00000000..3d34a9de --- /dev/null +++ b/tests/data/test-read-dwarf/test0.hash.abi @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test1.hash.abi b/tests/data/test-read-dwarf/test1.hash.abi new file mode 100644 index 00000000..0bd86868 --- /dev/null +++ b/tests/data/test-read-dwarf/test1.hash.abi @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test2.so.hash.abi b/tests/data/test-read-dwarf/test2.so.hash.abi new file mode 100644 index 00000000..bb814f73 --- /dev/null +++ b/tests/data/test-read-dwarf/test2.so.hash.abi @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test3.so.hash.abi b/tests/data/test-read-dwarf/test3.so.hash.abi new file mode 100644 index 00000000..e01f3959 --- /dev/null +++ b/tests/data/test-read-dwarf/test3.so.hash.abi @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test4.so.hash.abi b/tests/data/test-read-dwarf/test4.so.hash.abi new file mode 100644 index 00000000..446df1da --- /dev/null +++ b/tests/data/test-read-dwarf/test4.so.hash.abi @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test5.o.hash.abi b/tests/data/test-read-dwarf/test5.o.hash.abi new file mode 100644 index 00000000..9ed9932a --- /dev/null +++ b/tests/data/test-read-dwarf/test5.o.hash.abi @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test6.so.hash.abi b/tests/data/test-read-dwarf/test6.so.hash.abi new file mode 100644 index 00000000..7867a28f --- /dev/null +++ b/tests/data/test-read-dwarf/test6.so.hash.abi @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test7.so.hash.abi b/tests/data/test-read-dwarf/test7.so.hash.abi new file mode 100644 index 00000000..a04025f6 --- /dev/null +++ b/tests/data/test-read-dwarf/test7.so.hash.abi @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi b/tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi new file mode 100644 index 00000000..7197425d --- /dev/null +++ b/tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test-read-dwarf.cc b/tests/test-read-dwarf.cc index ecc70cda..5c653f45 100644 --- a/tests/test-read-dwarf.cc +++ b/tests/test-read-dwarf.cc @@ -46,7 +46,11 @@ using abigail::dwarf_reader::read_corpus_from_elf; using abigail::dwarf_reader::read_context; using abigail::dwarf_reader::read_context_sptr; using abigail::dwarf_reader::create_read_context; +using abigail::xml_writer::COUNTER; +using abigail::xml_writer::HASH; using abigail::xml_writer::create_write_context; +using abigail::xml_writer::set_type_id_style; +using abigail::xml_writer::type_id_style_kind; using abigail::xml_writer::write_context_sptr; using abigail::xml_writer::write_corpus; @@ -56,6 +60,7 @@ struct InOutSpec { const char* in_elf_path; const char* in_suppr_spec_path; + type_id_style_kind type_id_style; const char* in_abi_path; const char* out_abi_path; };// end struct InOutSpec @@ -66,174 +71,266 @@ InOutSpec in_out_specs[] = { "data/test-read-dwarf/test0", "", + COUNTER, "data/test-read-dwarf/test0.abi", "output/test-read-dwarf/test0.abi" }, + { + "data/test-read-dwarf/test0", + "", + HASH, + "data/test-read-dwarf/test0.hash.abi", + "output/test-read-dwarf/test0.hash.abi" + }, { "data/test-read-dwarf/test1", "", + COUNTER, "data/test-read-dwarf/test1.abi", "output/test-read-dwarf/test1.abi" }, + { + "data/test-read-dwarf/test1", + "", + HASH, + "data/test-read-dwarf/test1.hash.abi", + "output/test-read-dwarf/test1.hash.abi" + }, { "data/test-read-dwarf/test2.so", "", + COUNTER, "data/test-read-dwarf/test2.so.abi", "output/test-read-dwarf/test2.so.abi" }, + { + "data/test-read-dwarf/test2.so", + "", + HASH, + "data/test-read-dwarf/test2.so.hash.abi", + "output/test-read-dwarf/test2.so.hash.abi" + }, { "data/test-read-dwarf/test3.so", "", + COUNTER, "data/test-read-dwarf/test3.so.abi", "output/test-read-dwarf/test3.so.abi" }, + { + "data/test-read-dwarf/test3.so", + "", + HASH, + "data/test-read-dwarf/test3.so.hash.abi", + "output/test-read-dwarf/test3.so.hash.abi" + }, { "data/test-read-dwarf/test4.so", "", + COUNTER, "data/test-read-dwarf/test4.so.abi", "output/test-read-dwarf/test4.so.abi" }, + { + "data/test-read-dwarf/test4.so", + "", + HASH, + "data/test-read-dwarf/test4.so.hash.abi", + "output/test-read-dwarf/test4.so.hash.abi" + }, { "data/test-read-dwarf/test5.o", "", + COUNTER, "data/test-read-dwarf/test5.o.abi", "output/test-read-dwarf/test5.o.abi" }, + { + "data/test-read-dwarf/test5.o", + "", + HASH, + "data/test-read-dwarf/test5.o.hash.abi", + "output/test-read-dwarf/test5.o.hash.abi" + }, { "data/test-read-dwarf/test6.so", "", + COUNTER, "data/test-read-dwarf/test6.so.abi", "output/test-read-dwarf/test6.so.abi" }, + { + "data/test-read-dwarf/test6.so", + "", + HASH, + "data/test-read-dwarf/test6.so.hash.abi", + "output/test-read-dwarf/test6.so.hash.abi" + }, { "data/test-read-dwarf/test7.so", "", + COUNTER, "data/test-read-dwarf/test7.so.abi", "output/test-read-dwarf/test7.so.abi" }, + { + "data/test-read-dwarf/test7.so", + "", + HASH, + "data/test-read-dwarf/test7.so.hash.abi", + "output/test-read-dwarf/test7.so.hash.abi" + }, { "data/test-read-dwarf/test8-qualified-this-pointer.so", "", + COUNTER, "data/test-read-dwarf/test8-qualified-this-pointer.so.abi", "output/test-read-dwarf/test8-qualified-this-pointer.so.abi" }, + { + "data/test-read-dwarf/test8-qualified-this-pointer.so", + "", + HASH, + "data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi", + "output/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi" + }, { "data/test-read-dwarf/test9-pr18818-clang.so", "", + COUNTER, "data/test-read-dwarf/test9-pr18818-clang.so.abi", "output/test-read-dwarf/test9-pr18818-clang.so.abi" }, { "data/test-read-dwarf/test10-pr18818-gcc.so", "", + COUNTER, "data/test-read-dwarf/test10-pr18818-gcc.so.abi", "output/test-read-dwarf/test10-pr18818-gcc.so.abi" }, { "data/test-read-dwarf/test11-pr18828.so", "", + COUNTER, "data/test-read-dwarf/test11-pr18828.so.abi", "output/test-read-dwarf/test11-pr18828.so.abi", }, { "data/test-read-dwarf/test12-pr18844.so", "", + COUNTER, "data/test-read-dwarf/test12-pr18844.so.abi", "output/test-read-dwarf/test12-pr18844.so.abi", }, { "data/test-read-dwarf/test13-pr18894.so", "", + COUNTER, "data/test-read-dwarf/test13-pr18894.so.abi", "output/test-read-dwarf/test13-pr18894.so.abi", }, { "data/test-read-dwarf/test14-pr18893.so", "", + COUNTER, "data/test-read-dwarf/test14-pr18893.so.abi", "output/test-read-dwarf/test14-pr18893.so.abi", }, { "data/test-read-dwarf/test15-pr18892.so", "", + COUNTER, "data/test-read-dwarf/test15-pr18892.so.abi", "output/test-read-dwarf/test15-pr18892.so.abi", }, { "data/test-read-dwarf/test16-pr18904.so", "", + COUNTER, "data/test-read-dwarf/test16-pr18904.so.abi", "output/test-read-dwarf/test16-pr18904.so.abi", }, { "data/test-read-dwarf/test17-pr19027.so", "", + COUNTER, "data/test-read-dwarf/test17-pr19027.so.abi", "output/test-read-dwarf/test17-pr19027.so.abi", }, { "data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so", "", + COUNTER, "data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi", "output/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi", }, { "data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so", "", + COUNTER, "data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi", "output/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi", }, { "data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so", "", + COUNTER, "data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi", "output/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi", }, { "data/test-read-dwarf/test21-pr19092.so", "", + COUNTER, "data/test-read-dwarf/test21-pr19092.so.abi", "output/test-read-dwarf/test21-pr19092.so.abi", }, { "data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so", "", + COUNTER, "data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi", "output/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi", }, { "data/test-read-dwarf/libtest23.so", "", + COUNTER, "data/test-read-dwarf/libtest23.so.abi", "output/test-read-dwarf/libtest23.so.abi", }, { "data/test-read-dwarf/libtest24-drop-fns.so", "data/test-read-dwarf/test24-drop-fns-0.suppr", + COUNTER, "data/test-read-dwarf/libtest24-drop-fns.so.abi", "output/test-read-dwarf/libtest24-drop-fns.so.abi", }, { "data/test-read-dwarf/libtest24-drop-fns.so", "", + COUNTER, "data/test-read-dwarf/libtest24-drop-fns-2.so.abi", "output/test-read-dwarf/libtest24-drop-fns-2.so.abi", }, { "data/test-read-dwarf/PR22015-libboost_iostreams.so", "", + COUNTER, "data/test-read-dwarf/PR22015-libboost_iostreams.so.abi", "output/test-read-dwarf/PR22015-libboost_iostreams.so.abi", }, { "data/test-read-dwarf/PR22122-libftdc.so", "", + COUNTER, "data/test-read-dwarf/PR22122-libftdc.so.abi", "output/test-read-dwarf/PR22122-libftdc.so.abi", }, { "data/test-read-dwarf/PR24378-fn-is-not-scope.o", "", + COUNTER, "data/test-read-dwarf/PR24378-fn-is-not-scope.abi", "output/test-read-dwarf/PR24378-fn-is-not-scope.abi", }, @@ -241,6 +338,7 @@ InOutSpec in_out_specs[] = { "data/test-read-dwarf/PR25007-sdhci.ko", "", + COUNTER, "data/test-read-dwarf/PR25007-sdhci.ko.abi", "output/test-read-dwarf/PR25007-sdhci.ko.abi", }, @@ -249,6 +347,7 @@ InOutSpec in_out_specs[] = { "data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0", "", + COUNTER, "data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi", "output/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi", }, @@ -256,23 +355,26 @@ InOutSpec in_out_specs[] = { "data/test-read-dwarf/test25-bogus-binary.elf", "", + COUNTER, nullptr, nullptr, }, { "data/test-read-dwarf/test26-bogus-binary.elf", "", + COUNTER, nullptr, nullptr, }, { "data/test-read-dwarf/test27-bogus-binary.elf", "", + COUNTER, nullptr, nullptr, }, // This should be the last entry. - {NULL, NULL, NULL, NULL} + {NULL, NULL, COUNTER, NULL, NULL} }; using abigail::suppr::suppression_sptr; @@ -378,8 +480,9 @@ struct test_task : public abigail::workers::task is_ok = false; return; } - const write_context_sptr write_ctxt + write_context_sptr write_ctxt = create_write_context(corp->get_environment(), of); + set_type_id_style(*write_ctxt, spec.type_id_style); is_ok = write_corpus(*write_ctxt, corp, /*indent=*/0); of.close();