From patchwork Thu Jul 9 13:14:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39995 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 63B613844033; Thu, 9 Jul 2020 13:14:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 63B613844033 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1594300485; bh=gM1CedjgsAAQaY6uPCrRwZ06I4cJ6UQGBiwSY2PhoP4=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=byJtCB7ljaTwypa3UIBvNzg4RMH27dCXOvHoxuwXRrXSmRyoj0tnIHmONRHQfw6rH GrK6b0SXgor4w/2GqfCRWyFW+9fZxWHcU5ApUfQ/BBCK/Mqsp3B2qmZenqweGcpuHw FOOQILtRNJRprXFKpIe5sfkQlWieDb6Z4gvMWvFU= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-wr1-x44a.google.com (mail-wr1-x44a.google.com [IPv6:2a00:1450:4864:20::44a]) by sourceware.org (Postfix) with ESMTPS id D88BC3844033 for ; Thu, 9 Jul 2020 13:14:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D88BC3844033 Received: by mail-wr1-x44a.google.com with SMTP id j16so1919527wrw.3 for ; Thu, 09 Jul 2020 06:14:42 -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=gM1CedjgsAAQaY6uPCrRwZ06I4cJ6UQGBiwSY2PhoP4=; b=NubULiLvkUXZDTPnqi6yN9vEfhYPc7fxbQ0i9lHYItrzGpecAT+FHElAG5lB5XuwlM OJ7ukgAbBJ7vcEpDGDfSKJNJOKXkJqQW/m/aP8dwQTqI1L4MILVlN+DxonqWXcH5m4g6 a0G5Ql0REwwdiYaCoN9k6YWf5k+UGcBVMMnobUS6XPUtKzv1LFE//GTLSrpySYOcpA5o lPPj+867I3PBH4V1svxgCI+CR34LeHPuD921+LUe+juoOdpM42R2U1+MRSH+7FzymJBR jBjmAHwaWa1hvTUmM5Ua7jn/iAYnda1rYojCCppTu57pHpDByMujLR07Y5sCrxegin7N hWMA== X-Gm-Message-State: AOAM5318eae9gK6jNVTK4ZBxbnKVJfekMqpIHRriwrHCnIi+Ow5mck/1 5bv0IhYi23BQtqlkdGD+RvIDX+lMkKIrc7+skxTP13Vt3xKCvbxhlzWS9Z3pXeHAnywGTYXVDy6 9K3vppducMwSnWlW8y+N4kU96QrjFe91pTQz+Doq/mw2ZlqQj4eOhJrcgUVL+ZPixkAQqjDY= X-Google-Smtp-Source: ABdhPJzSGwNspwxLciJgUUgvZZao0HEvk0tU3v6vGpOeOYTZLS9vp/D4eyej/Nm/Ezko87yMfN5A5ry0VriFmw== X-Received: by 2002:a1c:ac81:: with SMTP id v123mr13772038wme.159.1594300481806; Thu, 09 Jul 2020 06:14:41 -0700 (PDT) Date: Thu, 9 Jul 2020 14:14:29 +0100 In-Reply-To: <20200709131429.1366074-1-gprocida@google.com> Message-Id: <20200709131429.1366074-4-gprocida@google.com> Mime-Version: 1.0 References: <20200709131429.1366074-1-gprocida@google.com> X-Mailer: git-send-email 2.27.0.383.g050319c2ae-goog Subject: [PATCH 3/3] Simplify peel_typedef_pointer_or_reference_type To: libabigail@sourceware.org X-Spam-Status: No, score=-23.2 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: maennich@google.com, kernel-team@android.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" The second argument to this function controls whether CV qualifiers should be stripped as well as the elements mentioned in the function name. While it defaults to true, it is now always passed in as false. The function contains incomplete code for peeling array types. This is not needed or indeed wanted by its current callers. This commits removes the peel_qual_type argument and removes the associated behaviour. It removes the array peeling code. There are no functional changes apart from no longer performing early canonicalisation of certain array types. I looked at the history of this function to see where the behaviours originated. bd161caa Make type_has_non_canonicalized_subtype() tighter The function is added to help make more types, self-referential ones, candidates for early canonicalisation. 5822798d Bug 18894 - Fix representation of enumerators in abixml format This undid the previous change but the function remained. c20c8c79 Fix infinite loop in peel_typedef_pointer_or_reference_type As it says, fixing the overload that is currently in use. 6e36a438 Late canonicalize all types that reference classes when reading DWARF This reintroduced the use of the function to control canonicalisation by the detection of class types. It also added array peeling to the function, but in a broken fashion as it would only work for certain combinations of pointers, references or typedefs referring to arrays. e9bdb488 Bug 19025 - abixml writer forgets to emit some member types This added a use of the function in a map key comparison function. 8cc382c8 Fix emitting of referenced type in abixml writer This undid the previous change. 1bee40c0 Do not forget to peel qualified type off when peeling types This made the function remove CV qualifiers unconditionally. e73901a5 Do not mark "distinct" diff nodes as being redundant This made behaviour to remove CV qualifiers optional and newly added is_mostly_distinct_diff disabled it. 5d6af8d5 Delay canonicalization for array and qualified types This change switches maybe_canonicalize_type to not request CV qualifer peeling from peel_typedef_pointer_or_reference_type. It partially resolves the array type issue as they are separately checked for. Presumably they shouldn't be peeled, but still are under some circumstances. The tests here could be subject to further refinement. Many types have delayed canonicalisation already. 9cf76b11 abg-ir.cc: Improve types_have_similar_structure. This change replaced the use of the function with a more delicate matched peeling process for pointer and reference types plus peel_qualified_or_typedef_type. It obsoleted the behaviour where CV qualifiers were stripped. * include/abg-fwd.h (peel_qualified_or_typedef_type): Remove second argument in declarations of both overloads. * src/abg-comp-filter.cc (is_mostly_distinct_diff): Remove second argument to peel_qualified_or_typedef_type. * src/abg-dwarf-reader.cc (maybe_canonicalize_type): Likewise. * src/abg-ir.cc (peel_qualified_or_typedef_type): In both overloads, remove second argument peel_qual_type, simplify code with the assumption it was always false and remove incomplete array type peeling logic. In type_base_sptr overload, remove stray space. Signed-off-by: Giuliano Procida Reviewed-by: Matthias Maennich --- include/abg-fwd.h | 6 ++---- src/abg-comp-filter.cc | 6 ++---- src/abg-dwarf-reader.cc | 6 ++---- src/abg-ir.cc | 40 +++++++++------------------------------- 4 files changed, 15 insertions(+), 43 deletions(-) diff --git a/include/abg-fwd.h b/include/abg-fwd.h index f23f4a46..14b95a96 100644 --- a/include/abg-fwd.h +++ b/include/abg-fwd.h @@ -819,12 +819,10 @@ type_base* peel_qualified_or_typedef_type(const type_base* type); type_base_sptr -peel_typedef_pointer_or_reference_type(const type_base_sptr, - bool peel_qualified_type = true); +peel_typedef_pointer_or_reference_type(const type_base_sptr); type_base* -peel_typedef_pointer_or_reference_type(const type_base* type, - bool peel_qualified_type = true); +peel_typedef_pointer_or_reference_type(const type_base* type); type_base* peel_pointer_or_reference_type(const type_base *type, diff --git a/src/abg-comp-filter.cc b/src/abg-comp-filter.cc index 702d223f..a9bf2c70 100644 --- a/src/abg-comp-filter.cc +++ b/src/abg-comp-filter.cc @@ -1067,10 +1067,8 @@ is_mostly_distinct_diff(const diff *d) type_base_sptr first = is_type(td->first_subject()); type_base_sptr second = is_type(td->second_subject()); - first = peel_typedef_pointer_or_reference_type(first, - /*peel_qualified_type=*/false); - second = peel_typedef_pointer_or_reference_type(second, - /*peel_qual_type=*/false); + first = peel_typedef_pointer_or_reference_type(first); + second = peel_typedef_pointer_or_reference_type(second); ABG_ASSERT(first && second); return distinct_diff::entities_are_of_distinct_kinds(first, second); diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index ba4e750f..054ac91b 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -15740,8 +15740,7 @@ maybe_canonicalize_type(const Dwarf_Die *die, read_context& ctxt) if (!t) return; - type_base_sptr peeled_type = - peel_typedef_pointer_or_reference_type(t, /*peel_qual_types=*/false); + type_base_sptr peeled_type = peel_typedef_pointer_or_reference_type(t); if (is_class_type(peeled_type) || is_union_type(peeled_type) || is_function_type(peeled_type) @@ -15794,8 +15793,7 @@ maybe_canonicalize_type(const type_base_sptr& t, if (!t) return; - type_base_sptr peeled_type = - peel_typedef_pointer_or_reference_type(t, /*peel_qual_types=*/false); + type_base_sptr peeled_type = peel_typedef_pointer_or_reference_type(t); if (is_class_type(peeled_type) || is_union_type(peeled_type) || is_function_type(peeled_type) diff --git a/src/abg-ir.cc b/src/abg-ir.cc index a434ec69..5ad60dfa 100644 --- a/src/abg-ir.cc +++ b/src/abg-ir.cc @@ -5707,23 +5707,19 @@ peel_qualified_or_typedef_type(const type_base* type) } /// Return the leaf underlying or pointed-to type node of a @ref -/// typedef_decl, @ref pointer_type_def, @ref reference_type_def or -/// @ref qualified_type_def node. +/// typedef_decl, @ref pointer_type_def or @ref reference_type_def +/// node. /// /// @param type the type to peel. /// -/// @param peel_qualified_type if true, also peel qualified types. -/// /// @return the leaf underlying or pointed-to type node of @p type. type_base_sptr -peel_typedef_pointer_or_reference_type(const type_base_sptr type, - bool peel_qual_type) +peel_typedef_pointer_or_reference_type(const type_base_sptr type) { - type_base_sptr typ = type; + type_base_sptr typ = type; while (is_typedef(typ) || is_pointer_type(typ) - || is_reference_type(typ) - || (peel_qual_type && is_qualified_type(typ))) + || is_reference_type(typ)) { if (typedef_decl_sptr t = is_typedef(typ)) typ = peel_typedef_type(t); @@ -5733,35 +5729,24 @@ peel_typedef_pointer_or_reference_type(const type_base_sptr type, if (reference_type_def_sptr t = is_reference_type(typ)) typ = peel_reference_type(t); - - if (array_type_def_sptr t = is_array_type(typ)) - typ = peel_array_type(t); - - if (peel_qual_type) - if (qualified_type_def_sptr t = is_qualified_type(typ)) - typ = peel_qualified_type(t); } return typ; } /// Return the leaf underlying or pointed-to type node of a @ref -/// typedef_decl, @ref pointer_type_def, @ref reference_type_def or -/// @ref qualified_type_def type node. +/// typedef_decl, @ref pointer_type_def or @ref reference_type_def +/// node. /// /// @param type the type to peel. /// -/// @param peel_qualified_type if true, also peel qualified types. -/// /// @return the leaf underlying or pointed-to type node of @p type. type_base* -peel_typedef_pointer_or_reference_type(const type_base* type, - bool peel_qual_type) +peel_typedef_pointer_or_reference_type(const type_base* type) { while (is_typedef(type) || is_pointer_type(type) - || is_reference_type(type) - || (peel_qual_type && is_qualified_type(type))) + || is_reference_type(type)) { if (const typedef_decl* t = is_typedef(type)) type = peel_typedef_type(t); @@ -5771,13 +5756,6 @@ peel_typedef_pointer_or_reference_type(const type_base* type, if (const reference_type_def* t = is_reference_type(type)) type = peel_reference_type(t); - - if (const array_type_def* t = is_array_type(type)) - type = peel_array_type(t); - - if (peel_qual_type) - if (const qualified_type_def* t = is_qualified_type(type)) - type = peel_qualified_type(t); } return const_cast(type);