https://gcc.gnu.org/g:2b21250729a38ffec3b21c6082921b89eee88d64
commit r17-4114-g2b21250729a38ffec3b21c6082921b89eee88d64 Author: Owen Avery <[email protected]> Date: Fri Aug 14 19:15:40 2026 -0400 gccrs: Improve AST::LlvmInlineAsm handling Adjusts some visitor functions and makes AST::LlvmInlineAsm store only a single template string. gcc/rust/ChangeLog: * ast/rust-ast-collector.cc (TokenCollector::visit (LlvmInlineAsm)): Improve accuracy of token collection. * ast/rust-ast-pointer-visitor.cc (PointerVisitor::visit (LlvmInlineAsm)): Visit outer attributes. * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit (LlvmInlineAsm)): Likewise. * ast/rust-expr.h (LlvmInlineAsm::templates): Remove member variable and replace with... (LlvmInlineAsm::template_str): ...new member variable. (LlvmInlineAsm::LlvmInlineAsm): Initialize template_str. (LlvmInlineAsm::get_templates): Remove member function. (LlvmInlineAsm::set_template): New member function. (LlvmInlineAsm::get_template): Likewise. * expand/rust-macro-builtins-asm.cc (parse_llvm_templates): Rename to... (parse_llvm_template): ...here and adjust to not expect multiple template strings. (parse_llvm_asm): Handle rename of parse_llvm_templates to parse_llvm_template. * hir/rust-ast-lower-expr.cc (check_llvm_asm_support): Handle changes to LlvmInlineAsm. (ASTLoweringExpr::visit (LlvmInlineAsm)): Likewise. Signed-off-by: Owen Avery <[email protected]> Diff: --- gcc/rust/ast/rust-ast-collector.cc | 43 +++++++++++++++++++++++++----- gcc/rust/ast/rust-ast-pointer-visitor.cc | 2 ++ gcc/rust/ast/rust-ast-visitor.cc | 2 ++ gcc/rust/ast/rust-expr.h | 14 ++++++---- gcc/rust/expand/rust-macro-builtins-asm.cc | 21 +++++---------- gcc/rust/hir/rust-ast-lower-expr.cc | 5 ++-- 6 files changed, 58 insertions(+), 29 deletions(-) diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc index b6dd650e6295..b1238f3e558e 100644 --- a/gcc/rust/ast/rust-ast-collector.cc +++ b/gcc/rust/ast/rust-ast-collector.cc @@ -1869,37 +1869,66 @@ TokenCollector::visit (LlvmInlineAsm &expr) push (Rust::Token::make_identifier (expr.get_locus (), "llvm_asm")); push (Rust::Token::make (EXCLAM, expr.get_locus ())); push (Rust::Token::make (LEFT_PAREN, expr.get_locus ())); - for (auto &template_str : expr.get_templates ()) - push (Rust::Token::make_string (template_str.get_locus (), - std::move (template_str.symbol))); + push (Rust::Token::make_string (expr.get_template ().get_locus (), + std::move (expr.get_template ().symbol))); push (Rust::Token::make (COLON, expr.get_locus ())); + + bool needs_comma = false; + for (auto output : expr.get_outputs ()) { + if (needs_comma) + push (Rust::Token::make (COMMA, expr.get_locus ())); + needs_comma = true; push (Rust::Token::make_string (expr.get_locus (), std::move (output.constraint))); + push (Rust::Token::make (LEFT_PAREN, expr.get_locus ())); visit (output.expr); - push (Rust::Token::make (COMMA, expr.get_locus ())); + push (Rust::Token::make (RIGHT_PAREN, expr.get_locus ())); } push (Rust::Token::make (COLON, expr.get_locus ())); + needs_comma = false; for (auto input : expr.get_inputs ()) { + if (needs_comma) + push (Rust::Token::make (COMMA, expr.get_locus ())); + needs_comma = true; push (Rust::Token::make_string (expr.get_locus (), std::move (input.constraint))); + push (Rust::Token::make (LEFT_PAREN, expr.get_locus ())); visit (input.expr); - push (Rust::Token::make (COMMA, expr.get_locus ())); + push (Rust::Token::make (RIGHT_PAREN, expr.get_locus ())); } push (Rust::Token::make (COLON, expr.get_locus ())); + needs_comma = false; for (auto &clobber : expr.get_clobbers ()) { + if (needs_comma) + push (Rust::Token::make (COMMA, expr.get_locus ())); + needs_comma = true; push (Rust::Token::make_string (expr.get_locus (), std::move (clobber.symbol))); - push (Rust::Token::make (COMMA, expr.get_locus ())); } push (Rust::Token::make (COLON, expr.get_locus ())); - // Dump options + +#define X(code, s) \ + if (expr.code) \ + { \ + if (needs_comma) \ + push (Rust::Token::make (COMMA, expr.get_locus ())); \ + needs_comma = true; \ + push (Rust::Token::make_string (expr.get_locus (), s)); \ + } + + needs_comma = false; + X (is_volatile (), "volatile") + X (is_stack_aligned (), "alignstack") + X (get_dialect () == LlvmInlineAsm::Dialect::Intel, "intel") + +#undef X push (Rust::Token::make (RIGHT_PAREN, expr.get_locus ())); } diff --git a/gcc/rust/ast/rust-ast-pointer-visitor.cc b/gcc/rust/ast/rust-ast-pointer-visitor.cc index cea7ae647546..48e4d2e7a909 100644 --- a/gcc/rust/ast/rust-ast-pointer-visitor.cc +++ b/gcc/rust/ast/rust-ast-pointer-visitor.cc @@ -627,6 +627,8 @@ PointerVisitor::visit (AST::InlineAsm &expr) void PointerVisitor::visit (AST::LlvmInlineAsm &expr) { + visit_outer_attrs (expr); + for (auto &output : expr.get_outputs ()) reseat (output.expr); diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc index c800f2c30dcb..892a35648fc7 100644 --- a/gcc/rust/ast/rust-ast-visitor.cc +++ b/gcc/rust/ast/rust-ast-visitor.cc @@ -759,6 +759,8 @@ DefaultASTVisitor::visit (AST::InlineAsm &expr) void DefaultASTVisitor::visit (AST::LlvmInlineAsm &expr) { + visit_outer_attrs (expr); + for (auto &output : expr.get_outputs ()) visit (output.expr); diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index 921b79800c1f..43f5802d3598 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -5844,14 +5844,16 @@ private: std::vector<Attribute> outer_attrs; std::vector<LlvmOperand> inputs; std::vector<LlvmOperand> outputs; - std::vector<TupleTemplateStr> templates; + TupleTemplateStr template_str; std::vector<TupleClobber> clobbers; bool volatility; bool align_stack; Dialect dialect; public: - LlvmInlineAsm (location_t locus) : locus (locus) {} + LlvmInlineAsm (location_t locus) + : locus (locus), template_str (UNKNOWN_LOCATION, "") + {} Dialect get_dialect () { return dialect; } @@ -5874,12 +5876,14 @@ public: return new LlvmInlineAsm (*this); } - std::vector<TupleTemplateStr> &get_templates () { return templates; } - const std::vector<TupleTemplateStr> &get_templates () const + void set_template (TupleTemplateStr template_str) { - return templates; + this->template_str = std::move (template_str); } + TupleTemplateStr &get_template () { return template_str; } + const TupleTemplateStr &get_template () const { return template_str; } + Expr::Kind get_expr_kind () const override { return Expr::Kind::LlvmInlineAsm; diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc index 77c747bf5cdc..a3683a0ca5b2 100644 --- a/gcc/rust/expand/rust-macro-builtins-asm.cc +++ b/gcc/rust/expand/rust-macro-builtins-asm.cc @@ -990,7 +990,7 @@ validate (InlineAsmContext inline_asm_ctx) } tl::optional<LlvmAsmContext> -parse_llvm_templates (LlvmAsmContext ctx) +parse_llvm_template (LlvmAsmContext ctx) { auto &parser = ctx.parser; @@ -1002,19 +1002,12 @@ parse_llvm_templates (LlvmAsmContext ctx) return tl::nullopt; } - ctx.llvm_asm.get_templates ().emplace_back (token->get_locus (), - strip_double_quotes ( - token->as_string ())); - ctx.parser.skip_token (); + // TODO: improve string handling? + ctx.llvm_asm.set_template ( + AST::TupleTemplateStr (token->get_locus (), + strip_double_quotes (token->as_string ()))); - token = parser.peek_current_token (); - if (token->get_id () != ctx.last_token_id && token->get_id () != COLON - && token->get_id () != SCOPE_RESOLUTION) - { - // We do not handle multiple template string, we provide minimal support - // for the black_box intrinsics. - rust_unreachable (); - } + ctx.parser.skip_token (); return ctx; } @@ -1184,7 +1177,7 @@ parse_llvm_asm (location_t invoc_locus, AST::MacroInvocData &invoc, auto asm_ctx = LlvmAsmContext (llvm_asm, parser, last_token_id); tl::optional<LlvmAsmContext> resulting_context - = parse_llvm_templates (asm_ctx).and_then (parse_llvm_arguments); + = parse_llvm_template (asm_ctx).and_then (parse_llvm_arguments); if (resulting_context) { diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc index 0e934307755d..8dc2ed04cde4 100644 --- a/gcc/rust/hir/rust-ast-lower-expr.cc +++ b/gcc/rust/hir/rust-ast-lower-expr.cc @@ -1024,8 +1024,7 @@ check_llvm_asm_support (const std::vector<LlvmOperand> &inputs, { return outputs.size () == 0 && inputs.size () <= 1 && expr.get_clobbers ().size () <= 1 - && expr.get_templates ().size () == 1 - && expr.get_templates ()[0].symbol == ""; + && expr.get_template ().symbol == ""; } } // namespace @@ -1074,7 +1073,7 @@ ASTLoweringExpr::visit (AST::LlvmInlineAsm &expr) translated = new HIR::LlvmInlineAsm (expr.get_locus (), inputs, outputs, - expr.get_templates (), expr.get_clobbers (), + {expr.get_template ()}, expr.get_clobbers (), options, expr.get_outer_attrs (), mapping); }
