https://gcc.gnu.org/g:2990a1f4dd255db6bc51906fbd5ba24d3bb39fe0
commit r15-8094-g2990a1f4dd255db6bc51906fbd5ba24d3bb39fe0 Author: Jakub Dupak <d...@jakubdupak.com> Date: Tue Feb 27 23:52:53 2024 +0100 gccrs: borrowck: Polonius dump gcc/rust/ChangeLog: * checks/errors/borrowck/polonius/rust-polonius.h (struct FullPoint): Polonius facts dump. (struct Facts): Polonius facts dump. * checks/errors/borrowck/rust-bir-dump.cc (Dump::go): Polonius facts dump. (Dump::visit): Polonius facts dump. (Dump::visit_place): Polonius facts dump. (Dump::visit_move_place): Polonius facts dump. (Dump::visit_scope): Polonius facts dump. * checks/errors/borrowck/rust-borrow-checker.cc (BorrowChecker::go): Polonius facts dump. Signed-off-by: Jakub Dupak <d...@jakubdupak.com> Diff: --- .../errors/borrowck/polonius/rust-polonius.h | 2 +- gcc/rust/checks/errors/borrowck/rust-bir-dump.cc | 25 ++++++-- .../checks/errors/borrowck/rust-borrow-checker.cc | 69 +++++++++++++++++++++- 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h index fa73528ea852..b93906cdfc16 100644 --- a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h +++ b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h @@ -148,7 +148,7 @@ struct Facts void dump_var_used_at (std::ostream &os) const { for (auto &e : var_used_at) - os << e.first - 1 << " " << FullPoint (e.second) << "\n"; + os << e.first << " " << FullPoint (e.second) << "\n"; } void dump_var_defined_at (std::ostream &os) const diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc index 45a071da5657..a35f47b86d6c 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc +++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc @@ -115,7 +115,7 @@ Dump::go (bool enable_simplify_cfg) if (enable_simplify_cfg) simplify_cfg (func, bb_fold_map); - renumber_places (func, place_map); + // renumber_places (func, place_map); stream << "fn " << name << "("; print_comma_separated (stream, func.arguments, [this] (PlaceId place_id) { @@ -214,6 +214,8 @@ Dump::visit (const Statement &stmt) visit_place (stmt.get_place ()); stream << ")"; break; + default: + rust_internal_error_at (UNKNOWN_LOCATION, "Unknown statement kind."); } statement_place = INVALID_PLACE; } @@ -251,7 +253,8 @@ Dump::visit_place (PlaceId place_id) stream << "const " << get_tyty_name (place.tyty); break; case Place::INVALID: - stream << "_INVALID"; + if (place_id == INVALID_PLACE) + stream << "_INVALID"; } } @@ -259,7 +262,7 @@ void Dump::visit_move_place (PlaceId place_id) { const Place &place = func.place_db[place_id]; - if (!place.is_constant ()) + if (place.should_be_moved ()) stream << "move "; visit_place (place_id); } @@ -267,7 +270,11 @@ Dump::visit_move_place (PlaceId place_id) void Dump::visit (const BorrowExpr &expr) { - stream << "&"; + stream << "&" + << "'?" << expr.get_origin () << " "; + if (func.place_db.get_loans ()[expr.get_loan ()].mutability + == Mutability::Mut) + stream << "mut "; visit_place (expr.get_place ()); } @@ -360,7 +367,15 @@ Dump::visit_scope (ScopeId id, size_t depth) indent (depth + 1) << "let _"; stream << place_map[local] << ": " << get_tyty_name (func.place_db[local].tyty); - stream << ";\n"; + stream << ";\t"; + + stream << "["; + print_comma_separated (stream, + func.place_db[local].regions.get_regions (), + [this] (FreeRegion region_id) { + stream << "'?" << region_id; + }); + stream << "]\n"; } for (auto &child : scope.children) visit_scope (child, (id >= 1) ? depth + 1 : depth); diff --git a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc index 8380f2c5cfa6..e41cea33b3b6 100644 --- a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc +++ b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc @@ -18,9 +18,10 @@ #include "rust-borrow-checker.h" #include "rust-function-collector.h" +#include "rust-bir-fact-collector.h" #include "rust-bir-builder.h" #include "rust-bir-dump.h" -#include "rust-bir-fact-collector.h" +#include "polonius/rust-polonius.h" namespace Rust { namespace HIR { @@ -36,7 +37,7 @@ mkdir_wrapped (const std::string &dirname) #elif __APPLE__ ret = mkdir (dirname.c_str (), 0775); #endif - (void) ret; + rust_assert (ret == 0 || errno == EEXIST); } void @@ -68,6 +69,8 @@ BorrowChecker::go (HIR::Crate &crate) = mappings->get_crate_name (crate.get_mappings ().get_crate_num (), crate_name); rust_assert (ok); + + mkdir_wrapped ("nll_facts_gccrs"); } FunctionCollector collector; @@ -75,6 +78,9 @@ BorrowChecker::go (HIR::Crate &crate) for (auto func : collector.get_functions ()) { + rust_debug_loc (func->get_locus (), "\nChecking function %s\n", + func->get_function_name ().as_string ().c_str ()); + BIR::BuilderContext ctx; BIR::Builder builder (ctx); auto bir = builder.build (*func); @@ -89,6 +95,65 @@ BorrowChecker::go (HIR::Crate &crate) } auto facts = BIR::FactCollector::collect (bir); + + if (enable_dump_bir) + { + mkdir_wrapped ("nll_facts_gccrs/" + + func->get_function_name ().as_string ()); + auto dump_facts_to_file + = [&] (const std::string &suffix, + void (Polonius::Facts::*fn) (std::ostream &) const) { + std::string filename = "nll_facts_gccrs/" + + func->get_function_name ().as_string () + + "/" + suffix + ".facts"; + std::ofstream file; + file.open (filename); + if (file.fail ()) + { + abort (); + } + + // Run dump + // BEWARE: this callback charade is a workaround because gcc48 + // won't let me return a file from a function + (facts.*fn) (file); + }; + + dump_facts_to_file ("loan_issued_at", + &Polonius::Facts::dump_loan_issued_at); + dump_facts_to_file ("loan_killed_at", + &Polonius::Facts::dump_loan_killed_at); + dump_facts_to_file ("loan_invalidated_at", + &Polonius::Facts::dump_loan_invalidated_at); + dump_facts_to_file ("subset_base", + &Polonius::Facts::dump_subset_base); + dump_facts_to_file ("universal_region", + &Polonius::Facts::dump_universal_region); + dump_facts_to_file ("cfg_edge", &Polonius::Facts::dump_cfg_edge); + dump_facts_to_file ("var_used_at", + &Polonius::Facts::dump_var_used_at); + dump_facts_to_file ("var_defined_at", + &Polonius::Facts::dump_var_defined_at); + dump_facts_to_file ("var_dropped_at", + &Polonius::Facts::dump_var_dropped_at); + dump_facts_to_file ("use_of_var_derefs_origin", + &Polonius::Facts::dump_use_of_var_derefs_origin); + dump_facts_to_file ("drop_of_var_derefs_origin", + &Polonius::Facts::dump_drop_of_var_derefs_origin); + dump_facts_to_file ("child_path", &Polonius::Facts::dump_child_path); + dump_facts_to_file ("path_is_var", + &Polonius::Facts::dump_path_is_var); + dump_facts_to_file ("known_placeholder_subset", + &Polonius::Facts::dump_known_placeholder_subset); + dump_facts_to_file ("path_moved_at_base", + &Polonius::Facts::dump_path_moved_at_base); + dump_facts_to_file ("path_accessed_at_base", + &Polonius::Facts::dump_path_accessed_at_base); + dump_facts_to_file ("path_assigned_at_base", + &Polonius::Facts::dump_path_assigned_at_base); + dump_facts_to_file ("placeholder", + &Polonius::Facts::dump_placeholder); + } } for (auto closure ATTRIBUTE_UNUSED : collector.get_closures ())