From: Pierre-Emmanuel Patry Date: Tue, 1 Aug 2023 10:45:11 +0000 (+0200) Subject: gccrs: Add proc macro top level discovery X-Git-Tag: basepoints/gcc-15~2154 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e5c109ea4cd89596b8cd1aa63fddb3d1c3aa58be;p=thirdparty%2Fgcc.git 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 --- 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 e6c48d5d0edf..ed039de2a677 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 292506d5e573..6f2657c68acf 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 parser (lex); std::unique_ptr metadata_crate = parser.parse_crate (); - std::vector attribute_macros; - std::vector derive_macros; - std::vector bang_macros; + AST::Crate &parsed_crate + = mappings->insert_ast_crate (std::move (metadata_crate), crate_num); + for (auto ¯o : 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);