[gcc r14-7985] gccrs: Add proc macro top level discovery

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:11:05 GMT 2024


https://gcc.gnu.org/g:e5c109ea4cd89596b8cd1aa63fddb3d1c3aa58be

commit r14-7985-ge5c109ea4cd89596b8cd1aa63fddb3d1c3aa58be
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Tue Aug 1 12:45:11 2023 +0200

    gccrs: Add proc macro top level discovery
    
    Add mechanism to discover proc macros in loaded extern crates. In the
    top level resolver.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go):
            Visit crate's newly stored proc macros.
            * rust-session-manager.cc (Session::load_extern_crate):
            Store proc macros in the parsed crate instead of a local
            variable to achieve mappings.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Diff:
---
 .../resolve/rust-toplevel-name-resolver-2.0.cc     | 34 ++++++++++++++++++++++
 gcc/rust/rust-session-manager.cc                   | 19 ++++--------
 2 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
index e6c48d5d0ed..ed039de2a67 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
@@ -55,6 +55,40 @@ TopLevel::go (AST::Crate &crate)
 {
   for (auto &item : crate.items)
     item->accept_vis (*this);
+
+  for (auto &derive : crate.get_derive_macros ())
+    {
+      auto res = ctx.macros.insert_at_root (derive.get_trait_name (),
+					    derive.get_node_id ());
+      if (!res)
+	{
+	  rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+			 "macro %qs defined multiple times",
+			 derive.get_trait_name ().c_str ());
+	}
+    }
+  for (auto &attribute : crate.get_attribute_macros ())
+    {
+      auto res = ctx.macros.insert_at_root (attribute.get_name (),
+					    attribute.get_node_id ());
+      if (!res)
+	{
+	  rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+			 "macro %qs defined multiple times",
+			 attribute.get_name ().c_str ());
+	}
+    }
+  for (auto &bang : crate.get_bang_macros ())
+    {
+      auto res
+	= ctx.macros.insert_at_root (bang.get_name (), bang.get_node_id ());
+      if (!res)
+	{
+	  rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+			 "macro %qs defined multiple times",
+			 bang.get_name ().c_str ());
+	}
+    }
 }
 
 void
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index 292506d5e57..6f2657c68ac 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -1053,34 +1053,27 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus)
   Parser<Lexer> parser (lex);
   std::unique_ptr<AST::Crate> metadata_crate = parser.parse_crate ();
 
-  std::vector<ProcMacro::Attribute> attribute_macros;
-  std::vector<ProcMacro::CustomDerive> derive_macros;
-  std::vector<ProcMacro::Bang> bang_macros;
+  AST::Crate &parsed_crate
+    = mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
+
   for (auto &macro : extern_crate.get_proc_macros ())
     {
       switch (macro.tag)
 	{
 	case ProcMacro::CUSTOM_DERIVE:
-	  derive_macros.push_back (macro.payload.custom_derive);
+	  parsed_crate.add_derive_macro (macro.payload.custom_derive);
 	  break;
 	case ProcMacro::ATTR:
-	  attribute_macros.push_back (macro.payload.attribute);
+	  parsed_crate.add_attribute_macro (macro.payload.attribute);
 	  break;
 	case ProcMacro::BANG:
-	  bang_macros.push_back (macro.payload.bang);
+	  parsed_crate.add_bang_macro (macro.payload.bang);
 	  break;
 	default:
 	  gcc_unreachable ();
 	}
     }
 
-  mappings->insert_attribute_proc_macros (crate_num, attribute_macros);
-  mappings->insert_derive_proc_macros (crate_num, derive_macros);
-  mappings->insert_bang_proc_macros (crate_num, bang_macros);
-
-  AST::Crate &parsed_crate
-    = mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
-
   // name resolve it
   Resolver::NameResolution::Resolve (parsed_crate);


More information about the Gcc-cvs mailing list