diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.cc | 8 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 1 | ||||
-rw-r--r-- | gcc/rust/metadata/rust-export-metadata.cc | 18 | ||||
-rw-r--r-- | gcc/rust/metadata/rust-export-metadata.h | 8 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 12 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 4 |
6 files changed, 50 insertions, 1 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc index a166b91..9e580a6 100644 --- a/gcc/rust/hir/rust-ast-lower-item.cc +++ b/gcc/rust/hir/rust-ast-lower-item.cc @@ -705,6 +705,14 @@ ASTLoweringItem::visit (AST::ExternBlock &extern_block) translated = lower_extern_block (extern_block); } +void +ASTLoweringItem::visit (AST::MacroRulesDefinition &def) +{ + for (const auto &attr : def.get_outer_attrs ()) + if (attr.get_path ().as_string () == "macro_export") + mappings->insert_exported_macro (def); +} + HIR::SimplePath ASTLoweringSimplePath::translate (const AST::SimplePath &path) { diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h index 3680ed4..c0ecff4 100644 --- a/gcc/rust/hir/rust-ast-lower-item.h +++ b/gcc/rust/hir/rust-ast-lower-item.h @@ -44,6 +44,7 @@ public: void visit (AST::Trait &trait) override; void visit (AST::TraitImpl &impl_block) override; void visit (AST::ExternBlock &extern_block) override; + void visit (AST::MacroRulesDefinition &rules_def) override; private: ASTLoweringItem () : translated (nullptr) {} diff --git a/gcc/rust/metadata/rust-export-metadata.cc b/gcc/rust/metadata/rust-export-metadata.cc index 49a7226..c65448b 100644 --- a/gcc/rust/metadata/rust-export-metadata.cc +++ b/gcc/rust/metadata/rust-export-metadata.cc @@ -144,6 +144,21 @@ ExportContext::emit_function (const HIR::Function &fn) public_interface_buffer += oss.str (); } +void +ExportContext::emit_macro (NodeId macro) +{ + std::stringstream oss; + AST::Dump dumper (oss); + + AST::Item *item; + auto ok = mappings->lookup_ast_item (macro, &item); + rust_assert (ok); + + dumper.go (*item); + + public_interface_buffer += oss.str (); +} + const std::string & ExportContext::get_interface_buffer () const { @@ -215,6 +230,9 @@ PublicInterface::gather_export_data () if (is_crate_public (vis_item)) vis_item.accept_vis (visitor); } + + for (const auto ¯o : mappings.get_exported_macros ()) + context.emit_macro (macro); } void diff --git a/gcc/rust/metadata/rust-export-metadata.h b/gcc/rust/metadata/rust-export-metadata.h index e11669a..c498788 100644 --- a/gcc/rust/metadata/rust-export-metadata.h +++ b/gcc/rust/metadata/rust-export-metadata.h @@ -41,9 +41,15 @@ public: const HIR::Module &pop_module_scope (); void emit_trait (const HIR::Trait &trait); - void emit_function (const HIR::Function &fn); + /** + * Macros are a bit particular - they only live at the AST level, so we can + * directly refer to them using their NodeId. There's no need to keep an HIR + * node for them. + */ + void emit_macro (NodeId macro); + const std::string &get_interface_buffer () const; private: diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 12f9be6..eb476d2 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -942,6 +942,18 @@ Mappings::lookup_macro_invocation (AST::MacroInvocation &invoc, } void +Mappings::insert_exported_macro (AST::MacroRulesDefinition &def) +{ + exportedMacros.emplace_back (def.get_node_id ()); +} + +std::vector<NodeId> & +Mappings::get_exported_macros () +{ + return exportedMacros; +} + +void Mappings::insert_visibility (NodeId id, Privacy::ModuleVisibility visibility) { visibility_map.insert ({id, visibility}); diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 4fd35d8..9f333f4 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -279,6 +279,9 @@ public: bool lookup_macro_invocation (AST::MacroInvocation &invoc, AST::MacroRulesDefinition **def); + void insert_exported_macro (AST::MacroRulesDefinition &def); + std::vector<NodeId> &get_exported_macros (); + void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility); bool lookup_visibility (NodeId id, Privacy::ModuleVisibility &def); @@ -350,6 +353,7 @@ private: // macros std::map<NodeId, AST::MacroRulesDefinition *> macroMappings; std::map<NodeId, AST::MacroRulesDefinition *> macroInvocations; + std::vector<NodeId> exportedMacros; // crate names std::map<CrateNum, std::string> crate_names; |