From patchwork Wed Oct 4 10:52:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 77090 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 21B753858CDB for ; Wed, 4 Oct 2023 10:52:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 21B753858CDB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1696416772; bh=Jh8JJqAdsj/RCBNqhA4dP0ZtsUQkAcGjEWnWe3mhtqI=; h=To:Subject:References:Date:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=dAvktdK2oO1WxWQc8GliRDswWe/ifYe/bvACxJUYSfXW/F/p+/ZtiJ0UMqjti2clz t7Hf9x7Evozxt7P1qCe8L2EAcMNsADypNMoPM4lUp3MWo63AezFUhyPSJqiWbaD394 XH0C95LZhqjIhyHZv9hXb05xhNFBnfQFIWlzV2U8= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 14386385841B for ; Wed, 4 Oct 2023 10:52:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 14386385841B Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-499-zG5gFBM3MwysP4POcoX20A-1; Wed, 04 Oct 2023 06:52:45 -0400 X-MC-Unique: zG5gFBM3MwysP4POcoX20A-1 Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-7740c0e88ffso231835285a.1 for ; Wed, 04 Oct 2023 03:52:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696416765; x=1697021565; h=mime-version:user-agent:message-id:in-reply-to:date:references :organization:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Jh8JJqAdsj/RCBNqhA4dP0ZtsUQkAcGjEWnWe3mhtqI=; b=wf2fJ//gW8IDWN+bBxmhrXkcuMgxDydK1RsU6J7y7niVEnH6+VjuzrLIMw2kGhYLyW z0p1iIVDjuV11EHjBvIWTThnwZLY3SfqclEHVVRue5dxuU9p7M5JNoKD6oE20ox5+tdh TQq801UUvljotXMuAvKH3Facs+Vw3lvNd0lvSwm0T57cqkRpCqPS6Xmfr8PCDRiFDICb I52E1fIDduhGj3XhMyr5GRoT3A2THeTKM5Nv01yr4+1+h6VtSeKs+zFrp5L2hKSzuAmN xQwwaUy2P2B/GBbV58lsPdTU7dBWcbE0f9wVXDR0HJij+O+fvBa6NLRE5SmymWokk8RP ir/A== X-Gm-Message-State: AOJu0YxX/PIhurRNJP5HhGg152Zg5ipjXXNXfkhy/I/ovQPK6MVj7QfS jqta5u2pItm5c5uY8FElyHuJpT3kXaAgG8XLDLmsIx2nMaFcrGK9HErAY5P4lXfIbJjFmLQ7Pg4 qXR5CE/NcC7T5Rb50NYrQ X-Received: by 2002:a05:620a:21cc:b0:76f:1e31:93cd with SMTP id h12-20020a05620a21cc00b0076f1e3193cdmr2044289qka.43.1696416765021; Wed, 04 Oct 2023 03:52:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGcBJ/0bWrgStkFfzeZXMRdvPVbGlIaaDi7sWA2ZDkiRz4a+SGxQV7YTBng277zxvj2nVhG2w== X-Received: by 2002:a05:620a:21cc:b0:76f:1e31:93cd with SMTP id h12-20020a05620a21cc00b0076f1e3193cdmr2044279qka.43.1696416764773; Wed, 04 Oct 2023 03:52:44 -0700 (PDT) Received: from localhost ([88.120.130.27]) by smtp.gmail.com with ESMTPSA id f22-20020a05620a12f600b00767c961eb47sm1167125qkl.43.2023.10.04.03.52.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 03:52:44 -0700 (PDT) Received: by localhost (Postfix, from userid 1000) id 03CB1B6EB1; Wed, 4 Oct 2023 12:52:41 +0200 (CEST) To: libabigail@sourceware.org Subject: [PATCH 1/3, V2] For WIP branch check-uapi-support: default-reporter,reporter-priv: Do not report names of anonymous enums Organization: Red Hat / France References: <87r0mapspt.fsf@redhat.com> X-Operating-System: CentOS Stream release 9 X-URL: http://www.redhat.com Date: Wed, 04 Oct 2023 12:52:41 +0200 In-Reply-To: <87r0mapspt.fsf@redhat.com> (Dodji Seketeli's message of "Wed, 04 Oct 2023 12:50:06 +0200") Message-ID: <87mswypsli.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Dodji Seketeli via Libabigail From: Dodji Seketeli Reply-To: Dodji Seketeli Cc: Trilok Soni , dodji@redhat.com, Satya Durga Srinivasu Prabhala Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" Hello, When reporting changes of anonymous enums, do not try to report their qualified name as that doesn't make any sense -- they are anonymous. Similarly, in report_name_size_and_alignment_changes do not try to report about changes in the name of an anonymous enum. * src/abg-default-reporter.cc (default_reporter::report): In the overload for enum_diff, do not get the qualified name of anonymous enums. * src/abg-reporter-priv.cc (report_name_size_and_alignment_changes): Do not report about name changes for anonymous enums. Signed-off-by: Dodji Seketeli --- src/abg-default-reporter.cc | 12 +++++++++--- src/abg-reporter-priv.cc | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/abg-default-reporter.cc b/src/abg-default-reporter.cc index b1df9300..c71f8d56 100644 --- a/src/abg-default-reporter.cc +++ b/src/abg-default-reporter.cc @@ -162,7 +162,9 @@ default_reporter::report(const enum_diff& d, ostream& out, { out << indent << " '" - << i->get_qualified_name() + << (first->get_is_anonymous() + ? i->get_name() + : i->get_qualified_name()) << "' value '" << i->get_value() << "'"; @@ -181,7 +183,9 @@ default_reporter::report(const enum_diff& d, ostream& out, { out << indent << " '" - << i->get_qualified_name() + << (second->get_is_anonymous() + ? i->get_name() + :i->get_qualified_name()) << "' value '" << i->get_value() << "'"; @@ -201,7 +205,9 @@ default_reporter::report(const enum_diff& d, ostream& out, { out << indent << " '" - << i->first.get_qualified_name() + << (first->get_is_anonymous() + ? i->first.get_name() + : i->first.get_qualified_name()) << "' from value '" << i->first.get_value() << "' to '" << i->second.get_value() << "'"; diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc index 63a45b80..cc38f240 100644 --- a/src/abg-reporter-priv.cc +++ b/src/abg-reporter-priv.cc @@ -965,7 +965,8 @@ report_name_size_and_alignment_changes(decl_base_sptr first, string fn = first->get_qualified_name(), sn = second->get_qualified_name(); - if (fn != sn) + if (!(first->get_is_anonymous() && second->get_is_anonymous()) + && fn != sn) { if (!(ctxt->get_allowed_category() & HARMLESS_DECL_NAME_CHANGE_CATEGORY) && filtering::has_harmless_name_change(first, second)) From patchwork Wed Oct 4 10:54:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 77092 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 E1CF4385841B for ; Wed, 4 Oct 2023 10:55:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E1CF4385841B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1696416952; bh=uyZvaSqZuZbPZCzIfOyRTXPOb4TNqJcTmpmP8/Xgw8g=; h=To:Subject:References:Date:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=dvif705Afdt7H3YjmSnMq0W0jHz2A80tda4Z/W9fEuWpXtpVuetz2RlxUK3CXVBQw TWiXCZrOmcax6Wyg44gxy615jSK+YhNBDBEzNBxAE45PDP+bdG/C8OQ480OFS4SRGx tqFJN/6GxiiPmNGxwykKbicbSJvjbQ/UwJEAOLi8= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 5B2673858C52 for ; Wed, 4 Oct 2023 10:54:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5B2673858C52 Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-404-ffhlPwNxP5uHBWUOAXFheQ-1; Wed, 04 Oct 2023 06:54:19 -0400 X-MC-Unique: ffhlPwNxP5uHBWUOAXFheQ-1 Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-4194d8b6fceso24359991cf.1 for ; Wed, 04 Oct 2023 03:54:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696416859; x=1697021659; h=mime-version:user-agent:message-id:in-reply-to:date:references :organization:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uyZvaSqZuZbPZCzIfOyRTXPOb4TNqJcTmpmP8/Xgw8g=; b=AXwfqApfvUJyp9woHTDJAfBwLRKOb7DqgEQFJ9Y8wW+B/SkXbKTlkQRqzq9PVd0YtE 2Fro5pKpZtpRRFhwu1iHLfjHPQZBWuntf2QMIFY6HwUBIygOjl2Mk6BqCM36Dmaxzvwj bwUfWjxNkjOSqbGSEGs2jbnciAnhS9ZkQBaPMzc4MGCwfCit4fDd1GUKeT86xqfVEFyO 2PEtV44oiPEGdS3AUgVZG747Nrek9WpuRJOWcxZRwl9XGQFQkbTTVXA50KNTknjg7k4I Xnk8jpLagJ+iv1C1bNCcd/arglUBgHOliQ/rDtTJxfquah+1HgF0yGyJDTwd/8hWTVjG /DWA== X-Gm-Message-State: AOJu0YwZIOkSio4bxDaZPyRMcoGcce2NDPmjLzWj30bddte3Q5zFgt51 CLj6mYCRQqtOoY2tL8OEaB3vBV+OQzABpe+A89PTaySNoxXf08c0nJ9vF231lkXwR/jMPpPGprZ yLBxaBAXo7sL3q1ZiQxJk X-Received: by 2002:ac8:7f86:0:b0:418:111e:7910 with SMTP id z6-20020ac87f86000000b00418111e7910mr2010121qtj.43.1696416858108; Wed, 04 Oct 2023 03:54:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE7KVsLKd0TyIL3J0OMiwTCzWe4GqjnkDpEN6eSFD6gDfWpAUIUWwspMD8MX0d5i0RioCIDvw== X-Received: by 2002:ac8:7f86:0:b0:418:111e:7910 with SMTP id z6-20020ac87f86000000b00418111e7910mr2010091qtj.43.1696416857074; Wed, 04 Oct 2023 03:54:17 -0700 (PDT) Received: from localhost ([88.120.130.27]) by smtp.gmail.com with ESMTPSA id h25-20020ac87159000000b0040331a24f16sm1140605qtp.3.2023.10.04.03.54.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 03:54:15 -0700 (PDT) Received: by localhost (Postfix, from userid 1000) id 65F66B6EB1; Wed, 4 Oct 2023 12:54:12 +0200 (CEST) To: Dodji Seketeli Subject: [PATCH 2/3, V2] For WIP branch check-uapi-support: ir,comparison,corpus: Better support anonymous enums comparison Organization: Red Hat / France References: <87r0mapspt.fsf@redhat.com> X-Operating-System: CentOS Stream release 9 X-URL: http://www.redhat.com Date: Wed, 04 Oct 2023 12:54:12 +0200 In-Reply-To: <87r0mapspt.fsf@redhat.com> (Dodji Seketeli's message of "Wed, 04 Oct 2023 12:50:06 +0200") Message-ID: <87h6n6psiz.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Dodji Seketeli via Libabigail From: Dodji Seketeli Reply-To: Dodji Seketeli Cc: Trilok Soni , libabigail@sourceware.org, Satya Durga Srinivasu Prabhala Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" Hello, Anonymous enums are designated using their internal names which are automatically generated. The problem however is that whenever a new anonymous enum gets inserted in the translation unit, that can randomly change the name of existing anonymous enums. This makes reporting of changes in anonymous enums essentially useless. To address this issue, this patch uses flat representation for anonymous enums, for the purpose of designating them outside of the context of type canonicalization. This is like what is done already for anonymous classes and unions. * include/abg-fwd.h (get_enum_flat_representation) (get_class_or_enum_flat_representation): Declare new functions. * include/abg-ir.h (enum_type_decl::get_sorted_enumerators): Declare new member functions. * src/abg-comparison.cc (corpus_diff::priv::{ensure_lookup_tables_populated, added_unreachable_type_is_suppressed, deleted_unreachable_type_is_suppressed, record_type_as_reachable_from_public_interfaces}): Use non-internal pretty representation to designate ABI artifacts so that anonymous enums get designated by their flat representation. * src/abg-corpus.cc (corpus::type_is_reachable_from_public_interfaces): Likewise. * src/abg-ir.cc (get_type_name): The type name of an anonymous enum or class should is now the flat representation if we are not in the context of type canonicalization. (enum_type_decl::get_pretty_representation): If we are not in the context of type canonicalization, the pretty representation of an enum is its flat representation. (get_enum_flat_representation) (get_class_or_enum_flat_representation): Define new functions. (enum_type_decl::get_sorted_enumerators): Likewise. * tests/data/test-annotate/libtest23.so.abi: Adjust. * tests/data/test-annotate/test-anonymous-members-0.o.abi: Likewise. * tests/data/test-annotate/test15-pr18892.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/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise. * tests/data/test-diff-dwarf/test43-PR22913-report-0.txt: Likewise. * tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise. * tests/data/test-read-dwarf/libtest23.so.abi: Likewise. * tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise. * tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise. * tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi: Likewise. * tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi: Likewise. Signed-off-by: Dodji Seketeli --- include/abg-fwd.h | 27 + include/abg-ir.h | 3 + src/abg-comparison.cc | 10 +- src/abg-corpus.cc | 4 +- src/abg-ir.cc | 203 +- tests/data/test-annotate/libtest23.so.abi | 224 +- .../test-anonymous-members-0.o.abi | 22 +- .../data/test-annotate/test15-pr18892.so.abi | 8 +- ...st18-pr19037-libvtkRenderingLIC-6.1.so.abi | 54 +- ...19-pr19023-libtcmalloc_and_profiler.so.abi | 10 +- ...st20-pr19025-libvtkParallelCore-6.1.so.abi | 2 +- .../test43-PR22913-report-0.txt | 4 +- .../test-read-dwarf/PR22122-libftdc.so.abi | 12416 ++++++++-------- tests/data/test-read-dwarf/libtest23.so.abi | 216 +- .../test-read-dwarf/test-libandroid.so.abi | 44 +- .../test-read-dwarf/test16-pr18904.so.abi | 1816 +-- ...st18-pr19037-libvtkRenderingLIC-6.1.so.abi | 40 +- .../test22-pr19097-libstdc++.so.6.0.17.so.abi | 60 +- 18 files changed, 7637 insertions(+), 7526 deletions(-) diff --git a/include/abg-fwd.h b/include/abg-fwd.h index 0afb2122..e494de07 100644 --- a/include/abg-fwd.h +++ b/include/abg-fwd.h @@ -1097,6 +1097,33 @@ get_class_or_union_flat_representation(const class_or_union_sptr& cou, bool internal, bool qualified_name = true); +string +get_enum_flat_representation(const enum_type_decl& enum_type, + const string& indent, + bool one_line, + bool internal, + bool qualified_names); + +string +get_enum_flat_representation(const enum_type_decl* enum_type, + const string& indent, + bool one_line, + bool internal, + bool qualified_names); + +string +get_enum_flat_representation(const enum_type_decl_sptr& enum_type, + const string& indent, + bool one_line, + bool qualified_names); + +string +get_class_or_enum_flat_representation(const type_base& coe, + const string& indent, + bool one_line, + bool internal, + bool qualified_name); + string get_debug_representation(const type_or_decl_base*); diff --git a/include/abg-ir.h b/include/abg-ir.h index 18e95afd..3e2cbda9 100644 --- a/include/abg-ir.h +++ b/include/abg-ir.h @@ -2743,6 +2743,9 @@ public: const enumerators& get_enumerators() const; + const enumerators& + get_sorted_enumerators() const; + enumerators& get_enumerators(); diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc index 1207729c..228909dc 100644 --- a/src/abg-comparison.cc +++ b/src/abg-comparison.cc @@ -9541,7 +9541,8 @@ corpus_diff::priv::ensure_lookup_tables_populated() if (!is_user_defined_type(t)) continue; - string repr = abigail::ir::get_pretty_representation(t, true); + string repr = + abigail::ir::get_pretty_representation(t, /*internal=*/false); deleted_unreachable_types_[repr] = t; } @@ -9563,7 +9564,8 @@ corpus_diff::priv::ensure_lookup_tables_populated() if (!is_user_defined_type(t)) continue; - string repr = abigail::ir::get_pretty_representation(t, true); + string repr = + abigail::ir::get_pretty_representation(t, /*internal=*/false); // Let's see if the inserted type we are looking at was // reported as deleted as well. @@ -9847,7 +9849,7 @@ corpus_diff::priv::added_unreachable_type_is_suppressed(const type_base *t)const if (!t) return false; - string repr = abigail::ir::get_pretty_representation(t, /*internal=*/true); + string repr = abigail::ir::get_pretty_representation(t, /*internal=*/false); string_type_base_sptr_map::const_iterator i = suppressed_added_unreachable_types_.find(repr); if (i == suppressed_added_unreachable_types_.end()) @@ -9869,7 +9871,7 @@ corpus_diff::priv::deleted_unreachable_type_is_suppressed(const type_base *t) co if (!t) return false; - string repr = abigail::ir::get_pretty_representation(t, /*internal=*/true); + string repr = abigail::ir::get_pretty_representation(t, /*internal=*/false); string_type_base_sptr_map::const_iterator i = suppressed_deleted_unreachable_types_.find(repr); if (i == suppressed_deleted_unreachable_types_.end()) diff --git a/src/abg-corpus.cc b/src/abg-corpus.cc index 7cf2d11d..4a4cb8bc 100644 --- a/src/abg-corpus.cc +++ b/src/abg-corpus.cc @@ -774,7 +774,7 @@ corpus::recording_types_reachable_from_public_interface_supported() void corpus::record_type_as_reachable_from_public_interfaces(const type_base& t) { - string repr = get_pretty_representation(&t, /*internal=*/true); + string repr = get_pretty_representation(&t, /*internal=*/false); interned_string s = t.get_environment().intern(repr); priv_->get_public_types_pretty_representations()->insert(s); } @@ -792,7 +792,7 @@ corpus::record_type_as_reachable_from_public_interfaces(const type_base& t) bool corpus::type_is_reachable_from_public_interfaces(const type_base& t) const { - string repr = get_pretty_representation(&t, /*internal=*/true); + string repr = get_pretty_representation(&t, /*internal=*/false); interned_string s = t.get_environment().intern(repr); return (priv_->get_public_types_pretty_representations()->find(s) diff --git a/src/abg-ir.cc b/src/abg-ir.cc index fc3437d6..06dfbe20 100644 --- a/src/abg-ir.cc +++ b/src/abg-ir.cc @@ -8845,6 +8845,8 @@ get_type_name(const type_base* t, bool qualified, bool internal) return fn_type->get_cached_name(internal); } + const environment&env = d->get_environment(); + // All anonymous types of a given kind get to have the same internal // name for internal purpose. This to allow them to be compared // among themselves during type canonicalization. @@ -8863,10 +8865,18 @@ get_type_name(const type_base* t, bool qualified, bool internal) if (qualified) return d->get_qualified_name(internal); - const environment&env = d->get_environment(); return env.intern(get_internal_integral_type_name(t)); } + if (d->get_is_anonymous()) + { + if (is_class_or_union_type(t) || is_enum_type(t)) + return env.intern + (get_class_or_enum_flat_representation (*t, "", + /*one_line=*/true, + internal, qualified)); + } + if (qualified) return d->get_qualified_name(internal); return d->get_name(); @@ -9563,6 +9573,165 @@ get_class_or_union_flat_representation(const class_or_union_sptr& cou, internal, qualified_names);} +/// Get the flat representation of an instance of @ref enum_type_decl +/// type. +/// +/// The flat representation of a given @ref enum_type_decl type is the +/// actual definition of the type, for instance: +/// +/// enum {E_0 =0, E_1 = 1} +/// +///@param enum_type the enum type to consider. +/// +///@param indent the identation spaces to use in the representation. +/// +///@param one_line if true, then the flat representation stands on one +///line. Otherwise, it stands on multiple lines. +/// +///@param qualified_names use qualified names when applicable. +///Typically, if this is true, the name of the enum is going to be +///qualified. +/// +///@return the resulting flat representation. +string +get_enum_flat_representation(const enum_type_decl& enum_type, + const string& indent, bool one_line, + bool qualified_names) +{ + string repr; + std::ostringstream o; + string local_indent = " "; + + repr = indent + "enum "; + + if (!enum_type.get_is_anonymous()) + o << (qualified_names + ? enum_type.get_qualified_name() + : enum_type.get_name()) + " "; + + o << "{"; + + if (!one_line) + o << "\n"; + + for (const auto &enumerator : enum_type.get_sorted_enumerators()) + { + if (!one_line) + o << "\n" + indent; + + o << enumerator.get_name() + "=" << enumerator.get_value() << ", "; + } + + if (!one_line) + o << "\n" + indent << "}"; + else + o << "}"; + + repr =o.str(); + + return repr; +} + +/// Get the flat representation of an instance of @ref enum_type_decl +/// type. +/// +/// The flat representation of a given @ref enum_type_decl type is the +/// actual definition of the type, for instance: +/// +/// enum {E_0 =0, E_1 = 1} +/// +///@param enum_type the enum type to consider. +/// +///@param indent the identation spaces to use in the representation. +/// +///@param one_line if true, then the flat representation stands on one +///line. Otherwise, it stands on multiple lines. +/// +///@param qualified_names use qualified names when applicable. +///Typically, if this is true, the name of the enum is going to be +///qualified. +/// +///@return the resulting flat representation. +string +get_enum_flat_representation(const enum_type_decl* enum_type, + const string& indent, bool one_line, + bool qualified_names) +{ + if (!enum_type) + return ""; + + return get_enum_flat_representation(*enum_type, indent, + one_line, qualified_names); +} + +/// Get the flat representation of an instance of @ref enum_type_decl +/// type. +/// +/// The flat representation of a given @ref enum_type_decl type is the +/// actual definition of the type, for instance: +/// +/// enum {E_0 =0, E_1 = 1} +/// +///@param enum_type the enum type to consider. +/// +///@param indent the identation spaces to use in the representation. +/// +///@param one_line if true, then the flat representation stands on one +///line. Otherwise, it stands on multiple lines. +/// +///@param qualified_names use qualified names when applicable. +///Typically, if this is true, the name of the enum is going to be +///qualified. +/// +///@return the resulting flat representation. +string +get_enum_flat_representation(const enum_type_decl_sptr& enum_type, + const string& indent, bool one_line, + bool qualified_names) +{ + return get_enum_flat_representation(enum_type.get(), + indent, one_line, + qualified_names); +} + +/// Get the flat representation of an instance of @ref enum_type_decl +/// type. +/// +/// The flat representation of a given @ref enum_type_decl type is the +/// actual definition of the type, for instance: +/// +/// enum {E_0 =0, E_1 = 1} +/// +///@param enum_type the enum type to consider. +/// +///@param indent the identation spaces to use in the representation. +/// +///@param one_line if true, then the flat representation stands on one +///line. Otherwise, it stands on multiple lines. +/// +///@param qualified_names use qualified names when applicable. +///Typically, if this is true, the name of the enum is going to be +///qualified. +/// +///@return the resulting flat representation. +string +get_class_or_enum_flat_representation(const type_base& coe, + const string& indent, + bool one_line, + bool internal, + bool qualified_name) + +{ + string repr; + if (const class_or_union* cou = is_class_or_union_type(&coe)) + repr = get_class_or_union_flat_representation(cou, indent, one_line, + internal, qualified_name); + else if (const enum_type_decl* enom = is_enum_type(&coe)) + repr = get_enum_flat_representation(*enom, indent, one_line, qualified_name); + + return repr; +} + /// Get the textual representation of a type for debugging purposes. /// /// If the type is a class/union, this shows the data members, virtual @@ -18578,6 +18747,7 @@ class enum_type_decl::priv { type_base_sptr underlying_type_; enumerators enumerators_; + mutable enumerators sorted_enumerators_; friend class enum_type_decl; @@ -18643,6 +18813,33 @@ enum_type_decl::enumerators& enum_type_decl::get_enumerators() {return priv_->enumerators_;} +/// Get the lexicographically sorted vector of enumerators. +/// +/// @return the lexicographically sorted vector of enumerators. +const enum_type_decl::enumerators& +enum_type_decl::get_sorted_enumerators() const +{ + if (priv_->sorted_enumerators_.empty()) + { + for (auto e = get_enumerators().rbegin(); + e != get_enumerators().rend(); + ++e) + priv_->sorted_enumerators_.push_back(*e); + + std::sort(priv_->sorted_enumerators_.begin(), + priv_->sorted_enumerators_.end(), + [](enum_type_decl::enumerator& l, + enum_type_decl::enumerator& r) + { + if (l.get_name() == r.get_name()) + return l.get_value() < r.get_value(); + return (l.get_name() < r.get_name()); + }); + } + + return priv_->sorted_enumerators_; +} + /// Get the pretty representation of the current instance of @ref /// enum_type_decl. /// @@ -18668,6 +18865,10 @@ enum_type_decl::get_pretty_representation(bool internal, if (internal && get_is_anonymous()) r += get_type_name(this, qualified_name, /*internal=*/true); + else if (get_is_anonymous()) + r += get_enum_flat_representation(*this, "", + /*one_line=*/true, + qualified_name); else r += decl_base::get_pretty_representation(internal, qualified_name); diff --git a/tests/data/test-annotate/libtest23.so.abi b/tests/data/test-annotate/libtest23.so.abi index dcbf8edc..6ca5c79d 100644 --- a/tests/data/test-annotate/libtest23.so.abi +++ b/tests/data/test-annotate/libtest23.so.abi @@ -137,54 +137,54 @@ - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + @@ -201,7 +201,7 @@ - + @@ -209,11 +209,11 @@ - + - + @@ -235,12 +235,12 @@ - + - + @@ -263,7 +263,7 @@ - + @@ -311,7 +311,7 @@ - + @@ -321,7 +321,7 @@ - + @@ -330,7 +330,7 @@ - + @@ -341,9 +341,9 @@ - + - + @@ -352,13 +352,13 @@ - + - + - + - + @@ -367,13 +367,13 @@ - + - + - + - + @@ -384,11 +384,11 @@ - + - + @@ -399,7 +399,7 @@ - + @@ -412,9 +412,9 @@ - + - + @@ -427,7 +427,7 @@ - + @@ -467,7 +467,7 @@ - + @@ -491,12 +491,12 @@ - + - + - - + + @@ -505,7 +505,7 @@ - + @@ -514,7 +514,7 @@ - + @@ -525,7 +525,7 @@ - + @@ -534,7 +534,7 @@ - + @@ -543,18 +543,18 @@ - + - + - + - + @@ -563,9 +563,9 @@ - + - + @@ -574,7 +574,7 @@ - + @@ -583,18 +583,18 @@ - + - + - + - + @@ -603,7 +603,7 @@ - + @@ -612,16 +612,16 @@ - + - + - + @@ -632,7 +632,7 @@ - + @@ -643,7 +643,7 @@ - + @@ -677,7 +677,7 @@ - + @@ -690,18 +690,18 @@ - + - + - + @@ -712,7 +712,7 @@ - + @@ -721,31 +721,31 @@ - + - + - + - + - + - + @@ -754,7 +754,7 @@ - + @@ -763,7 +763,7 @@ - + @@ -772,7 +772,7 @@ - + @@ -783,7 +783,7 @@ - + @@ -794,7 +794,7 @@ - + @@ -805,7 +805,7 @@ - + @@ -827,7 +827,7 @@ - + @@ -835,7 +835,7 @@ - + @@ -847,7 +847,7 @@ - + @@ -857,7 +857,7 @@ - + @@ -866,7 +866,7 @@ - + @@ -879,7 +879,7 @@ - + @@ -890,7 +890,7 @@ - + @@ -898,7 +898,7 @@ - + @@ -906,9 +906,9 @@ - + - + @@ -918,7 +918,7 @@ - + @@ -927,7 +927,7 @@ - + @@ -936,9 +936,9 @@ - + - + @@ -1002,7 +1002,7 @@ - + @@ -1024,9 +1024,9 @@ - + - + @@ -1080,9 +1080,9 @@ - + - + diff --git a/tests/data/test-annotate/test-anonymous-members-0.o.abi b/tests/data/test-annotate/test-anonymous-members-0.o.abi index e272d213..d75e67ee 100644 --- a/tests/data/test-annotate/test-anonymous-members-0.o.abi +++ b/tests/data/test-annotate/test-anonymous-members-0.o.abi @@ -13,15 +13,15 @@ - - + + - - + + - + @@ -29,11 +29,11 @@ - - + + - - + + @@ -103,7 +103,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/tests/data/test-annotate/test15-pr18892.so.abi b/tests/data/test-annotate/test15-pr18892.so.abi index d3616699..b749a0a6 100644 --- a/tests/data/test-annotate/test15-pr18892.so.abi +++ b/tests/data/test-annotate/test15-pr18892.so.abi @@ -10883,7 +10883,7 @@ - + @@ -35469,7 +35469,7 @@ - + @@ -35517,9 +35517,9 @@ - + - + diff --git a/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi b/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi index 0a6893b4..adff58f8 100644 --- a/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi +++ b/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi @@ -8146,7 +8146,7 @@ - + @@ -12813,7 +12813,7 @@ - + @@ -21260,18 +21260,8 @@ - - - - - - - - - - - - + + @@ -21279,6 +21269,16 @@ + + + + + + + + + + @@ -24118,18 +24118,8 @@ - - - - - - - - - - - - + + @@ -24137,6 +24127,16 @@ + + + + + + + + + + @@ -27487,7 +27487,7 @@ - + diff --git a/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi b/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi index ea12beac..97490f59 100644 --- a/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi +++ b/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi @@ -20183,7 +20183,7 @@ - + @@ -25068,21 +25068,21 @@ - + - + - + @@ -32572,7 +32572,7 @@ - + diff --git a/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi b/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi index 4b4166bf..3de32474 100644 --- a/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi +++ b/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi @@ -21731,7 +21731,7 @@ - + diff --git a/tests/data/test-diff-dwarf/test43-PR22913-report-0.txt b/tests/data/test-diff-dwarf/test43-PR22913-report-0.txt index fc35f21d..d0515c69 100644 --- a/tests/data/test-diff-dwarf/test43-PR22913-report-0.txt +++ b/tests/data/test-diff-dwarf/test43-PR22913-report-0.txt @@ -4,8 +4,8 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 function with some indirect sub-type change: [C] 'function char f1(Struct1Ptr)' has some indirect sub-type changes: - parameter 1 of type 'typedef Struct1Ptr' has sub-type changes: - underlying type '__anonymous_struct__1*' changed: + parameter 1 of type 'typedef Struct1Ptr' changed: + underlying type 'struct {char m1; char m2;}*' changed: in pointed to type 'struct {char m1; char m2;}': type size changed from 16 to 8 (in bits) 1 data member deletion: diff --git a/tests/data/test-read-dwarf/PR22122-libftdc.so.abi b/tests/data/test-read-dwarf/PR22122-libftdc.so.abi index a1f8778c..501658df 100644 --- a/tests/data/test-read-dwarf/PR22122-libftdc.so.abi +++ b/tests/data/test-read-dwarf/PR22122-libftdc.so.abi @@ -357,136 +357,133 @@ - - - - - + + + + + - - - - + + - - - + + - - - + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + @@ -494,105 +491,105 @@ - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + @@ -600,91 +597,91 @@ - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - - + + + - + @@ -692,96 +689,96 @@ - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - - - - + + + + - - - + + + - + - + - - - + + + - + @@ -790,7 +787,7 @@ - + @@ -800,90 +797,90 @@ - + - - + + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - - - - + + + + - + - - - - + + + + - + - - - - + + + + @@ -891,13 +888,13 @@ - + - + @@ -915,26 +912,26 @@ - + - + - - + + - + @@ -946,19 +943,19 @@ - + - + - + @@ -970,90 +967,90 @@ - - + + - - + + - + - + - + - - + + - + - - + + - - - + + + - - + + - + - - + + - - + + @@ -1061,8 +1058,8 @@ - - + + @@ -1070,8 +1067,8 @@ - - + + @@ -1079,29 +1076,29 @@ - + - - + + - - + + - - + + @@ -1109,14 +1106,14 @@ - + - - + + @@ -1124,8 +1121,8 @@ - - + + @@ -1133,8 +1130,8 @@ - - + + @@ -1142,7 +1139,7 @@ - + @@ -1150,246 +1147,246 @@ - + - - + + - - + + - + - - + + - + - + - + - - + + - + - + - - + + - + - + - - + + - - - + + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - - + + - + - + - + - + - + - + - + @@ -1528,7 +1525,7 @@ - + @@ -1653,14 +1650,14 @@ - + - + @@ -1678,7 +1675,7 @@ - + @@ -1692,7 +1689,7 @@ - + @@ -1704,7 +1701,7 @@ - + @@ -1762,28 +1759,28 @@ - + - + - + - + - + - - + + - + @@ -1795,15 +1792,15 @@ - + - + - + @@ -1814,11 +1811,11 @@ - + - + @@ -1876,34 +1873,34 @@ - - + + - + - - + + - + - + - + - - + + - + - + @@ -2310,7 +2307,7 @@ - + @@ -2956,12 +2953,12 @@ - - + + - + @@ -2969,133 +2966,133 @@ - + - + - + - + - + - + - + - + - + - + - - - + + + - - - - + + + + - + - + - + - + - - + + - + - - + + - + - - - + + + - - + + - + - + - - + + - + - + - - + + - + - + - + @@ -3103,499 +3100,489 @@ - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - - + + - + - + - + - - + + - + - + - - + + - - - + + + - + - + - - + + - - - + + + - - - + + + - + - + - - - + + + - - + + - + - - - - - + + + + + + + - - - - - + + + + + - + - - - - + + + + - - + + - - - - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + - - + + - + - + - + - + - - - + + + - - + + - + - - + + - - + + - + - + @@ -3603,429 +3590,429 @@ - - - + + + - + - - - - + + + + - - - - + + + + - + - - + + - + - + - + - + - + - - + + - - - + + + - + - - + + - + - - + + - + - - - - + + + + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - - + + - + - + - + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - + - - - - + + + + - - - - + + + + - + - - - + + + - + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - + - - - + + + - + - - - + + + - + - + - + - + - - + + - + - + - - - - + + + + - + - - - + + + - + - + - + - - - - + + + + - + - + - - + + - + - + - - - + + + - + - - - - + + + + - + - - - + + + - + - - + + - - - + + + - - + + - + - + - - - - + + + + - + - - + + - - + + - + - + - - + + - + - + - + - + @@ -4035,384 +4022,384 @@ - + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - - - + + + - - - + + + - + - - + + - - + + - + - + - - - + + + - - - + + + - - + + - + - - + + - - + + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - + + - + - + - + - + - - + + - - - + + + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + @@ -4420,566 +4407,535 @@ - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - - + + - + - + - - + + - + - - + + - - + + - + - + - - + + - + - - + + - + - - + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - - + + + - + - - - + + + - - + + - - - + + + - - - + + + - - + + - + - - - + + + - - - + + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + - - - - - - + + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - + + - - - - - + + + + + - - - + + + - + - + - + - + - - + + - + - - + + - - + + - - - + + + - - - + + + - + - + - + - + - + - + - - - + + + - - - + + + - + - + - - + + - + @@ -4987,963 +4943,963 @@ - + - + - - + + - - - - + + + + - - - + + + - + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - + - + - + - + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - + - - - - + + + + - - - + + + - + - - - + + + - + - + - + - + - - - - + + + + - + - - - - + + + + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - + - - - - + + + + - - - + + + - + - - - - - + + + + + - - - + + + - + - - + + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - + + - + - + - - + + - + - - - + + + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - - + + - + - + - - - + + + - - - + + + - + - + - + - + - - + + - - + + - - + + - + - + - - + + - - - + + + - - - + + + - - - + + + - + - + - - + + - - - + + + - + - + - - + + - + - + - - - - - + + + + + - + - + - + - + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - + - - - + + + - - - + + + - + - + - - + + - - - + + + - - - + + + - + - - - + + + - - - - + + + + - - - - + + + + - - + + - - + + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - - + + - + - - - + + + - + - - + + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - - + + - + - + - - + + @@ -5952,1659 +5908,1629 @@ - - + + - + - - + + - + - - + + - + - - + + - + - - - + + + - - - + + + - - - + + + - + - - - + + + - + - + - - - + + + - - + + - + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - - + + + - + - - - + + + - - + + - - - + + + - + - - + + - + - - + + - - - + + + - + - + - - + + - - + + - + - + - - + + - - + + - - - + + + - + - + - + - - - + + + - - - + + + - + - + - - - + + + - - - + + + - - + + - + - + - + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - + - + - - + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + - - - - - - - - + + + + + - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + - + - + - + - - - - + + + + - - + + - - + + - + - - + + - + - + - - + + - + - - - + + + - - + + - + - - + + - + - - - + + + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - - - - - - + + + + + + - - - + + + - + - - - - + + + + - + - + - + - + - - + + - + - - + + - + - - - - + + + + - - - + + + - - - - + + + + - - + + - + - - - + + + - - - + + + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - - - - + + + + - - - - + + + + - + - + - - + + - - - + + + - - + + - - + + - + - + - + - + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - + - + - - - + + + - - - + + + - + - + - - - + + + - - + + - + - - - - - + + + + + - - + + - + - - - - - + + + + + - + - - - - + + + + - - + + - - + + - - + + - - + + - - - + + + - + - - + + - - - + + + - - + + - + - - + + - - - + + + - + - + - + - - - + + + - - + + - + - + - - + + - - - + + + - - + + - + - + - - + + - - - + + + - + - - - + + + - - - + + + - + - - + + - + - - + + - + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - + - + - - - + + + - - - + + + - - - + + + - - + + - - + + - + - + - + - + - - + + - + - + - + - - - - + + + + - - - + + + - + - - + + - + - - - + + + - + - + - + - - + + - + - - + + - + - + - + - - - + + + - + - - - - + + + + - + - - - + + + - + - + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - - + + - - + + - + - + - - - - + + + + - - - + + + - + - + - - - + + + - - - + + + - - - + + + - + - + - - + + - + - + - - - + + + - - - + + + - - - + + + - + - + - + - + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - - + + + - + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + @@ -7612,724 +7538,713 @@ - - + + - + - + - + - + - - - + + + - + - + - + - - + + - - + + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - + + + - - - + + + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - - - + + + - + - + - + - - - + + + - - - + + + - - - + + + - + - + - + - - + + - + - - + + - - + + - - + + - + - + - - - + + + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - + - + - - + + - - - + + + - - - + + + - - + + - + - - - + + + - + - - + + - + - + - - - + + + - - + + - - + + - + - + - - - + + + - + - + - + - + - - - + + + - - - + + + - - + + - - + + - - - + + + - + - + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + - + - - + + - + - + - - + + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - - + + - - + + - + - + - - + + - - - + + + - + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - + - + - - - + + + - + - + - + @@ -8337,1252 +8252,1298 @@ - - - + + + - - - + + + - + - - - - + + + + - - - - + + + + - + - + - + - + - - - - + + + + - - - - + + + + - + - - - + + + - + - - + + - + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - - + + - - - + + + - + - + - - + + - + - + - + - + - + - - + + - - - + + + - - + + - - + + - + - + - + - + - - - + + + - + - - - + + + - + - + - + - - + + - + - - + + - + - + - + - - + + - - + + - + - + - + - - - - + + + + - + - - + + - - - - + + + + - - + + - + - + - + - + - + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - - - + + + - - - + + + - + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - + - + - + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - + - + - - + + - - - + + + - + - - + + - - - + + + - - + + - - - + + + - - + + - + - + - - + + - + - - - + + + - + - - + + - + - + - + - - + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - + + - + - - - + + + - + - + - - + + - - + + - + - - + + - - - + + + - - - + + + - + - - + + - - - + + + - + - - + + - + - + - - - + + + - + - - + + - + - + - - - + + + - + - + - + - - - + + + - + - + - + - - - + + + - + - - + + - + - + - - + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - + - - - + + + - - + + - + - - + + - + - + - - + + - - - + + + - + - + - - + + - - + + - + - - + + - - - + + + - - - + + + - - + + - - - + + + - + - + - + - - + + - - + + - - + + - - - + + + - + - + - - + + - - + + - + - + - + - + - - + + - - - + + + - - - + + + - + - + - - + + - - + + - - - + + + - + - + - + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - + - - + + - - + + - - - + + + - + - + - + - - + + - - + + - - + + - - + + - - - + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + @@ -9592,278 +9553,212 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - + + + - - - + + - - - + + - - - - - + + + - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - - + + - + - - + + - - + + - - + + - - - - - - - - + + + + + + + + - + - + - + - + - - + + - - + + - - - + + + - - + + - - + + - - + + - + - + @@ -9871,170 +9766,170 @@ - - - + + + - + - - + + - - - + + + - + - - - - + + + + - + - + - - + + - + - - + + - + - - + + - - + + - + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - - + + + - - + + - + - - + + - + - + @@ -10042,861 +9937,861 @@ - - - + + + - + - - - - - + + + + + - - - + + + - + - + - + - + - - - + + + - + - - - - + + + + - - - + + + - + - + - - + + - + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - + - - - - + + + + - + - + - + - + - - + + - + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - + - - - - + + + + - + - + - + - - - + + + - + - - - + + + - - + + - - - - + + + + - + - + - + - + - - - - - + + + + + - - - + + + - + - - + + - + - - + + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - + - - + + - + - + - + - - + + - - + + - - + + - + - - + + - + - + - - - + + + - - + + - + - + - + - + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - + - + - - + + - + - + - - - - + + + + - - - - + + + + - + - - - - + + + + - + - - - - + + + + - - - + + +