aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/expand/rust-macro-builtins-asm.cc
diff options
context:
space:
mode:
authorbadumbatish <tanghocle456@gmail.com>2024-07-25 23:07:00 -0700
committerCohenArthur <arthur.cohen@embecosm.com>2024-09-02 09:44:55 +0000
commit8d157b63670d1efe4a664b7da14b6908bbd11689 (patch)
tree7d8b68f8dda85fc98c596ee6188f290dffa0c574 /gcc/rust/expand/rust-macro-builtins-asm.cc
parentf0df55806933cda31af2abc3b666a6a2eec52875 (diff)
downloadgcc-8d157b63670d1efe4a664b7da14b6908bbd11689.zip
gcc-8d157b63670d1efe4a664b7da14b6908bbd11689.tar.gz
gcc-8d157b63670d1efe4a664b7da14b6908bbd11689.tar.bz2
Start work on expand inline asm
gcc/rust/ChangeLog: * expand/rust-macro-builtins-asm.cc (parse_reg_operand): Remove warnings (parse_reg_operand_out): Remove warnings (expand_inline_asm): New function for eventual expansion (parse_asm): Use expand_inline_asm gcc/testsuite/ChangeLog: * rust/execute/torture/inline_asm_mov_x_5.rs: New test.
Diffstat (limited to 'gcc/rust/expand/rust-macro-builtins-asm.cc')
-rw-r--r--gcc/rust/expand/rust-macro-builtins-asm.cc33
1 files changed, 31 insertions, 2 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc
index 79b7c8e..d3cfbd8 100644
--- a/gcc/rust/expand/rust-macro-builtins-asm.cc
+++ b/gcc/rust/expand/rust-macro-builtins-asm.cc
@@ -21,6 +21,7 @@
#include "rust-macro-builtins-asm.h"
#include "rust-ast-fragment.h"
#include "rust-ast.h"
+#include "rust-fmt.h"
#include "rust-stmt.h"
namespace Rust {
@@ -240,7 +241,7 @@ parse_reg_operand (InlineAsmContext inline_asm_ctx)
if (result.has_value ())
{
- inline_asm_ctx = result.value ();
+ inline_asm_ctx = *result;
break;
}
else if (result.error () == COMMITTED)
@@ -741,6 +742,31 @@ parse_asm_arg (InlineAsmContext inline_asm_ctx)
return tl::expected<InlineAsmContext, InlineAsmParseError> (inline_asm_ctx);
}
+tl::expected<InlineAsmContext, InlineAsmParseError>
+expand_inline_asm (InlineAsmContext &inline_asm_ctx)
+{
+ auto &inline_asm = inline_asm_ctx.inline_asm;
+
+ auto str_vec = inline_asm.get_template_strs ();
+ for (auto &template_str : str_vec)
+ {
+ std::cout << template_str.symbol << std::endl;
+
+ auto pieces = Fmt::Pieces::collect (template_str.symbol, false,
+ Fmt::ffi::ParseMode::Format)
+ .get_pieces ();
+
+ for (size_t i = 0; i < pieces.size (); i++)
+ {
+ auto piece = pieces[i];
+ if (piece.tag == Fmt::ffi::Piece::Tag::String)
+ std::cout << " " << i << ": " << piece.string._0.to_string ()
+ << std::endl;
+ }
+ }
+
+ return inline_asm_ctx;
+}
tl::optional<AST::Fragment>
parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc,
AST::InvocKind semicolon, AST::AsmKind is_global_asm)
@@ -770,7 +796,10 @@ parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc,
// here Per Arthur's advice we would actually do the validation in a different
// stage. and visit on the InlineAsm AST instead of it's context.
auto is_valid = (bool) resulting_context;
-
+ if (is_valid)
+ {
+ expand_inline_asm (resulting_context.value ());
+ }
if (is_valid)
{
auto node = inline_asm_ctx.inline_asm.clone_expr_without_block ();