diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-03-02 14:41:54 +0100 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-03-25 08:47:34 +0000 |
commit | 2b52571e8aa28a100b8989ece12e929a9fb6bcf4 (patch) | |
tree | efb9e0e3262ada92e75fce9b1fd3b1c284572643 /gcc | |
parent | a3e7bde5b0ab530b10483818d52504f7942ecdd5 (diff) | |
download | gcc-2b52571e8aa28a100b8989ece12e929a9fb6bcf4.zip gcc-2b52571e8aa28a100b8989ece12e929a9fb6bcf4.tar.gz gcc-2b52571e8aa28a100b8989ece12e929a9fb6bcf4.tar.bz2 |
lowering: Add lowering of exported macros
Macros marked with #[macro_export] need to be lowered to HIR in order
to get exported to the relevant metadata files.
gcc/rust/ChangeLog:
* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_macro_definition):
New function.
* hir/rust-ast-lower-base.h: Declare `lower_macro_definition`.
* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Lower public
macro definitions.
* hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::visit): Likewise.
* hir/rust-ast-lower-stmt.h: Add visitor for `AST::MacroRulesDefinition`.
* hir/rust-ast-lower.cc (ASTLowering::go): Formatting.
(ASTLoweringBlock::visit): Visit `AST::MacroRulesDefinition`
(ASTLoweringIfLetBlock::visit): Formatting.
(ASTLoweringExprWithBlock::visit): Formatting.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-base.cc | 16 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-base.h | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.cc | 4 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-stmt.cc | 10 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-stmt.h | 1 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower.cc | 15 |
6 files changed, 37 insertions, 12 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc index c21f511..972d34c 100644 --- a/gcc/rust/hir/rust-ast-lower-base.cc +++ b/gcc/rust/hir/rust-ast-lower-base.cc @@ -970,5 +970,21 @@ ASTLoweringBase::lower_extern_block (AST::ExternBlock &extern_block) return hir_extern_block; } +void +ASTLoweringBase::lower_macro_definition (AST::MacroRulesDefinition &def) +{ + auto 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) + { + mappings->insert_exported_macro (def); + mappings->insert_ast_item (&def); + mappings->insert_location (def.get_node_id (), def.get_locus ()); + } +} + } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h index d0171a5..eb95435 100644 --- a/gcc/rust/hir/rust-ast-lower-base.h +++ b/gcc/rust/hir/rust-ast-lower-base.h @@ -318,6 +318,9 @@ protected: HIR::ExternBlock *lower_extern_block (AST::ExternBlock &extern_block); HIR::ClosureParam lower_closure_param (AST::ClosureParam ¶m); + + /* Lower a macro definition if it should be exported */ + void lower_macro_definition (AST::MacroRulesDefinition &def); }; } // namespace HIR diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc index 9e580a6..5e36f64 100644 --- a/gcc/rust/hir/rust-ast-lower-item.cc +++ b/gcc/rust/hir/rust-ast-lower-item.cc @@ -708,9 +708,7 @@ ASTLoweringItem::visit (AST::ExternBlock &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); + lower_macro_definition (def); } HIR::SimplePath diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc b/gcc/rust/hir/rust-ast-lower-stmt.cc index 5ba8db0..6f34181 100644 --- a/gcc/rust/hir/rust-ast-lower-stmt.cc +++ b/gcc/rust/hir/rust-ast-lower-stmt.cc @@ -32,7 +32,9 @@ ASTLoweringStmt::translate (AST::Stmt *stmt, bool *terminated) ASTLoweringStmt resolver; stmt->accept_vis (resolver); - rust_assert (resolver.translated != nullptr); + if (!resolver.translated) + return nullptr; + *terminated = resolver.terminated; resolver.mappings->insert_location ( resolver.translated->get_mappings ().get_hirid (), @@ -406,5 +408,11 @@ ASTLoweringStmt::visit (AST::ExternBlock &extern_block) translated = lower_extern_block (extern_block); } +void +ASTLoweringStmt::visit (AST::MacroRulesDefinition &def) +{ + lower_macro_definition (def); +} + } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/rust-ast-lower-stmt.h b/gcc/rust/hir/rust-ast-lower-stmt.h index 8365b32..814425c 100644 --- a/gcc/rust/hir/rust-ast-lower-stmt.h +++ b/gcc/rust/hir/rust-ast-lower-stmt.h @@ -42,6 +42,7 @@ public: void visit (AST::EmptyStmt &empty) override; void visit (AST::Function &function) override; void visit (AST::ExternBlock &extern_block) override; + void visit (AST::MacroRulesDefinition &extern_block) override; private: ASTLoweringStmt () : translated (nullptr), terminated (false) {} diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc index c2fd54d..9b6227c 100644 --- a/gcc/rust/hir/rust-ast-lower.cc +++ b/gcc/rust/hir/rust-ast-lower.cc @@ -72,7 +72,7 @@ ASTLowering::Resolve (AST::Crate &astCrate) std::unique_ptr<HIR::Crate> ASTLowering::go () { - std::vector<std::unique_ptr<HIR::Item> > items; + std::vector<std::unique_ptr<HIR::Item>> items; for (auto it = astCrate.items.begin (); it != astCrate.items.end (); it++) { @@ -95,14 +95,11 @@ ASTLowering::go () void ASTLoweringBlock::visit (AST::BlockExpr &expr) { - std::vector<std::unique_ptr<HIR::Stmt> > block_stmts; + std::vector<std::unique_ptr<HIR::Stmt>> block_stmts; bool block_did_terminate = false; for (auto &s : expr.get_statements ()) { - if (s->get_ast_kind () == AST::Kind::MACRO_RULES_DEFINITION) - continue; - if (s->get_ast_kind () == AST::Kind::MACRO_INVOCATION) rust_fatal_error ( s->get_locus (), @@ -115,8 +112,10 @@ ASTLoweringBlock::visit (AST::BlockExpr &expr) bool terminated = false; auto translated_stmt = ASTLoweringStmt::translate (s.get (), &terminated); - block_stmts.push_back (std::unique_ptr<HIR::Stmt> (translated_stmt)); block_did_terminate |= terminated; + + if (translated_stmt) + block_stmts.push_back (std::unique_ptr<HIR::Stmt> (translated_stmt)); } if (expr.has_tail_expr () && block_did_terminate) @@ -230,7 +229,7 @@ ASTLoweringIfBlock::visit (AST::IfExprConseqIf &expr) void ASTLoweringIfLetBlock::visit (AST::IfLetExpr &expr) { - std::vector<std::unique_ptr<HIR::Pattern> > patterns; + std::vector<std::unique_ptr<HIR::Pattern>> patterns; for (auto &pattern : expr.get_patterns ()) { HIR::Pattern *ptrn = ASTLoweringPattern::translate (pattern.get ()); @@ -372,7 +371,7 @@ ASTLoweringExprWithBlock::visit (AST::MatchExpr &expr) match_case.get_arm ().get_guard_expr ().get ()); } - std::vector<std::unique_ptr<HIR::Pattern> > match_arm_patterns; + std::vector<std::unique_ptr<HIR::Pattern>> match_arm_patterns; for (auto &pattern : match_case.get_arm ().get_patterns ()) { HIR::Pattern *ptrn = ASTLoweringPattern::translate (pattern.get ()); |