aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-asm.cc22
-rw-r--r--gcc/rust/expand/rust-macro-builtins-asm.cc9
-rw-r--r--gcc/testsuite/rust/compile/inline_asm_parse_operand.rs6
-rw-r--r--gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs14
-rw-r--r--gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs19
5 files changed, 56 insertions, 14 deletions
diff --git a/gcc/rust/backend/rust-compile-asm.cc b/gcc/rust/backend/rust-compile-asm.cc
index 8294feb..e85d08d 100644
--- a/gcc/rust/backend/rust-compile-asm.cc
+++ b/gcc/rust/backend/rust-compile-asm.cc
@@ -1,5 +1,4 @@
#include "rust-compile-asm.h"
-#include "rust-system.h"
#include "rust-compile-expr.h"
namespace Rust {
namespace Compile {
@@ -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
diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc b/gcc/rust/expand/rust-macro-builtins-asm.cc
index 1017d9f..e970f28 100644
--- a/gcc/rust/expand/rust-macro-builtins-asm.cc
+++ b/gcc/rust/expand/rust-macro-builtins-asm.cc
@@ -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);
@@ -792,8 +792,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;*/
diff --git a/gcc/testsuite/rust/compile/inline_asm_parse_operand.rs b/gcc/testsuite/rust/compile/inline_asm_parse_operand.rs
index e0efe1c..c7bc152 100644
--- a/gcc/testsuite/rust/compile/inline_asm_parse_operand.rs
+++ b/gcc/testsuite/rust/compile/inline_asm_parse_operand.rs
@@ -8,7 +8,7 @@ macro_rules! asm {
fn main() -> i32 {
unsafe {
asm!(
- "add {}, {}",
+ "add {}, 1",
in(reg) 0
);
}
@@ -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) _,
);
diff --git a/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs b/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs
index 4e76260..0c867df 100644
--- a/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs
+++ b/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_ARM.rs
@@ -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]
@@ -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
}
diff --git a/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs b/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs
index c6086e0..5fbbb68 100644
--- a/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs
+++ b/gcc/testsuite/rust/execute/torture/inline_asm_mov_x_5_x86_64.rs
@@ -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]
@@ -12,13 +12,24 @@ extern "C" {
}
fn main() -> i32 {
- let mut _x: i32 = 0;
+ let mut x: i32 = 0;
+ let mut _y: i32 = 9; // Mark it as _y since it is only used as input operand, not printing
+
unsafe {
asm!(
"mov $5, {}",
- out(reg) _x
+ 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);
+ printf("%d\n\0" as *const str as *const i8, x);
}
0
}