From: jjasmine <tanghocle...@gmail.com> gcc/rust/ChangeLog:
* ast/rust-expr.h (struct InlineAsmRegOrRegClass): Scaffolding parse_reg * expand/rust-macro-builtins-asm.cc (parse_reg): Likewise. (parse_operand): Likewise. (parseAsmArg): Likewise. --- gcc/rust/ast/rust-expr.h | 6 +++ .../errors/borrowck/ffi-polonius/Cargo.lock | 39 +++++++++++++++ gcc/rust/expand/rust-macro-builtins-asm.cc | 49 ++++++++++++++++++- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 gcc/rust/checks/errors/borrowck/ffi-polonius/Cargo.lock diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index 719a76cdbb3..309174057c0 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -4743,6 +4743,12 @@ struct InlineAsmRegOrRegClass std::string Symbol; }; + Type type; + union + { + struct Reg reg; + struct RegClass regClass; + }; Identifier name; location_t locus; }; diff --git a/gcc/rust/checks/errors/borrowck/ffi-polonius/Cargo.lock b/gcc/rust/checks/errors/borrowck/ffi-polonius/Cargo.lock new file mode 100644 index 00000000000..55cc71157ae --- /dev/null +++ b/gcc/rust/checks/errors/borrowck/ffi-polonius/Cargo.lock @@ -0,0 +1,39 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "datafrog" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0afaad2b26fa326569eb264b1363e8ae3357618c43982b3f285f0774ce76b69" + +[[package]] +name = "ffi-polonius" +version = "0.1.0" +dependencies = [ + "polonius-engine", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "polonius-engine" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e8e505342045d397d0b6674dcb82d6faf5cf40484d30eeb88fc82ef14e903f" +dependencies = [ + "datafrog", + "log", + "rustc-hash", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc index 68a617ada4d..f6940ffb339 100644 --- a/gcc/rust/expand/rust-macro-builtins-asm.cc +++ b/gcc/rust/expand/rust-macro-builtins-asm.cc @@ -125,6 +125,53 @@ parse_clobber_abi (Parser<MacroInvocLexer> &parser, TokenId last_token_id, return 0; } +int +parse_reg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, + AST::InlineAsm &inlineAsm, bool is_explicit) +{ + if (!parser.skip_token (LEFT_PAREN)) + { + // TODO: we expect a left parenthesis here, please return the correct + // error. + return 0; + } + + // after successful left parenthesis parsing, we should return ast of + // InlineAsmRegOrRegClass of reg or reg class + auto token = parser.peek_current_token (); + auto tok_id = token->get_id (); + + if (tok_id == IDENTIFIER) + { + // construct a InlineAsmRegOrRegClass + } + else if (tok_id == STRING_LITERAL) + { + // TODO: there is STRING_LITERAL, and BYTE_STRING_LITERAL, should we check + // for both? + + // construct a InlineAsmRegOrRegClass + } + else + { + // TODO + } + if (!parser.skip_token (RIGHT_PAREN)) + { + // we expect a left parenthesis here, please return the correct error. + return 0; + } + + return 0; +} + +int +parse_operand (Parser<MacroInvocLexer> &parser, TokenId last_token_id, + AST::InlineAsm &inlineAsm) +{ + return 0; +} + void check_and_set (Parser<MacroInvocLexer> &parser, AST::InlineAsm &inlineAsm, AST::InlineAsmOptions option) @@ -340,7 +387,7 @@ parseAsmArg (Parser<MacroInvocLexer> &parser, TokenId last_token_id, return 0; } -static tl::optional<AST::Fragment> +tl::optional<AST::Fragment> parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, bool is_global_asm) { -- 2.45.2