aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.cc8
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h1
-rw-r--r--gcc/rust/metadata/rust-export-metadata.cc18
-rw-r--r--gcc/rust/metadata/rust-export-metadata.h8
-rw-r--r--gcc/rust/util/rust-hir-map.cc12
-rw-r--r--gcc/rust/util/rust-hir-map.h4
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 &macro : 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;