From 4d5f20fdbf095663ce829b42a22819093f4efc8e Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Fri, 16 Jun 2023 18:17:39 +0200 Subject: [PATCH] gccrs: resolve: Add extern crate proc macro collection Create a mapping for procedural macros with their crate num. gcc/rust/ChangeLog: * metadata/rust-extern-crate.h: Add proc macro getter. * rust-session-manager.cc (Session::load_extern_crate): Collect mappings and create mappings. * util/rust-hir-map.cc: Add insertion and lookup functions for every mapping. * util/rust-hir-map.h: Add function prototypes. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/metadata/rust-extern-crate.h | 2 + gcc/rust/rust-session-manager.cc | 26 +++++++++++ gcc/rust/util/rust-hir-map.cc | 64 +++++++++++++++++++++++++++ gcc/rust/util/rust-hir-map.h | 22 +++++++++ 4 files changed, 114 insertions(+) diff --git a/gcc/rust/metadata/rust-extern-crate.h b/gcc/rust/metadata/rust-extern-crate.h index cf7eadcb7eb7..fcd54f66425b 100644 --- a/gcc/rust/metadata/rust-extern-crate.h +++ b/gcc/rust/metadata/rust-extern-crate.h @@ -40,6 +40,8 @@ public: const std::string &get_metadata () const; + std::vector &get_proc_macros () { return proc_macros; } + static bool string_to_int (location_t locus, const std::string &s, bool is_neg_ok, int *ret); diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc index 572ecfad49bd..ee7dd0830e36 100644 --- a/gcc/rust/rust-session-manager.cc +++ b/gcc/rust/rust-session-manager.cc @@ -1024,6 +1024,32 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus) Lexer lex (extern_crate.get_metadata ()); Parser parser (lex); std::unique_ptr metadata_crate = parser.parse_crate (); + + std::vector attribute_macros; + std::vector derive_macros; + std::vector bang_macros; + for (auto ¯o : extern_crate.get_proc_macros ()) + { + switch (macro.tag) + { + case ProcMacro::CUSTOM_DERIVE: + derive_macros.push_back (macro.payload.custom_derive); + break; + case ProcMacro::ATTR: + attribute_macros.push_back (macro.payload.attribute); + break; + case ProcMacro::BANG: + bang_macros.push_back (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); diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index c9696365dc21..caf44a282490 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -942,6 +942,70 @@ Mappings::get_exported_macros () return exportedMacros; } +void +Mappings::insert_derive_proc_macros ( + CrateNum num, std::vector macros) +{ + auto it = procmacrosDeriveMappings.find (num); + rust_assert (it == procmacrosDeriveMappings.end ()); + + procmacrosDeriveMappings[num] = macros; +} + +void +Mappings::insert_bang_proc_macros (CrateNum num, + std::vector macros) +{ + auto it = procmacrosBangMappings.find (num); + rust_assert (it == procmacrosBangMappings.end ()); + + procmacrosBangMappings[num] = macros; +} + +void +Mappings::insert_attribute_proc_macros ( + CrateNum num, std::vector macros) +{ + auto it = procmacrosAttributeMappings.find (num); + rust_assert (it == procmacrosAttributeMappings.end ()); + + procmacrosAttributeMappings[num] = macros; +} + +bool +Mappings::lookup_derive_proc_macros ( + CrateNum num, std::vector ¯os) +{ + auto it = procmacrosDeriveMappings.find (num); + if (it == procmacrosDeriveMappings.end ()) + return false; + + macros = it->second; + return true; +} +bool +Mappings::lookup_bang_proc_macros (CrateNum num, + std::vector ¯os) +{ + auto it = procmacrosBangMappings.find (num); + if (it == procmacrosBangMappings.end ()) + return false; + + macros = it->second; + return true; +} +bool +Mappings::lookup_attribute_proc_macros ( + CrateNum num, std::vector ¯os) +{ + auto it = procmacrosAttributeMappings.find (num); + if (it == procmacrosAttributeMappings.end ()) + return false; + + macros = it->second; + return true; +} + void Mappings::insert_derive_proc_macro ( std::pair hierarchy, ProcMacro::CustomDerive macro) diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 7f3f4fb7a155..a47898b84048 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -283,6 +283,20 @@ public: void insert_exported_macro (AST::MacroRulesDefinition &def); std::vector &get_exported_macros (); + void insert_derive_proc_macros (CrateNum num, + std::vector macros); + void insert_bang_proc_macros (CrateNum num, + std::vector macros); + void insert_attribute_proc_macros (CrateNum num, + std::vector macros); + + bool lookup_derive_proc_macros (CrateNum num, + std::vector ¯os); + bool lookup_bang_proc_macros (CrateNum num, + std::vector ¯os); + bool lookup_attribute_proc_macros (CrateNum num, + std::vector ¯os); + void insert_derive_proc_macro (std::pair hierachy, ProcMacro::CustomDerive macro); void insert_bang_proc_macro (std::pair hierachy, @@ -376,6 +390,14 @@ private: std::vector exportedMacros; // Procedural macros + std::map> + procmacrosDeriveMappings; + + std::map> procmacrosBangMappings; + + std::map> + procmacrosAttributeMappings; + std::map, ProcMacro::CustomDerive> procmacroDeriveMappings; -- 2.47.2