Skip to content

Commit

Permalink
Provide input operand for gccrs
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* backend/rust-compile-asm.cc (CompileAsm::asm_construct_inputs):
	Provide input operand for gccrs
	* expand/rust-macro-builtins-asm.cc (parse_reg_operand_in):
	Move expr to In
	(expand_inline_asm_strings):
	Add comments to debug strings

gcc/testsuite/ChangeLog:

	* rust/compile/inline_asm_parse_operand.rs:
	Remove inout, functionality not supported. Remove redundant {}
	* rust/execute/torture/inline_asm_mov_x_5_ARM.rs: Add operand in
	* rust/execute/torture/inline_asm_mov_x_5_x86_64.rs: Likewise
  • Loading branch information
badumbatish committed Sep 5, 2024
1 parent 8ab5dd8 commit 39740e3
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 11 deletions.
22 changes: 20 additions & 2 deletions gcc/rust/backend/rust-compile-asm.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include "rust-compile-asm.h"
#include "rust-system.h"
#include "rust-compile-expr.h"
namespace Rust {
namespace Compile {
Expand Down Expand Up @@ -107,7 +106,26 @@ tree
CompileAsm::asm_construct_inputs (HIR::InlineAsm &expr)
{
// TODO: Do i need to do this?
return NULL_TREE;
tree head = NULL_TREE;
for (auto &input : expr.get_operands ())
{
if (input.get_register_type () == AST::InlineAsmOperand::RegisterType::In)
{
auto in = input.get_in ();

tree in_tree = CompileExpr::Compile (in.expr.get (), this->ctx);
// expects a tree list
// TODO: This assumes that the input is a register
std::string expr_name = "r";
auto name = build_string (expr_name.size () + 1, expr_name.c_str ());
head
= chainon (head, build_tree_list (build_tree_list (NULL_TREE, name),
in_tree));

/*head = chainon (head, out_tree);*/
}
}
return head;
}

tree
Expand Down
9 changes: 5 additions & 4 deletions gcc/rust/expand/rust-macro-builtins-asm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,8 @@ parse_reg_operand_in (InlineAsmContext inline_asm_ctx)

// TODO: When we've succesfully parse an expr, remember to clone_expr()
// instead of nullptr
// struct AST::InlineAsmOperand::In in (reg, nullptr);
// inline_asm_ctx.inline_asm.operands.push_back (in);
struct AST::InlineAsmOperand::In in (reg, std::move (expr));
inline_asm_ctx.inline_asm.operands.push_back (in);
return inline_asm_ctx;
}
return tl::unexpected<InlineAsmParseError> (NONCOMMITED);
Expand Down Expand Up @@ -791,8 +791,9 @@ expand_inline_asm_strings (InlineAsmContext inline_asm_ctx)
* trait});*/

transformed_template_str += "%" + std::to_string (idx);
/*std::cout << "argument implicitly is: " << idx <<
* std::endl;*/
// std::cout << "argument implicitly is: " << idx <<
// std::endl; std::cout << "transformed template str is:"
// << transformed_template_str << std::endl;
/*std::cout << "trait: " << trait.to_string () <<
* std::endl;*/
/*std::cout << "arg: " << arg.to_string () << std::endl;*/
Expand Down
6 changes: 3 additions & 3 deletions gcc/testsuite/rust/compile/inline_asm_parse_operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ macro_rules! asm {
fn main() -> i32 {
unsafe {
asm!(
"add {}, {}",
"add {}, 1",
in(reg) 0
);
}
Expand All @@ -21,15 +21,15 @@ fn main() -> i32 {
unsafe {
asm!(
"add {}, {}",
inout(reg) num1 =>_num1,
in(reg) _num2,
out(reg) _num1,
);
}

let mut _output_testing: u32 = 0;
unsafe {
asm!(
"add {}, {}",
"add {}, 1",
in(reg) _num1,
//out(reg) _,
);
Expand Down
14 changes: 13 additions & 1 deletion gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* { dg-do run { target arm*-*-* } } */
/* { dg-output "5\r*\n" }*/
/* { dg-output "5\r*\n9\r*\n" }*/

#![feature(rustc_attrs)]
#[rustc_builtin_macro]
Expand All @@ -13,12 +13,24 @@ extern "C" {

fn main() -> i32 {
let mut _x: i32 = 0;
let mut _y: i32 = 9;

unsafe {
asm!(
"mov {}, 5",
out(reg) _x
);
printf("%d\n\0" as *const str as *const i8, _x);
};

unsafe {
asm!(
"mov {}, {}",
in(reg) _y,
out(reg) _x
);
printf("%d\n\0" as *const str as *const i8, _x);
}

0
}
13 changes: 12 additions & 1 deletion gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* { dg-do run { target x86_64*-*-* } } */
/* { dg-output "5\r*\n" }*/
/* { dg-output "5\r*\n9\r*\n" }*/

#![feature(rustc_attrs)]
#[rustc_builtin_macro]
Expand All @@ -13,12 +13,23 @@ extern "C" {

fn main() -> i32 {
let mut _x: i32 = 0;
let mut _y: i32 = 9;

unsafe {
asm!(
"mov $5, {}",
out(reg) _x
);
printf("%d\n\0" as *const str as *const i8, _x);
};

unsafe {
asm!(
"mov {}, {}",
in(reg) _y,
out(reg) _x,
);
printf("%d\n\0" as *const str as *const i8, _x);
}
0
}

0 comments on commit 39740e3

Please sign in to comment.