https://gcc.gnu.org/g:7f6fd8db4879f93680d2611cbd9e5f26bb4bcfb7
commit r15-8171-g7f6fd8db4879f93680d2611cbd9e5f26bb4bcfb7 Author: jjasmine <tanghocle...@gmail.com> Date: Tue May 21 16:50:36 2024 -0700 gccrs: Replace scaffolded InlineAsm with real InlineAsm. Replace scaffolded InlineAsm with real InlineAsm node in rust-expr.h gcc/rust/ChangeLog: * expand/rust-macro-builtins-asm.cc (parseDirSpec): replace scaffolded InlineAsm with real InlineAsm. (parse_clobber_abi): likewise. (check_and_set): likewise. (parse_options): likewise. (parseAsmArg): likewise. (parse_asm): likewise. * expand/rust-macro-builtins-asm.h (struct AsmParseError): likewise. (enum InlineAsmDirSpec): likewise. (enum InlineAsmRegOrRegClass): likewise. (struct AsmArg): likewise. (parseAsmArg): likewise. (check_and_set): likewise. (parse_operand): likewise. (parse_options): likewise. (parse_reg): likewise. (parse_clobber_abi): likewise. Diff: --- gcc/rust/expand/rust-macro-builtins-asm.cc | 54 +++++++++++++----------- gcc/rust/expand/rust-macro-builtins-asm.h | 66 +++++------------------------- 2 files changed, 40 insertions(+), 80 deletions(-) diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc index 971dd7b7e75c..6e602c463edd 100644 --- a/gcc/rust/expand/rust-macro-builtins-asm.cc +++ b/gcc/rust/expand/rust-macro-builtins-asm.cc @@ -20,15 +20,15 @@ namespace Rust { -tl::optional<InlineAsmDirSpec> +int parseDirSpec (Parser<MacroInvocLexer> &parser, TokenId last_token_id) { - return tl::nullopt; + return 0; } int parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - AsmArg &args) + AST::InlineAsm &inlineAsm) { // clobber_abi := "clobber_abi(" <abi> *("," <abi>) [","] ")" @@ -49,7 +49,7 @@ parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, return -1; } - ClobberAbis new_abis; + std::vector<AST::TupleClobber> new_abis; auto token = parser.peek_current_token (); @@ -59,7 +59,7 @@ parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, if (token->get_id () == STRING_LITERAL) { // TODO: Caring for span in here. - new_abis.push_back (token->as_string ()); + new_abis.push_back ({token->as_string (), token->get_locus ()}); } else { @@ -88,16 +88,17 @@ parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, for (auto abi : new_abis) { - args.clobber_abis.push_back (abi); + inlineAsm.clobber_abi.push_back (abi); } return 0; } void -check_and_set (Parser<MacroInvocLexer> &p, AsmArg &args, std::string option) +check_and_set (Parser<MacroInvocLexer> &p, AST::InlineAsm &inlineAsm, + std::string option) { - if (args.options.count (option) == 1) + if (inlineAsm.options.count (option) == 1) { // TODO: report an error of duplication @@ -105,13 +106,14 @@ check_and_set (Parser<MacroInvocLexer> &p, AsmArg &args, std::string option) } else { - args.options.insert (option); + inlineAsm.options.insert (option); } } int parse_options (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - AsmArg &args, bool is_global_asm) + AST::InlineAsm &inlineAsm) { + bool is_global_asm = inlineAsm.is_global_asm; // Parse everything commitedly if (!parser.skip_token (LEFT_PAREN)) { @@ -126,43 +128,43 @@ parse_options (Parser<MacroInvocLexer> &parser, TokenId last_token_id, { if (!is_global_asm && check_identifier (parser, "pure")) { - check_and_set (parser, args, "pure"); + check_and_set (parser, inlineAsm, "pure"); } else if (!is_global_asm && check_identifier (parser, "nomem")) { - check_and_set (parser, args, "nomem"); + check_and_set (parser, inlineAsm, "nomem"); } else if (!is_global_asm && check_identifier (parser, "readonly")) { - check_and_set (parser, args, "readonly"); + check_and_set (parser, inlineAsm, "readonly"); } else if (!is_global_asm && check_identifier (parser, "preserves_flags")) { - check_and_set (parser, args, "preserves_flags"); + check_and_set (parser, inlineAsm, "preserves_flags"); } else if (!is_global_asm && check_identifier (parser, "noreturn")) { - check_and_set (parser, args, "noreturn"); + check_and_set (parser, inlineAsm, "noreturn"); } else if (!is_global_asm && check_identifier (parser, "noreturn")) { - check_and_set (parser, args, "noreturn"); + check_and_set (parser, inlineAsm, "noreturn"); } else if (!is_global_asm && check_identifier (parser, "nostack")) { - check_and_set (parser, args, "nostack"); + check_and_set (parser, inlineAsm, "nostack"); } else if (!is_global_asm && check_identifier (parser, "may_unwind")) { - check_and_set (parser, args, "may_unwind"); + check_and_set (parser, inlineAsm, "may_unwind"); } else if (check_identifier (parser, "att_syntax")) { - check_and_set (parser, args, "att_syntax"); + check_and_set (parser, inlineAsm, "att_syntax"); } else if (check_identifier (parser, "raw")) { - check_and_set (parser, args, "raw"); + check_and_set (parser, inlineAsm, "raw"); } else { @@ -249,12 +251,11 @@ MacroBuiltin::nonglobal_asm_handler (location_t invoc_locus, return parse_asm (invoc_locus, invoc, is_global_asm); } -tl::optional<AsmArg> +int parseAsmArg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - bool is_global_asm) + AST::InlineAsm &inlineAsm) { auto token = parser.peek_current_token (); - AsmArg arg; tl::optional<std::string> fm_string; while (token->get_id () != last_token_id) { @@ -299,7 +300,7 @@ parseAsmArg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, // only other logical choice is reg_operand fm_string = parse_format_string (parser, last_token_id); } - return tl::nullopt; + return 0; } static tl::optional<AST::Fragment> @@ -326,6 +327,9 @@ parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, Parser<MacroInvocLexer> parser (lex); auto last_token_id = macro_end_token (invoc.get_delim_tok_tree (), parser); + AST::InlineAsm inlineAsm (invoc_locus, is_global_asm); + inlineAsm.is_global_asm = is_global_asm; + // Parse the first ever formatted string, success or not, will skip 1 token auto fm_string = parse_format_string (parser, last_token_id); if (fm_string == tl::nullopt) @@ -349,7 +353,7 @@ parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, } // operands stream, also handles the optional "," - parseAsmArg (parser, last_token_id, is_global_asm); + parseAsmArg (parser, last_token_id, inlineAsm); return tl::nullopt; } diff --git a/gcc/rust/expand/rust-macro-builtins-asm.h b/gcc/rust/expand/rust-macro-builtins-asm.h index fd86c309c9a5..204ac0e72389 100644 --- a/gcc/rust/expand/rust-macro-builtins-asm.h +++ b/gcc/rust/expand/rust-macro-builtins-asm.h @@ -2,59 +2,14 @@ #include "rust-macro-builtins.h" #include "rust-macro-builtins-helpers.h" #include "rust-macro-invoc-lexer.h" - +#include "rust/ast/rust-expr.h" namespace Rust { -struct AsmParseError -{ -}; - -// This is just an enum to hold some operands right now. -enum InlineAsmDirSpec -{ - In, - Out, - InOut, - SplitInOut, - InLateOut, // TODO: This is not present in rust's asm.rs - Const, // TODO: This is not present in ABNF - Sym, // TODO: This is not present in ABNF - Label, // TODO: This is not present in ABNF -}; - -// Place holder for classes -enum InlineAsmRegOrRegClass -{ - InlineAsmReg, - Reg, -}; - -typedef std::string symbol_name; -typedef std::vector<AST::Expr> Templates; -typedef std::vector<InlineAsmDirSpec> Operands; -typedef std::map<std::string, int> RegisterArgs; -typedef std::vector<symbol_name> ClobberAbis; -typedef std::map<symbol_name, int> NamedValues; -typedef std::set<std::string> InlineAsmOptions; - -struct AsmArg -{ - Templates templates; - Operands operands; - std::map<symbol_name, int> named_values; - RegisterArgs register_arguments; - ClobberAbis clobber_abis; - InlineAsmOptions options; - std::vector<InlineAsmOptions> - options_span; // TODO: @badumbatish @jjasmine I have no idea what span do, i - // copied it out of rustc_builtin_macros/src/asm.rs -}; - // All the operands are called asm_args in rustc asm.rs, we create a struct that // can store all of these AsmArgs This replaces the phase where we have to parse // all operands. -tl::optional<AsmArg> +int parseAsmArg (Parser<MacroInvocLexer> &p, TokenId last_token_id, - bool is_global_asm); + AST::InlineAsm &inlineAsm); static tl::optional<AST::Fragment> parse_global_asm (location_t invoc_locus, AST::MacroInvocData &invoc); static tl::optional<AST::Fragment> @@ -67,24 +22,25 @@ bool check_identifier (Parser<MacroInvocLexer> &p, std::string ident); void -check_and_set (Parser<MacroInvocLexer> &p, AsmArg &args, std::string option); +check_and_set (Parser<MacroInvocLexer> &p, AST::InlineAsm &inlineAsm, + std::string option); // From rustc int parse_operand (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - AsmArg &args); + AST::InlineAsm &inlineAsm); // From rustc int parse_options (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - AsmArg &args, bool is_global_asm); + AST::InlineAsm &inlineAsm); // From rustc -tl::optional<InlineAsmRegOrRegClass> -parse_reg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, AsmArg &args, - bool is_explicit); +int +parse_reg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, + AST::InlineAsm &inlineAsm, bool is_explicit); int parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, - AsmArg &args); + AST::InlineAsm &inlineAsm); } // namespace Rust \ No newline at end of file