From: Kushal Pal <kushalpal...@gmail.com> gcc/rust/ChangeLog:
* checks/errors/borrowck/rust-bir-dump.cc (Dump::visit): Use new API, i.e get_loan_id() instead of get_loan(). * checks/errors/borrowck/rust-bir-fact-collector.h (points): Use value of LoanId in Polonius facts. * checks/errors/borrowck/rust-bir-place.h (struct LoanId): LoanId is a struct now. * checks/errors/borrowck/rust-bir.h (class AbstractExpr): Use new API, as we are getting a LoanId and not a loan itself. Signed-off-by: Kushal Pal <kushalpal...@gmail.com> --- .../checks/errors/borrowck/rust-bir-dump.cc | 2 +- .../errors/borrowck/rust-bir-fact-collector.h | 44 +++++++++---------- .../checks/errors/borrowck/rust-bir-place.h | 20 ++++++++- gcc/rust/checks/errors/borrowck/rust-bir.h | 4 +- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc index e69c0002b3c..85ba3ee2ce4 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc +++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc @@ -279,7 +279,7 @@ Dump::visit (const BorrowExpr &expr) { stream << "&" << "'?" << expr.get_origin () << " "; - if (func.place_db.get_loans ()[expr.get_loan ()].mutability + if (func.place_db.get_loan (expr.get_loan_id ()).mutability == Mutability::Mut) stream << "mut "; visit_place (expr.get_place ()); diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h index ebf8eec7053..774f2b9e298 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h +++ b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h @@ -305,7 +305,7 @@ protected: // Main collection entry points (for different categories). rust_debug ("\t_%u = BorrowExpr(_%u)", lhs.value - 1, expr.get_place ().value - 1); - auto loan = place_db.get_loans ()[expr.get_loan ()]; + auto loan = place_db.get_loan (expr.get_loan_id ()); auto &base_place = place_db[expr.get_place ()]; auto &ref_place = place_db[lhs]; @@ -324,14 +324,14 @@ protected: // Main collection entry points (for different categories). ->is_mutable ()) rust_error_at (location, "Cannot reborrow immutable borrow as mutable"); - issue_loan (expr.get_origin (), expr.get_loan ()); + issue_loan (expr.get_origin (), expr.get_loan_id ()); } push_subset (main_loan_place.regions[0], {expr.get_origin ()}); } else { - issue_loan (expr.get_origin (), expr.get_loan ()); + issue_loan (expr.get_origin (), expr.get_loan_id ()); } auto loan_regions = base_place.regions.prepend ({expr.get_origin ()}); @@ -511,24 +511,25 @@ protected: // Generic BIR operations. void issue_loan (Polonius::Origin origin, LoanId loan_id) { - facts.loan_issued_at.emplace_back (origin, loan_id, + facts.loan_issued_at.emplace_back (origin, loan_id.value, get_current_point_mid ()); - check_for_borrow_conficts (place_db.get_loans ()[loan_id].place, loan_id, - place_db.get_loans ()[loan_id].mutability); + check_for_borrow_conficts (place_db.get_loan (loan_id).place, loan_id, + place_db.get_loan (loan_id).mutability); } void issue_locals_dealloc () { - for (LoanId loan_id = 0; loan_id < place_db.get_loans ().size (); ++loan_id) + for (LoanId loan_id = {0}; loan_id.value < place_db.get_loans ().size (); + ++loan_id.value) { - auto &loan = place_db.get_loans ()[loan_id]; + auto &loan = place_db.get_loan (loan_id); auto loaned_var_id = place_db.get_var (loan.place); if (place_db[loaned_var_id].tyty->is<TyTy::ReferenceType> ()) continue; if (loaned_var_id >= first_local) facts.loan_invalidated_at.emplace_back (get_current_point_start (), - loan_id); + loan_id.value); } } @@ -546,20 +547,20 @@ protected: // Generic BIR operations. place_db.for_each_path_segment (place_id, [&] (PlaceId id) { for (auto loan : place_db[id].borrowed_by) { - if (place_db.get_loans ()[loan].mutability == Mutability::Mut) + if (place_db.get_loan (loan).mutability == Mutability::Mut) { facts.loan_invalidated_at.emplace_back ( - get_current_point_start (), loan); + get_current_point_start (), loan.value); } } }); place_db.for_each_path_from_root (place_id, [&] (PlaceId id) { for (auto loan : place_db[id].borrowed_by) { - if (place_db.get_loans ()[loan].mutability == Mutability::Mut) + if (place_db.get_loan (loan).mutability == Mutability::Mut) { facts.loan_invalidated_at.emplace_back ( - get_current_point_start (), loan); + get_current_point_start (), loan.value); } } }); @@ -570,12 +571,12 @@ protected: // Generic BIR operations. place_db.for_each_path_segment (place_id, [&] (PlaceId id) { for (auto loan : place_db[id].borrowed_by) facts.loan_invalidated_at.emplace_back (get_current_point_start (), - loan); + loan.value); }); place_db.for_each_path_from_root (place_id, [&] (PlaceId id) { for (auto loan : place_db[id].borrowed_by) facts.loan_invalidated_at.emplace_back (get_current_point_start (), - loan); + loan.value); }); } @@ -586,12 +587,11 @@ protected: // Generic BIR operations. for (auto other_loan : place_db[id].borrowed_by) { if (mutability == Mutability::Imm - && place_db.get_loans ()[other_loan].mutability - == Mutability::Imm) + && place_db.get_loan (other_loan).mutability == Mutability::Imm) continue; else facts.loan_invalidated_at.emplace_back (get_current_point_start (), - other_loan); + other_loan.value); } }); @@ -599,12 +599,11 @@ protected: // Generic BIR operations. for (auto other_loan : place_db[id].borrowed_by) { if (mutability == Mutability::Imm - && place_db.get_loans ()[other_loan].mutability - == Mutability::Imm) + && place_db.get_loan (other_loan).mutability == Mutability::Imm) continue; else facts.loan_invalidated_at.emplace_back (get_current_point_start (), - other_loan); + other_loan.value); } }); } @@ -626,7 +625,8 @@ protected: // Generic BIR operations. { // TODO: this is more complicated, see // compiler/rustc_borrowck/src/constraint_generation.rs:176 - facts.loan_killed_at.emplace_back (loan, get_current_point_mid ()); + facts.loan_killed_at.emplace_back (loan.value, + get_current_point_mid ()); } } diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h b/gcc/rust/checks/errors/borrowck/rust-bir-place.h index 6a5a5b45919..c78492a2394 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h +++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h @@ -49,7 +49,19 @@ static constexpr PlaceId RETURN_VALUE_PLACE = {1}; static constexpr PlaceId FIRST_VARIABLE_PLACE = RETURN_VALUE_PLACE; using Variance = TyTy::VarianceAnalysis::Variance; -using LoanId = uint32_t; + +/** A unique identifier for a loan in the BIR. */ +struct LoanId +{ + uint32_t value; + // some overloads for comparision + bool operator== (const LoanId &rhs) const { return value == rhs.value; } + bool operator!= (const LoanId &rhs) const { return !(operator== (rhs)); } + bool operator< (const LoanId &rhs) const { return value < rhs.value; } + bool operator> (const LoanId &rhs) const { return value > rhs.value; } + bool operator<= (const LoanId &rhs) const { return !(operator> (rhs)); } + bool operator>= (const LoanId &rhs) const { return !(operator< (rhs)); } +}; /** * Representation of lvalues and constants in BIR. @@ -207,6 +219,10 @@ public: size_t size () const { return places.size (); } const std::vector<Loan> &get_loans () const { return loans; } + const Loan &get_loan (LoanId loan_id) const + { + return loans.at (loan_id.value); + } ScopeId get_current_scope_id () const { return current_scope; } @@ -332,7 +348,7 @@ public: LoanId add_loan (Loan &&loan) { - LoanId id = loans.size (); + LoanId id = {loans.size ()}; loans.push_back (std::forward<Loan &&> (loan)); PlaceId borrowed_place = loans.rbegin ()->place; places[loans.rbegin ()->place.value].borrowed_by.push_back (id); diff --git a/gcc/rust/checks/errors/borrowck/rust-bir.h b/gcc/rust/checks/errors/borrowck/rust-bir.h index e8b7e39c550..192e4452551 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir.h +++ b/gcc/rust/checks/errors/borrowck/rust-bir.h @@ -33,8 +33,6 @@ struct BasicBlock; class Statement; class AbstractExpr; -using LoanId = uint32_t; - /** * Top-level entity of the Borrow-checker IR (BIR). * It represents a single function (method, closure, etc.), which is the @@ -225,7 +223,7 @@ public: loan (loan_id), origin (lifetime) {} WARN_UNUSED_RESULT PlaceId get_place () const { return place; } - WARN_UNUSED_RESULT LoanId get_loan () const { return loan; } + WARN_UNUSED_RESULT LoanId get_loan_id () const { return loan; } WARN_UNUSED_RESULT Polonius::Origin get_origin () const { return origin; } }; -- 2.45.2