From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by sourceware.org (Postfix) with ESMTPS id AB0F53851C0C for ; Mon, 22 Jun 2020 20:06:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org AB0F53851C0C Received: by mail-wr1-x443.google.com with SMTP id b6so17979196wrs.11 for ; Mon, 22 Jun 2020 13:06:32 -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:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=i47oo1o7e9t2fbsQvqSgwPWOJF4yOVCxuOPLtgGfbB0=; b=Co4MZtV6nzJjK/c3tScCo47qa69Bo+xCsgWrGgZQR3lzJdUgGoyX0vnpK3+OPpQfru otJcUTrx6TQeoWXFOnXTcCIYJ6eC4PU8jy7NIh3gdcgFEhibhwMQ1SXQo+oFnKovevZi lko6swtotJv6Hsibtd5xfjM0tDIIK0JfnAea9paS2b10nR19RccqHAeA+46n0cIty0T1 aZXzldiC9rA/fAwGKzpMkQd4LYESH3BrzCTgSr96TCSp34f0wiL2tPFxI0gjBs6KLk7l D4N0QrDLuj2k74HkirnqMUWPPH/RxjDlUd6itMUSh0q9E8ffC+hrjb4o2CZPPXTSzlJb aQbw== X-Gm-Message-State: AOAM531G/f3bUwfHhijmoCurfpVe3gmtxYH+1ajm8g0oCFdUO0LHGmKO wty6lykPfp1XFkWBLzvXdHfBFw== X-Google-Smtp-Source: ABdhPJxrCBXa9J8ImdaK9lAX+vIODxCLdeT58I0tkNsl99URSplUHItd9MAJnVeoc2CSTRI+VXccmA== X-Received: by 2002:adf:fa89:: with SMTP id h9mr20575765wrr.120.1592856391411; Mon, 22 Jun 2020 13:06:31 -0700 (PDT) Received: from google.com ([2a00:79e0:d:110:673c:7143:200f:54b7]) by smtp.gmail.com with ESMTPSA id a3sm735273wmb.7.2020.06.22.13.06.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jun 2020 13:06:30 -0700 (PDT) Date: Mon, 22 Jun 2020 22:06:30 +0200 From: Matthias Maennich To: Giuliano Procida Cc: libabigail@sourceware.org, dodji@seketeli.org, kernel-team@android.com Subject: Re: [PATCH v2] abg-reader.cc: track WIP types by pointer not name Message-ID: <20200622200630.GA75581@google.com> References: <20200622160619.4154-1-gprocida@google.com> <20200622172504.27660-1-gprocida@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20200622172504.27660-1-gprocida@google.com> X-Spam-Status: No, score=-29.8 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL, USER_IN_DEF_SPF_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-List-Received-Date: Mon, 22 Jun 2020 20:06:34 -0000 On Mon, Jun 22, 2020 at 06:25:04PM +0100, Giuliano Procida wrote: >When reading ABI XML files, the reader needs to construct types >progressively as any type may depend on other types and even on >itself. Such work-in-progress types are tracked explicitly. > >The storage used for this is a map from (external, qualified) type >name to a count of how many times the type (name) has been seen. > >However, function type names are invariably stored as "void ()" as >they are incomplete at the point they are added to the map. When the >reader later attempts to remove the marking they have their proper, >different names. In short, the code doesn't do what it's supposed to. > >This commit changes the stored value from string to const type_base*. >Equality on type_base_sptr has been defined to be a deep comparison so >storing those wouldn't be quite right. > >It also replaces the unordered_map with a simple vector, implementing >a searchable stack. This is simpler and fast, for the expected number >of types, and allows a stronger invariant to be asserted due to the >preservation of insertion order. > >Note that this commit removes some of the call paths that result in >incorrect (external) type names being cached, regardless of whether >they are actually used. > > * src/abg-reader.cc (xml_reader::m_wip_types_map): Replace > with m_wip_types_stack of type vector. > (xml_reader::clear_wip_classes_map): Remove. > (xml_reader::clear_wip_types_stack): New function, clears > m_wip_types_stack. > (xml_reader::mark_type_as_wip): Push type pointer onto > m_wip_types_stack. > (xml_reader::unmark_type_as_wip): Add assertion that type > pointer is at top of stack. Pop pointer off m_wip_types_stack. > (xml_reader::is_wip_type): Test if type pointer in stack. > The surroundings of this code look like a bit of RAII could not harm. Especially given the invariant that unmarking pops the stack, marking could probably also define the unmarking by using something like a scope guard. Reviewed-by: Matthias Maennich Cheers, Matthias >Signed-off-by: Giuliano Procida >--- > src/abg-reader.cc | 33 ++++++++++----------------------- > 1 file changed, 10 insertions(+), 23 deletions(-) > >diff --git a/src/abg-reader.cc b/src/abg-reader.cc >index eb74659f..480d1402 100644 >--- a/src/abg-reader.cc >+++ b/src/abg-reader.cc >@@ -26,6 +26,7 @@ > /// native XML format is named "abixml". > > #include "config.h" >+#include > #include > #include > #include >@@ -119,7 +120,7 @@ private: > unordered_map > m_types_map; > unordered_map > m_fn_tmpl_map; > unordered_map > m_class_tmpl_map; >- unordered_map m_wip_types_map; >+ vector m_wip_types_stack; > vector m_types_to_canonicalize; > string_xml_node_map m_id_xml_node_map; > xml_node_decl_base_sptr_map m_xml_node_decl_map; >@@ -522,8 +523,8 @@ public: > /// the map of the class that are currently being built, but at not > /// yet fully built. > void >- clear_wip_classes_map() >- {m_wip_types_map.clear();} >+ clear_wip_types_stack() >+ {m_wip_types_stack.clear();} > > /// Mark a given type as being "Work In Progress"; that is, mark it > /// as being currently built. >@@ -534,12 +535,7 @@ public: > { > if (!t) > return; >- string qname = get_type_name(t, /*qualified=*/true); >- unordered_map::iterator it = m_wip_types_map.find(qname); >- if (it == m_wip_types_map.end()) >- m_wip_types_map[qname] = 1; >- else >- ++it->second; >+ m_wip_types_stack.push_back(t.get()); > } > > /// Mark a given class as being *NOT* "Work In Progress" anymore; >@@ -551,15 +547,9 @@ public: > { > if (!t) > return; >- >- string qname = get_type_name(t, /*qualified=*/true); >- unordered_map::iterator it = m_wip_types_map.find(qname); >- if (it == m_wip_types_map.end()) >- return; >- if (it->second) >- --it->second; >- if (it->second == 0) >- m_wip_types_map.erase(it); >+ ABG_ASSERT(!m_wip_types_stack.empty()); >+ ABG_ASSERT(m_wip_types_stack.back() == t.get()); >+ m_wip_types_stack.pop_back(); > } > > /// Test if a type is being currently built; that is, if it's "Work >@@ -571,11 +561,8 @@ public: > { > if (!t) > return false; >- >- string qname = get_type_name(t, /*qualified=*/true); >- unordered_map::const_iterator i = >- m_wip_types_map.find(qname); >- return i != m_wip_types_map.end(); >+ return std::find(m_wip_types_stack.begin(), m_wip_types_stack.end(), t.get()) >+ != m_wip_types_stack.end(); > } > > /// Test if two types are equal, without comparing them structurally. >-- >2.27.0.111.gc72c7da667-goog >