From patchwork Tue Apr 27 11:28:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 43162 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 5FD2F3833036; Tue, 27 Apr 2021 11:29:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5FD2F3833036 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1619522948; bh=MBDFEsss3eGN/rxgueCKaaIzUwyJIE3KY/DRGaosxBs=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=KfS/hlKKn8PLxrNNH7zrS1E6KPMRdzpjdHrE/W2TipIYwk7+ZBinsxcB+oFI6tgGr eSnc3/1xf/VIo2BzLWViFnoFiKsoHJstOvK6NeTTTS6zj8u111od4C2m+tx1LU96EG 4/tWd+T26bah4czqzfmhgMcNIHag7oN5oTaO+yDA= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-ed1-x549.google.com (mail-ed1-x549.google.com [IPv6:2a00:1450:4864:20::549]) by sourceware.org (Postfix) with ESMTPS id 9ADA43894C05 for ; Tue, 27 Apr 2021 11:29:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 9ADA43894C05 Received: by mail-ed1-x549.google.com with SMTP id w14-20020aa7da4e0000b02903834aeed684so22966545eds.13 for ; Tue, 27 Apr 2021 04:29:06 -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=MBDFEsss3eGN/rxgueCKaaIzUwyJIE3KY/DRGaosxBs=; b=nQMA/OixUMAAfZagnO4J/Y+8YCuRLdLipGKFm5kdRsHKzKDt04eM6JcKWwQmbLjOnr 16TAvv674xX9gJdTmeVPbPQdclToNp3WHbsRsd6H2ozFAN8/Lytme3/QPaBdbA1fhG8f DZf/NgGdMzR9xyeTRrEjVfWvil4wQli1uipVjzx98t8r+ghUg2KTWAIpbPcfNa6FHbFw zDmQaq/nCe94EbD3ttO7SzB8/RBiP6zHzFkeSnyRv5Hc8OzS98hNBuTcVhE9JBYfelih edo5NAaQ4GWPX09rOxu3Cybhg9YNFDlkLBJzohES6tWcMNcqWA6vAX5JShBia6iI2r+7 s8vg== X-Gm-Message-State: AOAM533qpSSNhjnnxZy/4y7oL+nQYwIM2QU837PMpEbzGggVcKAu8dUW ts2QCY1E0lMx2MTHHHBkDQuajjYfCQNZnVrx+O3YCyC5bnJolFavmcgA/CCb4ZDA86e7XTGx59p IJCt8ZnDBFtOxDgnHr18DuhTaX/cTjevEwLsyHiwlm4bc5KC1zcK5gzfY9B3ERY/JEIGYxqA= X-Google-Smtp-Source: ABdhPJwM89GqGPMztNRapMYj1+Qc2rEq0XENSpU4liYlMhToJuwgoog/582p+tLnKL3sJmQnamYRaaoLePCNYA== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:110:a94:13c5:d1bb:c50d]) (user=gprocida job=sendgmr) by 2002:a05:6402:1a:: with SMTP id d26mr3727629edu.99.1619522945032; Tue, 27 Apr 2021 04:29:05 -0700 (PDT) Date: Tue, 27 Apr 2021 12:28:51 +0100 In-Reply-To: <20210427112853.1338240-1-gprocida@google.com> Message-Id: <20210427112853.1338240-2-gprocida@google.com> Mime-Version: 1.0 References: <20210427112853.1338240-1-gprocida@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH 1/3] abg-dwarf-reader: create new corpus unconditionally To: libabigail@sourceware.org X-Spam-Status: No, score=-22.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 DWARF reader appears to create a new corpus object only if one is not already present. However, the only case where there can be multiple corpora is when build_corpus_group_from_kernel_dist_under is called and this function clears down the reader context, including the current corpus, between reading ELF objects. So it's clearer to just create a fresh corpus object unconditionally in the DWARF reader. * src/abg-dwarf-reader.cc (read_debug_info_into_corpus): Create new corpus object unconditionally. Signed-off-by: Giuliano Procida --- src/abg-dwarf-reader.cc | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index dd9d689c..28d1c73a 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -14233,14 +14233,7 @@ static corpus_sptr read_debug_info_into_corpus(read_context& ctxt) { ctxt.clear_per_corpus_data(); - - if (!ctxt.current_corpus()) - { - corpus_sptr corp (new corpus(ctxt.env(), ctxt.elf_path())); - ctxt.current_corpus(corp); - if (!ctxt.env()) - ctxt.env(corp->get_environment()); - } + ctxt.current_corpus(std::make_shared(ctxt.env(), ctxt.elf_path())); // First set some mundane properties of the corpus gathered from // ELF. From patchwork Tue Apr 27 11:28:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 43163 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 ABB8C3944821; Tue, 27 Apr 2021 11:29:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ABB8C3944821 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1619522950; bh=7MGIWxebQCE9R2fFJAsju1FVAt19v2yOn7JkdTU/2x8=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=jek2dJ2ZzRK6zlMWzvb2i3aOorkZA04v/Mwq0s/780gLXQLmy/qJX6NRyoYFou3Tk bLEQTRcCEwm+O0FvuFv2yHU0JcY3bKdbfj6CrgSgZk9+ShCXCBJHFkuSS/ro4Lbend xAw74tVFQQJhc88RrOKWHCCusvX2x2YqFsAlKTVI= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-qv1-xf4a.google.com (mail-qv1-xf4a.google.com [IPv6:2607:f8b0:4864:20::f4a]) by sourceware.org (Postfix) with ESMTPS id C32E43944821 for ; Tue, 27 Apr 2021 11:29:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C32E43944821 Received: by mail-qv1-xf4a.google.com with SMTP id t1-20020a0ca6810000b029019e892416e6so25250946qva.9 for ; Tue, 27 Apr 2021 04:29:07 -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=7MGIWxebQCE9R2fFJAsju1FVAt19v2yOn7JkdTU/2x8=; b=j1RSgMe/gYYp7S7mFnyKPRubV8lEvixgfBl1PCKdUjL+uC+T8Yxs4Ld5QMGW10YMGz NWpCSfLtP5MgyIRcYI9aYQltyR8OT6/qzDSH8KQ7vtC4WPWBib0dFWQ+gqckVHQIaY0L u7iwmbZPpCvzdovneJUt2ue+j7Q75cWtBynacHf1V06Oigdyoi7sukODJQa0IfezhMQa LYAEvbJbTTiorpzcabhN0TaxhJIbsF5WK1ZzWUQ3Uh4NZhPJOH2srPytWwWvpQ6o2ck9 jRoTlZalcA5hgI1cJ5B1C3/I/PErvanDHaO14HYVIuQwISGSC/csB4VEM8c5/DwBunpC flWw== X-Gm-Message-State: AOAM531gIkyQ6xwtd398dCfMg8aD6vdWoW1AgjE9uwBMKuufeUaSKNSR +PFOXiuelodsjEJrStngkn1vU1N3eTVka1r1s9THWho3PUZNdpepm/7Mw41FoHoYCgl4ILEmk1M 2ZSsBpUTlHXmzezR/FqeQWzmUboswrru+2BWgfpeYTOTrWVzEHzUHsQQ6BB6ffAm1VTONd7g= X-Google-Smtp-Source: ABdhPJzjl4icnDclgoIjT6yO28Jz45o2b+0LjXxkvNGViP3zfL3AjLMwJFJ4ze2tGHDAApEWZD0LThekA/eNzA== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:110:a94:13c5:d1bb:c50d]) (user=gprocida job=sendgmr) by 2002:a0c:f404:: with SMTP id h4mr11230293qvl.6.1619522947268; Tue, 27 Apr 2021 04:29:07 -0700 (PDT) Date: Tue, 27 Apr 2021 12:28:52 +0100 In-Reply-To: <20210427112853.1338240-1-gprocida@google.com> Message-Id: <20210427112853.1338240-3-gprocida@google.com> Mime-Version: 1.0 References: <20210427112853.1338240-1-gprocida@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH 2/3] abg-reader: ensure corpus always has a symtab reader To: libabigail@sourceware.org X-Spam-Status: No, score=-22.5 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" In the presence of an empty abi-corpus element and with the following change to always allocate a fresh corpus object, such objects can sometimes be left without a symtab reader, instead of inheritng one from the previous corpus. The reader is called to obtain sorted lists of symbols during ABI comparisons. The simplest way to avoid a crash is to maintain the invariant that a reader object is always present. With this change, if there is bad XML preventing symbols from being read, no error is raised as before, but the logic has been tweaked so that abi-instr parsing will nevertheless be attempted. * src/abg-reader.cc (read_symbol_db_from_input): Fix documentation for this function. Allow "successful parsing" to include the case where no symbols were present in the input. (read_corpus_from_input): Unconditionally set a symtab reader on the corpus object. Unconditionally parse the abi-instr of a corpus. Signed-off-by: Giuliano Procida --- src/abg-reader.cc | 59 ++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index 17b75914..313af4c9 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -1497,8 +1497,8 @@ read_translation_unit_from_input(read_context& ctxt) return tu; } -/// Parse the input XML document containing a function symbols -/// or a variable symbol database. +/// Parse the input XML document that may contain function symbol and +/// variable symbol databases. /// /// A function symbols database is an XML element named /// "elf-function-symbols" and a variable symbols database is an XML @@ -1507,12 +1507,11 @@ read_translation_unit_from_input(read_context& ctxt) /// /// @param ctxt the read_context to use for the parsing. /// -/// @param function_symbols is true if this function should look for a -/// function symbols database, false if it should look for a variable -/// symbols database. +/// @param fn_symdb any resulting function symbol database object, if +/// elf-function-symbols was present. /// -/// @param symdb the resulting symbol database object. This is set -/// iff the function return true. +/// @param var_symdb any resulting variable symbol database object, if +/// elf-variable-symbols was present. /// /// @return true upon successful parsing, false otherwise. static bool @@ -1524,8 +1523,6 @@ read_symbol_db_from_input(read_context& ctxt, if (!reader) return false; - bool found = false; - if (!ctxt.get_corpus_node()) for (;;) { @@ -1552,17 +1549,9 @@ read_symbol_db_from_input(read_context& ctxt, return false; if (has_fn_syms) - { - fn_symdb = build_elf_symbol_db(ctxt, node, true); - if (fn_symdb) - found = true; - } + fn_symdb = build_elf_symbol_db(ctxt, node, true); else if (has_var_syms) - { - var_symdb = build_elf_symbol_db(ctxt, node, false); - if (var_symdb) - found = true; - } + var_symdb = build_elf_symbol_db(ctxt, node, false); xmlTextReaderNext(reader.get()); } @@ -1579,22 +1568,16 @@ read_symbol_db_from_input(read_context& ctxt, else break; if (has_fn_syms) - { - fn_symdb = build_elf_symbol_db(ctxt, n, true); - found = true; - } + fn_symdb = build_elf_symbol_db(ctxt, n, true); else if (has_var_syms) - { - var_symdb = build_elf_symbol_db(ctxt, n, false); - found = true; - } + var_symdb = build_elf_symbol_db(ctxt, n, false); else break; } ctxt.set_corpus_node(n); } - return found; + return true; } /// From an "elf-needed" XML_ELEMENT node, build a vector of strings @@ -1894,24 +1877,16 @@ read_corpus_from_input(read_context& ctxt) string_elf_symbols_map_sptr fn_sym_db, var_sym_db; // Read the symbol databases. - bool is_ok = read_symbol_db_from_input(ctxt, fn_sym_db, var_sym_db); - if (is_ok) - { - // Note that it's possible that both fn_sym_db and var_sym_db - // are nil, due to potential suppression specifications. That's - // fine. - corp.set_symtab(symtab_reader::symtab::load(fn_sym_db, var_sym_db)); - } + read_symbol_db_from_input(ctxt, fn_sym_db, var_sym_db); + // Note that it's possible that both fn_sym_db and var_sym_db are nil, + // due to potential suppression specifications. That's fine. + corp.set_symtab(symtab_reader::symtab::load(fn_sym_db, var_sym_db)); ctxt.get_environment()->canonicalization_is_done(false); // Read the translation units. - do - { - translation_unit_sptr tu = read_translation_unit_from_input(ctxt); - is_ok = bool(tu); - } - while (is_ok); + while (read_translation_unit_from_input(ctxt)) + ; if (ctxt.tracking_non_reachable_types()) { From patchwork Tue Apr 27 11:28:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 43164 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 0257739888B4; Tue, 27 Apr 2021 11:29:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0257739888B4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1619522954; bh=RLA80Z4q4UjaCFnGVMqY4jjGCFSlcq4RujJ8kIYjYfg=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=Bb1xnNT6DNH1ZVZ1BKUvFqguiHo9E5eiDpSwHToMg/wp5HcnqTu+l4w0MnRyZDmGl LXg8gqPIlHpPo6e64rO/4WujHj+gaIe7E1LfdS/BFiZGbZnjTiaqtFb1JGM0uliLpX jW9RxDzmFVHvkdNITeQHMFOTGG7xT32H2abmUESA= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-ed1-x549.google.com (mail-ed1-x549.google.com [IPv6:2a00:1450:4864:20::549]) by sourceware.org (Postfix) with ESMTPS id D7AED39888B4 for ; Tue, 27 Apr 2021 11:29:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D7AED39888B4 Received: by mail-ed1-x549.google.com with SMTP id z21-20020a05640235d5b029038795ac4cdaso3791609edc.22 for ; Tue, 27 Apr 2021 04:29:10 -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=RLA80Z4q4UjaCFnGVMqY4jjGCFSlcq4RujJ8kIYjYfg=; b=HBuwbn/mQnJMc9ZsSYRrc/OqD32mWpGfvULxlih6BjA+f7D5/UP1m13zNYjXDAcwyw /bTUKbikKlIYNoQvOX529GRL75XGO0gzxu6E5RAyoCU4i1apcKEtQclNKikE36B6j1Fj cg1/B/JRmrWKEKht0vvmv79IFytPW1D2amXkJpgLTMkMxlKNJBnVFJK7Kk4puxNv9wAY NESHG3GnLj0faHcIphpVYclTc0eFxXcWf/Xh0a+qBnaakEt/vQc5eoJPvw6lJiPOAghM zl8vlCNODkXZEua/sPprRVKx41/uRikY/eiZnhNc64mYkCepKLg0rYkGJxF6PvuaIF4D i/1Q== X-Gm-Message-State: AOAM533O4KGybtLMFs1Wazm8AhyHDQPDgcHLkbP5+6VkavlUXgKR6MUK E4EuMVtmVVkV9Xc+WRR9xVeE8WWuGLBeagUv5KQKvLXVMnZNkkukutZprYd4Frvgu/nhkQWEk5B 9ghANveWWv2KNCRonJCIeN5XKZcHWe2W+YRPQOqxGwqfzj5FNNWCNZfEi4P+XnU5Oy8PM3Uc= X-Google-Smtp-Source: ABdhPJxWp9T9WD2nPamNO6Mfkve/LNb3UCrt2NuiIgTASSdkrLJ0egAO7xytFTy7kMt8XFOX6NNEAJ3IcDjiew== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:110:a94:13c5:d1bb:c50d]) (user=gprocida job=sendgmr) by 2002:aa7:c957:: with SMTP id h23mr3626792edt.301.1619522949566; Tue, 27 Apr 2021 04:29:09 -0700 (PDT) Date: Tue, 27 Apr 2021 12:28:53 +0100 In-Reply-To: <20210427112853.1338240-1-gprocida@google.com> Message-Id: <20210427112853.1338240-4-gprocida@google.com> Mime-Version: 1.0 References: <20210427112853.1338240-1-gprocida@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH 3/3] abg-reader: create a fresh corpus object per corpus To: libabigail@sourceware.org X-Spam-Status: No, score=-22.3 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" Currently the XML reader reuses the same corpus object for all corpora in a corpus group. This has an unwanted side-effect: any abi-instr with the same path in different corpora will collide and parts of the ABI will be lost. Creating a new corpus object for every abi-corpus element seems like the right thing to do. Testing with large ABIs containing many corpora also shows a modest (~10%) abidiff speed improvement. * src/abg-reader.cc (read_corpus_from_input): Always create a fresh corpus object for each abi-corpus XML element. Signed-off-by: Giuliano Procida --- src/abg-reader.cc | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index 313af4c9..e32c9bf3 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -1776,11 +1776,7 @@ read_corpus_from_input(read_context& ctxt) BAD_CAST("abi-corpus"))) return nil; - if (!ctxt.get_corpus()) - { - corpus_sptr c(new corpus(ctxt.get_environment(), "")); - ctxt.set_corpus(c); - } + ctxt.set_corpus(std::make_shared(ctxt.get_environment(), "")); if (!ctxt.get_corpus_group()) ctxt.clear_per_corpus_data(); @@ -1834,11 +1830,7 @@ read_corpus_from_input(read_context& ctxt) } else { - if (!ctxt.get_corpus()) - { - corpus_sptr c(new corpus(ctxt.get_environment(), "")); - ctxt.set_corpus(c); - } + ctxt.set_corpus(std::make_shared(ctxt.get_environment(), "")); if (!ctxt.get_corpus_group()) ctxt.clear_per_corpus_data();