https://gcc.gnu.org/g:7ac6f9b4c75cad8189611852c417e4f7483eaef9

commit 7ac6f9b4c75cad8189611852c417e4f7483eaef9
Author: Jakub Dupak <d...@jakubdupak.com>
Date:   Thu Oct 19 10:59:54 2023 +0200

    borrowck: Add CLI option for borrowck
    
    gcc/rust/ChangeLog:
    
            * checks/errors/borrowck/rust-borrow-checker.cc 
(BorrowChecker::BorrowChecker): Opt dump.
            (BorrowChecker::go): Opt dump.
            * checks/errors/borrowck/rust-borrow-checker.h (class 
BorrowChecker): Opt dump.
            * lang.opt: Add compile until borrowcheck.
            * rust-session-manager.cc (Session::enable_dump): Add BIR.
            (Session::compile_crate): Handle new options.
            * rust-session-manager.h (struct CompileOptions): Add BIR.
    
    Signed-off-by: Jakub Dupak <d...@jakubdupak.com>

Diff:
---
 gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc |  2 --
 gcc/rust/checks/errors/borrowck/rust-borrow-checker.h  |  5 ++++-
 gcc/rust/lang.opt                                      |  7 +++++--
 gcc/rust/rust-session-manager.cc                       | 14 +++++++++++++-
 gcc/rust/rust-session-manager.h                        |  3 +++
 5 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc 
b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
index a6086b8a6956..6c2922310423 100644
--- a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
@@ -22,8 +22,6 @@
 namespace Rust {
 namespace HIR {
 
-BorrowChecker::BorrowChecker () = default;
-
 void
 BorrowChecker::go (HIR::Crate &crate)
 {
diff --git a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.h 
b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.h
index 7df5fe788a0b..549af3560e9b 100644
--- a/gcc/rust/checks/errors/borrowck/rust-borrow-checker.h
+++ b/gcc/rust/checks/errors/borrowck/rust-borrow-checker.h
@@ -26,8 +26,11 @@ namespace HIR {
 
 class BorrowChecker
 {
+  bool enable_dump_bir;
+
 public:
-  BorrowChecker ();
+  explicit BorrowChecker (bool enable_dump_bir)
+    : enable_dump_bir (enable_dump_bir){};
 
   /** Perform borrow-checking using polonius on an entire crate */
   void go (HIR::Crate &crate);
diff --git a/gcc/rust/lang.opt b/gcc/rust/lang.opt
index a77c0a903947..67285a6d92b2 100644
--- a/gcc/rust/lang.opt
+++ b/gcc/rust/lang.opt
@@ -190,10 +190,13 @@ EnumValue
 Enum(frust_compile_until) String(const) Value(8)
 
 EnumValue
-Enum(frust_compile_until) String(compilation) Value(9)
+Enum(frust_compile_until) String(borrowcheck) Value(9)
 
 EnumValue
-Enum(frust_compile_until) String(end) Value(10)
+Enum(frust_compile_until) String(compilation) Value(10)
+
+EnumValue
+Enum(frust_compile_until) String(end) Value(11)
 
 frust-name-resolution-2.0
 Rust Var(flag_name_resolution_2_0)
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index c674a18d1c92..2843b7d25cf2 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -51,6 +51,7 @@
 #include "selftest.h"
 #include "tm.h"
 #include "rust-target.h"
+#include "rust-borrow-checker.h"
 
 extern bool
 saw_errors (void);
@@ -313,7 +314,7 @@ Session::enable_dump (std::string arg)
        "dump option was not given a name. choose %<lex%>, %<ast-pretty%>, "
        "%<register_plugins%>, %<injection%>, "
        "%<expansion%>, %<resolution%>, %<target_options%>, %<hir%>, "
-       "%<hir-pretty%>, or %<all%>");
+       "%<hir-pretty%>, %<bir%> or %<all%>");
       return false;
     }
 
@@ -357,6 +358,10 @@ Session::enable_dump (std::string arg)
     {
       options.enable_dump_option (CompileOptions::HIR_DUMP_PRETTY);
     }
+  else if (arg == "bir")
+    {
+      options.enable_dump_option (CompileOptions::BIR_DUMP);
+    }
   else
     {
       rust_error_at (
@@ -659,6 +664,13 @@ Session::compile_crate (const char *filename)
 
   HIR::ConstChecker ().go (hir);
 
+  if (last_step == CompileOptions::CompileStep::BorrowCheck)
+    return;
+
+  const bool dump_bir
+    = options.dump_option_enabled (CompileOptions::DumpOption::BIR_DUMP);
+  HIR::BorrowChecker (dump_bir).go (hir);
+
   if (saw_errors ())
     return;
 
diff --git a/gcc/rust/rust-session-manager.h b/gcc/rust/rust-session-manager.h
index 7e82291f95f9..2b1f6d00d9c9 100644
--- a/gcc/rust/rust-session-manager.h
+++ b/gcc/rust/rust-session-manager.h
@@ -221,6 +221,7 @@ struct CompileOptions
     TARGET_OPTION_DUMP,
     HIR_DUMP,
     HIR_DUMP_PRETTY,
+    BIR_DUMP,
   };
 
   std::set<DumpOption> dump_options;
@@ -254,6 +255,7 @@ struct CompileOptions
     Privacy,
     Unsafety,
     Const,
+    BorrowCheck,
     Compilation,
     End,
   } compile_until
@@ -277,6 +279,7 @@ struct CompileOptions
     enable_dump_option (DumpOption::TARGET_OPTION_DUMP);
     enable_dump_option (DumpOption::HIR_DUMP);
     enable_dump_option (DumpOption::HIR_DUMP_PRETTY);
+    enable_dump_option (DumpOption::BIR_DUMP);
   }
 
   void set_crate_name (std::string name)

Reply via email to