From: jjasmine Date: Sun, 19 May 2024 04:24:10 +0000 (-0700) Subject: gccrs: Working on parseAsmArg X-Git-Tag: basepoints/gcc-16~1389 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2695feddfdad99c66b73d6b0ba903f5f58115a09;p=thirdparty%2Fgcc.git gccrs: Working on parseAsmArg gcc/rust/ChangeLog: * expand/rust-macro-builtins-asm.cc (enum InlineAsmRegOrRegClass): title. (parseAsmArg): title. (check_identifier): title. (parse_operand): title. (parse_options): title. (parse_reg): title. (parseDirSpec): title. (parse_asm): title. --- diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc index 7958d91537a..f26c4610230 100644 --- a/gcc/rust/expand/rust-macro-builtins-asm.cc +++ b/gcc/rust/expand/rust-macro-builtins-asm.cc @@ -16,74 +16,32 @@ // along with GCC; see the file COPYING3. If not see // . -#include "rust-macro-builtins.h" -#include "rust-macro-builtins-helpers.h" -#include "rust-macro-invoc-lexer.h" +#include "rust-macro-builtins-asm.h" namespace Rust { -struct AsmParseError -{ -}; - -// This is just an enum to hold some operands right now. -enum InlineAsmDirSpec -{ - In, - Out, - InOut, - SplitInOut, - Const, - Sym, - Label, -}; - -enum InlineAsmOptions -{ - -}; - -typedef std::string symbol_name; -typedef std::vector Templates; -typedef std::vector Operands; -typedef std::map RegisterArgs; -typedef std::map ClobberAbis; -typedef std::map NamedValues; - -struct AsmArg -{ - Templates templates; - Operands operands; - std::map named_values; - RegisterArgs register_arguments; - ClobberAbis clobber_abis; - InlineAsmOptions options; - std::vector - options_span; // TODO: @badumbatish @jjasmine I have no idea what span do, i - // copied it out of rustc_builtin_macros/src/asm.rs -}; - -tl::optional -parseAsmArg (Parser &p, bool is_global_asm); -static tl::optional -parse_global_asm (location_t invoc_locus, AST::MacroInvocData &invoc); -static tl::optional -parse_nonglobal_asm (location_t invoc_locus, AST::MacroInvocData &invoc); -static tl::optional -parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, - bool is_global_asm); - tl::optional -parseDirSpec (Parser &p, TokenId last_token_id) +parseDirSpec (Parser &parser, TokenId last_token_id) { return tl::nullopt; } -tl::optional -parseAsmArg (Parser &p, bool is_global_asm) + +bool +check_identifier (Parser &p, std::string ident) { - return tl::nullopt; -} + auto token = p.peek_current_token (); + if (token->get_id () == IDENTIFIER + && (token->as_string () == ident || ident == "")) + { + p.skip_token (); + return true; + } + else + { + return false; + } +} tl::optional parse_format_string (Parser &parser, TokenId last_token_id) { @@ -125,6 +83,59 @@ MacroBuiltin::nonglobal_asm_handler (location_t invoc_locus, return parse_asm (invoc_locus, invoc, is_global_asm); } +tl::optional +parseAsmArg (Parser &parser, TokenId last_token_id, + bool is_global_asm) +{ + auto token = parser.peek_current_token (); + AsmArg arg; + tl::optional fm_string; + while (token->get_id () != last_token_id) + { + std::cout << token->get_token_description () << std::endl; + + token = parser.peek_current_token (); + + // We accept a comma token here. + if (token->get_id () != COMMA) + { + break; + } + parser.skip_token (); + + // And if that token comma is also the trailing comma, we break + // TODO: Check with mentor see what last_token_id means + token = parser.peek_current_token (); + if (token->get_id () == COMMA && token->get_id () == last_token_id) + { + parser.skip_token (); + break; + } + + // Ok after the left paren is good, we better be parsing correctly + // everything in here, which is operand in ABNF + + // TODO: Parse clobber abi + if (check_identifier (parser, "clobber_abi")) + { + std::cout << "Clobber abi tee hee" << std::endl; + continue; + } + + // TODO: Parse options + if (check_identifier (parser, "options")) + { + std::cout << "Parse optoins" << std::endl; + continue; + } + + // Ok after we have check that neither clobber_abi nor options works, the + // only other logical choice is reg_operand + fm_string = parse_format_string (parser, last_token_id); + } + return tl::nullopt; +} + static tl::optional parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, bool is_global_asm) @@ -171,26 +182,8 @@ parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, fm_string = parse_format_string (parser, last_token_id); } - // operands stream - token = parser.peek_current_token (); - while (token->get_id () != last_token_id) - { - std::cout << token->get_token_description () << std::endl; - - token = parser.peek_current_token (); - if (token->get_id () != COMMA) - { - break; - } - parser.skip_token (); - // Ok after the left paren is good, we better be parsing correctly - // everything in here, which is operand in ABNF - - // TODO: Work on parsing operands - fm_string = parse_format_string (parser, last_token_id); - } - - // TODO: Handle the optional "," + // operands stream, also handles the optional "," + parseAsmArg (parser, last_token_id, is_global_asm); return tl::nullopt; } diff --git a/gcc/rust/expand/rust-macro-builtins-asm.h b/gcc/rust/expand/rust-macro-builtins-asm.h new file mode 100644 index 00000000000..3a67c7e3152 --- /dev/null +++ b/gcc/rust/expand/rust-macro-builtins-asm.h @@ -0,0 +1,87 @@ + +#include "rust-macro-builtins.h" +#include "rust-macro-builtins-helpers.h" +#include "rust-macro-invoc-lexer.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 +}; + +enum InlineAsmOptions +{ + +}; + +// Place holder for classes +enum InlineAsmRegOrRegClass +{ + InlineAsmReg, + Reg, +}; + +typedef std::string symbol_name; +typedef std::vector Templates; +typedef std::vector Operands; +typedef std::map RegisterArgs; +typedef std::map ClobberAbis; +typedef std::map NamedValues; + +struct AsmArg +{ + Templates templates; + Operands operands; + std::map named_values; + RegisterArgs register_arguments; + ClobberAbis clobber_abis; + InlineAsmOptions options; + std::vector + 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 +parseAsmArg (Parser &p, TokenId last_token_id, + bool is_global_asm); +static tl::optional +parse_global_asm (location_t invoc_locus, AST::MacroInvocData &invoc); +static tl::optional +parse_nonglobal_asm (location_t invoc_locus, AST::MacroInvocData &invoc); +static tl::optional +parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc, + bool is_global_asm); + +bool +check_identifier (Parser &p, std::string ident); + +// From rustc +int +parse_operand (Parser &parser, TokenId last_token_id, + AsmArg &args); + +// From rustc +int +parse_options (Parser &parser, TokenId last_token_id, + AsmArg &args, bool is_global_asm); + +// From rustc +tl::optional +parse_reg (Parser &parser, TokenId last_token_id, AsmArg &args, + bool is_explicit); +} // namespace Rust \ No newline at end of file