From patchwork Thu Aug 1 14:57:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Cohen X-Patchwork-Id: 95086 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 198303864824 for ; Thu, 1 Aug 2024 15:43:10 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by sourceware.org (Postfix) with ESMTPS id 3C66B3861823 for ; Thu, 1 Aug 2024 15:00:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3C66B3861823 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3C66B3861823 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::633 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1722524497; cv=none; b=QPINn3XPiCfQWBMmoVPupb1/koyraq/fQWgrxUElbsAYxGPJenxh4Gn+RzD19pXOGS9aFv+1KZqiXAJ8U286qw9eP9/Oytp7dybRIXb5a4IGn9s+qI4x1khLykXJvr/ibkcKH2UWlyBRtX24tcuOgbzk1H1gWJklQRTA5pj0Mhs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1722524497; c=relaxed/simple; bh=mq0ZIa8jTKTZ/Kqjt/F7iOSfznbL1zTw7LRS9y1cQ78=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=NLQajyYOAgjRQ60KN2LFicGIYN549K72WkPKiDfbfw4f+duvf2pByPMhqP+VLApVQvbp3MgjfzTTHF0mY7+eEwOhQRLqxQ1eHPJSb1ri6PI/a25ByUGMDYtory8E4FFew2Bsy4zer+A7c75UZfmlTvH2aIXbxzQLUkAVN84XD6M= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-a7aa212c1c9so910781666b.2 for ; Thu, 01 Aug 2024 08:00:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1722524452; x=1723129252; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oFrG97hVpEjZOctF9OkOi0FE4f/kVBR+fMeIlnV0wyA=; b=K/othwdB+hh7/VfU3vDaj1MyNrnUNZV+CT9zfQ2bfsD0uyAEzAdSFRYwLocUVN7uNH p2LA1hs3gTBRO42cshTlp5LaeNlMgVvby3W+xOWPcPCNHVs7Z/SvftDazWPADY6uefFq KTWuewmoScvJQXEiXtNLLDseuLlPyuEGMMavstbnQ//ZgJIgJQBOuyTUlXyfcprGNEle VfTVVVwm/FBQXDxlxj3FkvJdczoeY3IZjnW/8shUoNIZ+rNFU2mnyx61ST/ih+DyADYq iZ3LZLzT9meqkaeypzHyDZqg7PmF7YxuLD/tgDIEkQtjI1YP2CD7wyjT0ZMSyofYS/+X K1BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722524452; x=1723129252; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oFrG97hVpEjZOctF9OkOi0FE4f/kVBR+fMeIlnV0wyA=; b=M1F7GO2lpK46Oy5CfCvWQQQtLZ0Hp05NUNdSCHkitSY7kh5HNG+oKiP/kETl4aY6+Z jmHfxsREw0vlbB7scrn02EVrj5yNt3dD4NjMqDNx+UIQEn/Q1sSC0ZCT4FJcNQ/u2Mw9 FE3SgtK2Cc4MiajZGLOD1xO2dK6YN81kuaTQXrjLnryTK8MQg04HV9LA4ABgn0kLqc/F nGp+eZPdcgJx/GC5H13Alb3JjZI58TtskITzcNXYv/C3IVIcPhjI+Y4cZk7MJQ9v0/CU UuPEmBHOT3hhhWAooQ1RXq9Mo/deJPllvCfnN9fQ4QWfIxYzKUsEDB6gql1rhnxOR2Jh R23w== X-Gm-Message-State: AOJu0Yx2JmLa+3fhpMJI1H/DTi/6sjzIap4YU8tXiW2zIoXooQbMRrSK VWgUpLSD/WCKxQfUL6J0tZPRaazIoj57W8YstfAYOSTt9IlA8B2UQ5j9RUNEUjihgzyRN3/2GNM V1Bh9 X-Google-Smtp-Source: AGHT+IEDobvjq5K3+ZGaXjfeHAw6HrRiFvO7SXEfRbn6UTcROyQ9+P34IfBftHrBznF9KRvVNMBmjA== X-Received: by 2002:a17:907:3f9c:b0:a7a:8e98:8911 with SMTP id a640c23a62f3a-a7dc4ff1121mr32636766b.38.1722524440258; Thu, 01 Aug 2024 08:00:40 -0700 (PDT) Received: from platypus.lan ([2a04:cec2:9:dc84:3622:6733:ff49:ee91]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5ac63590592sm10252456a12.25.2024.08.01.08.00.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Aug 2024 08:00:40 -0700 (PDT) From: Arthur Cohen To: gcc-patches@gcc.gnu.org Cc: gcc-rust@gcc.gnu.org, Jakub Dupak Subject: [PATCH 118/125] gccrs: borrowck: Free region representation Date: Thu, 1 Aug 2024 16:57:54 +0200 Message-ID: <20240801145809.366388-120-arthur.cohen@embecosm.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240801145809.366388-2-arthur.cohen@embecosm.com> References: <20240801145809.366388-2-arthur.cohen@embecosm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org From: Jakub Dupak gcc/rust/ChangeLog: * checks/errors/borrowck/rust-bir-free-region.h: New file. Signed-off-by: Jakub Dupak --- .../errors/borrowck/rust-bir-free-region.h | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 gcc/rust/checks/errors/borrowck/rust-bir-free-region.h diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-free-region.h b/gcc/rust/checks/errors/borrowck/rust-bir-free-region.h new file mode 100644 index 00000000000..0560a894ab0 --- /dev/null +++ b/gcc/rust/checks/errors/borrowck/rust-bir-free-region.h @@ -0,0 +1,107 @@ +#ifndef RUST_BIR_FREE_REGION_H +#define RUST_BIR_FREE_REGION_H + +#include "rust-diagnostics.h" +#include "polonius/rust-polonius-ffi.h" + +namespace Rust { + +using FreeRegion = size_t; + +class FreeRegions +{ + std::vector regions; + +public: + WARN_UNUSED_RESULT bool has_regions () const { return !regions.empty (); } + decltype (regions)::const_iterator begin () const { return regions.begin (); } + decltype (regions)::const_iterator end () const { return regions.end (); } + size_t size () const { return regions.size (); } + FreeRegion &operator[] (size_t i) { return regions.at (i); } + const FreeRegion &operator[] (size_t i) const { return regions.at (i); } + const std::vector &get_regions () const { return regions; } + void set_from (std::vector &®ions) + { + this->regions.clear (); + for (auto ®ion : regions) + { + this->regions.push_back ({region}); + } + } + + WARN_UNUSED_RESULT FreeRegions prepend (FreeRegion region) const + { + std::vector new_regions = {region}; + new_regions.insert (new_regions.end (), regions.begin (), regions.end ()); + return FreeRegions (std::move (new_regions)); + } + + FreeRegions (std::vector &®ions) : regions (regions) {} + + WARN_UNUSED_RESULT std::string to_string () const + { + std::stringstream result; + for (auto ®ion : regions) + { + result << region; + result << ", "; + } + // Remove the last ", " from the string. + if (result.tellg () > 2) + result.seekp (-2, std::ios_base::cur); + + return result.str (); + } +}; + +class RegionBinder +{ + FreeRegion &next_free_region; + +public: + explicit RegionBinder (FreeRegion &next_free_region) + : next_free_region (next_free_region) + {} + + WARN_UNUSED_RESULT FreeRegion get_next_free_region () const + { + return next_free_region++; + } + + FreeRegions bind_regions (std::vector regions, + FreeRegions parent_free_regions) + { + std::vector free_regions; + for (auto ®ion : regions) + { + if (region.is_early_bound ()) + { + free_regions.push_back (parent_free_regions[region.get_index ()]); + } + else if (region.is_static ()) + { + free_regions.push_back (0); + } + else if (region.is_anonymous ()) + { + free_regions.push_back (get_next_free_region ()); + } + else if (region.is_named ()) + { + rust_unreachable (); // FIXME + } + else + { + rust_sorry_at (UNKNOWN_LOCATION, "Unimplemented"); + rust_unreachable (); + } + } + // This is necesarry because of clash of current gcc and gcc4.8. + FreeRegions free_regions_final{std::move (free_regions)}; + return free_regions_final; + } +}; + +} // namespace Rust + +#endif // RUST_BIR_FREE_REGION_H