aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2023-03-01 12:35:18 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 18:21:09 +0100
commit51ba68e38a04b1eecf7ad43c067ce18dc783e722 (patch)
treef4697e5d70c8b9ad1e8f67475ca88201c67fd7e5 /gcc/rust/hir
parent3e0437dc981af591f46234fd2e3aebb3c60028cc (diff)
downloadgcc-51ba68e38a04b1eecf7ad43c067ce18dc783e722.zip
gcc-51ba68e38a04b1eecf7ad43c067ce18dc783e722.tar.gz
gcc-51ba68e38a04b1eecf7ad43c067ce18dc783e722.tar.bz2
gccrs: hir: Add ExportedMacro node and handling.
This HIR node represents macros which should be exported into the final Rust metadata files. Because our metadata exporter operates on the HIR, while macros are inherently tied to the AST, we need a way to propagate exported macros up until the metadata export pass on the HIR. Hence the existence of this class, whose sole purpose is to keep enough information for the metadata exporter to retrieve the original AST::MacroRulesDefinition. Handling for actually exporting these macros will come later. gcc/rust/ChangeLog: * hir/tree/rust-hir-item.h (class ExportedMacro): Add new ExportedMacro class. * hir/tree/rust-hir.cc (ExportedMacro::accept_vis): New function. (ExportedMacro::get_locus): Likewise. (ExportedMacro::get_item_kind): Likewise. (ExportedMacro::clone_item_impl): Likewise. * hir/tree/rust-hir-full-decls.h (class ExportedMacro): Forward declare class. * backend/rust-compile-item.h: Add visitor for ExportedMacro. * backend/rust-compile-stmt.h: Likewise. * checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Likewise. * checks/errors/privacy/rust-privacy-reporter.h: Likewise. * checks/errors/privacy/rust-pub-restricted-visitor.cc (PubRestrictedVisitor::visit): Likewise. * checks/errors/privacy/rust-pub-restricted-visitor.h: Likewise. * checks/errors/privacy/rust-reachability.cc (ReachabilityVisitor::visit): Likewise. * checks/errors/privacy/rust-reachability.h: Likewise. * checks/errors/privacy/rust-visibility-resolver.cc (VisibilityResolver::visit): Likewise. * checks/errors/privacy/rust-visibility-resolver.h: Likewise. * checks/errors/rust-const-checker.cc (ConstChecker::visit): Likewise. * checks/errors/rust-const-checker.h: Likewise. * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Likewise. * checks/errors/rust-unsafe-checker.h: Likewise. * hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Likewise. * hir/rust-ast-lower-item.h: Likewise. * hir/rust-hir-dump.cc (Dump::visit): Likewise. * hir/rust-hir-dump.h: Likewise. * hir/tree/rust-hir-visitor.h: Likewise. * metadata/rust-export-metadata.cc: Likewise. * typecheck/rust-hir-type-check-item.h: Likewise. * typecheck/rust-hir-type-check-stmt.cc (TypeCheckStmt::visit): Likewise. * typecheck/rust-hir-type-check-stmt.h: Likewise. * typecheck/rust-tycheck-dump.h: Likewise. * hir/tree/rust-hir.h: Add new ItemKind::MacroExport variant. * util/rust-attributes.cc: Add #[macro_export] attribute.
Diffstat (limited to 'gcc/rust/hir')
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.cc22
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h1
-rw-r--r--gcc/rust/hir/rust-hir-dump.cc3
-rw-r--r--gcc/rust/hir/rust-hir-dump.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-decls.h3
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h21
-rw-r--r--gcc/rust/hir/tree/rust-hir-visitor.h4
-rw-r--r--gcc/rust/hir/tree/rust-hir.cc36
-rw-r--r--gcc/rust/hir/tree/rust-hir.h1
9 files changed, 92 insertions, 0 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc
index 1e467ab5..7b48549 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -691,6 +691,28 @@ ASTLoweringItem::visit (AST::ExternBlock &extern_block)
translated = lower_extern_block (extern_block);
}
+void
+ASTLoweringItem::visit (AST::MacroRulesDefinition &def)
+{
+ bool is_export = false;
+ for (const auto &attr : def.get_outer_attrs ())
+ if (attr.get_path ().as_string () == "macro_export")
+ is_export = true;
+
+ if (is_export)
+ {
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, def.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (
+ crate_num));
+ auto locus = def.get_locus ();
+
+ translated
+ = new HIR::ExportedMacro (mapping, def.get_outer_attrs (), locus);
+ }
+}
+
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 2b1975b..06a9627 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -56,6 +56,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 &macro) override;
private:
ASTLoweringItem () : translated (nullptr) {}
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index ced9f54..dba1544 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -657,5 +657,8 @@ Dump::visit (InferredType &)
void
Dump::visit (BareFunctionType &)
{}
+void
+Dump::visit (ExportedMacro &)
+{}
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/rust-hir-dump.h b/gcc/rust/hir/rust-hir-dump.h
index 2b5eb97..5f9ee1e 100644
--- a/gcc/rust/hir/rust-hir-dump.h
+++ b/gcc/rust/hir/rust-hir-dump.h
@@ -184,6 +184,7 @@ private:
virtual void visit (SliceType &) override;
virtual void visit (InferredType &) override;
virtual void visit (BareFunctionType &) override;
+ virtual void visit (ExportedMacro &) override;
};
} // namespace HIR
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h
index 23ffa44..a410103 100644
--- a/gcc/rust/hir/tree/rust-hir-full-decls.h
+++ b/gcc/rust/hir/tree/rust-hir-full-decls.h
@@ -35,6 +35,9 @@ class Lifetime;
class GenericParam;
class LifetimeParam;
+// FIXME: ARTHUR: Move this somewhere else
+class ExportedMacro;
+
class TraitItem;
class ImplItem;
struct Crate;
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 2b23609..fa52d7a 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -3224,6 +3224,27 @@ protected:
}*/
};
+class ExportedMacro : public VisItem
+{
+ Location locus;
+
+public:
+ ExportedMacro (Analysis::NodeMapping mapping, AST::AttrVec outer_attrs,
+ Location locus)
+ : VisItem (mapping, Visibility (Visibility::PUBLIC),
+ std::move (outer_attrs)),
+ locus (locus)
+ {}
+
+ virtual Location get_locus () const override;
+ virtual ItemKind get_item_kind () const override;
+ virtual ExportedMacro *clone_item_impl () const override;
+
+ void accept_vis (HIRFullVisitor &vis) override;
+ void accept_vis (HIRStmtVisitor &vis) override;
+ void accept_vis (HIRVisItemVisitor &vis) override;
+};
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h
index a9ca6e9..f516f05 100644
--- a/gcc/rust/hir/tree/rust-hir-visitor.h
+++ b/gcc/rust/hir/tree/rust-hir-visitor.h
@@ -157,6 +157,7 @@ public:
virtual void visit (SliceType &type) = 0;
virtual void visit (InferredType &type) = 0;
virtual void visit (BareFunctionType &type) = 0;
+ virtual void visit (ExportedMacro &macro) = 0;
};
class HIRFullVisitorBase : public HIRFullVisitor
@@ -311,6 +312,7 @@ public:
virtual void visit (SliceType &) override {}
virtual void visit (InferredType &) override {}
virtual void visit (BareFunctionType &) override {}
+ virtual void visit (ExportedMacro &) override {}
};
class HIRExternalItemVisitor
@@ -345,6 +347,7 @@ public:
virtual void visit (Trait &trait) = 0;
virtual void visit (ImplBlock &impl) = 0;
virtual void visit (ExternBlock &block) = 0;
+ virtual void visit (ExportedMacro &macro) = 0;
};
class HIRImplVisitor
@@ -404,6 +407,7 @@ public:
virtual void visit (LetStmt &stmt) = 0;
virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
virtual void visit (ExprStmtWithBlock &stmt) = 0;
+ virtual void visit (ExportedMacro &macro) = 0;
};
class HIRExpressionVisitor
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index 93108c8..8b10b0b 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -5243,5 +5243,41 @@ void
ConstGenericParam::accept_vis (HIRFullVisitor &)
{}
+void
+ExportedMacro::accept_vis (HIRVisItemVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
+ExportedMacro::accept_vis (HIRFullVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
+ExportedMacro::accept_vis (HIRStmtVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+Location
+ExportedMacro::get_locus () const
+{
+ return locus;
+}
+
+Item::ItemKind
+ExportedMacro::get_item_kind () const
+{
+ return ItemKind::MacroExport;
+}
+
+ExportedMacro *
+ExportedMacro::clone_item_impl () const
+{
+ return new ExportedMacro (*this);
+}
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h
index 31f1494..d9eea87 100644
--- a/gcc/rust/hir/tree/rust-hir.h
+++ b/gcc/rust/hir/tree/rust-hir.h
@@ -191,6 +191,7 @@ public:
Trait,
Impl,
Module,
+ MacroExport,
};
virtual ItemKind get_item_kind () const = 0;