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

Reply via email to