aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/expand/rust-macro-builtins-asm.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/expand/rust-macro-builtins-asm.h')
-rw-r--r--gcc/rust/expand/rust-macro-builtins-asm.h207
1 files changed, 207 insertions, 0 deletions
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 0000000..2bdaed5
--- /dev/null
+++ b/gcc/rust/expand/rust-macro-builtins-asm.h
@@ -0,0 +1,207 @@
+
+#include "rust-ast-fragment.h"
+#include "rust-macro-builtins.h"
+#include "rust-macro-builtins-helpers.h"
+#include "expected.h"
+#include "rust-macro-invoc-lexer.h"
+#include "rust/ast/rust-expr.h"
+#include "system.h"
+namespace Rust {
+
+enum InlineAsmParseError
+{
+ // Enum for InlineAsmParseError
+
+ // Currently with two error, COMMITTED AND NONCOMMITTED (to a token),
+ // which directs the parser to either bubbles the error up, or keep on going
+ // (vertical or horizontal)
+
+ // COMMITTED can be use as a way for parser to bubble up
+ // after it has exhausted its search space despite it not having committed to
+ // any token
+
+ COMMITTED,
+ NONCOMMITED,
+};
+class InlineAsmContext
+{
+public:
+ bool allow_templates;
+ bool is_explicit;
+ bool consumed_comma_without_formatted_string;
+ AST::InlineAsm &inline_asm;
+ Parser<MacroInvocLexer> &parser;
+ int last_token_id;
+
+ InlineAsmContext (AST::InlineAsm &inline_asm, Parser<MacroInvocLexer> &parser,
+ int last_token_id)
+ : allow_templates (true), is_explicit (false),
+ consumed_comma_without_formatted_string (false), inline_asm (inline_asm),
+ parser (parser), last_token_id (last_token_id)
+ {}
+
+ InlineAsmContext (const InlineAsmContext &inline_asm_ctx)
+ : allow_templates (inline_asm_ctx.allow_templates),
+ is_explicit (inline_asm_ctx.is_explicit),
+ consumed_comma_without_formatted_string (false),
+ inline_asm (inline_asm_ctx.inline_asm), parser (inline_asm_ctx.parser),
+ last_token_id (inline_asm_ctx.last_token_id)
+ {}
+ // explicit InlineAsmContext (InlineAsmContext&& inline_asm_ctx)
+ // : allow_templates (inline_asm_ctx.allow_templates), is_explicit
+ // (inline_asm_ctx.is_explicit),
+ // consumed_comma_without_formatted_string (false), inline_asm
+ // (inline_asm_ctx.inline_asm), parser (inline_asm_ctx.parser),
+ // last_token_id (inline_asm_ctx.last_token_id)
+ // {}
+
+ // InlineAsmContext(tl::expected<InlineAsmContext, InlineAsmParseError>
+ // &expected)
+ // : allow_templates(expected->allow_templates),
+ // is_explicit(expected->is_explicit),
+ // consumed_comma_without_formatted_string(expected->consumed_comma_without_formatted_string),
+ // inline_asm(expected->inline_asm), parser(expected->parser),
+ // last_token_id(expected->last_token_id)
+ // {
+
+ // }
+ InlineAsmContext &operator= (const InlineAsmContext &inline_asm_ctx)
+ {
+ allow_templates = inline_asm_ctx.allow_templates;
+ is_explicit = inline_asm_ctx.is_explicit;
+ consumed_comma_without_formatted_string = false;
+ last_token_id = inline_asm_ctx.last_token_id;
+ return *this;
+ }
+
+ bool is_global_asm () { return inline_asm.is_global_asm; }
+
+ bool allows_templates () { return allow_templates; }
+
+ void set_allow_templates (bool allow_templates)
+ {
+ this->allow_templates = allow_templates;
+ }
+};
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+expand_inline_asm_strings (InlineAsmContext inline_asm_ctx);
+
+// Expected calls
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+validate (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_asm_arg (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_format_strings (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_clobber_abi (InlineAsmContext inline_asm_ctx);
+
+// From rustc
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_in (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_out (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_lateout (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_inout (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_inlateout (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_const (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_sym (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_reg_operand_unexpected (InlineAsmContext inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::optional<AST::Fragment>
+parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc,
+ AST::InvocKind semicolon, AST::AsmKind is_global_asm);
+
+WARN_UNUSED_RESULT
+bool
+check_identifier (Parser<MacroInvocLexer> &parser, std::string ident);
+
+void
+check_and_set (InlineAsmContext &inline_asm_ctx, AST::InlineAsm::Option option);
+
+// From rustc
+WARN_UNUSED_RESULT
+tl::expected<InlineAsmContext, InlineAsmParseError>
+parse_options (InlineAsmContext &inline_asm_ctx);
+
+// From rustc
+WARN_UNUSED_RESULT
+tl::optional<AST::InlineAsmRegOrRegClass>
+parse_reg (InlineAsmContext &inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::optional<std::string>
+parse_format_string (InlineAsmContext &inline_asm_ctx);
+
+WARN_UNUSED_RESULT
+tl::optional<std::string>
+parse_label (Parser<MacroInvocLexer> &parser, TokenId last_token_id,
+ InlineAsmContext &inline_asm_ctx);
+
+// LLVM ASM bits
+
+class LlvmAsmContext
+{
+public:
+ AST::LlvmInlineAsm &llvm_asm;
+ Parser<MacroInvocLexer> &parser;
+ int last_token_id;
+
+public:
+ LlvmAsmContext (AST::LlvmInlineAsm &llvm_asm, Parser<MacroInvocLexer> &parser,
+ int last_token_id)
+ : llvm_asm (llvm_asm), parser (parser), last_token_id (last_token_id)
+ {}
+};
+
+void
+parse_llvm_outputs (LlvmAsmContext &ctx);
+
+void
+parse_llvm_inputs (LlvmAsmContext &ctx);
+
+void
+parse_llvm_clobbers (LlvmAsmContext &ctx);
+
+void
+parse_llvm_options (LlvmAsmContext &ctx);
+
+WARN_UNUSED_RESULT tl::optional<AST::Fragment>
+parse_llvm_asm (location_t invoc_locus, AST::MacroInvocData &invoc,
+ AST::InvocKind semicolon, AST::AsmKind is_global_asm);
+
+} // namespace Rust