From f939cb628fed4c72fe85675951ed4fee752d7de8 Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Mon, 27 Apr 2026 17:51:00 +0800 Subject: [PATCH 1/3] Fix asm pointer inputs --- src/asm.rs | 8 +++++++- tests/run/asm.rs | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/asm.rs b/src/asm.rs index 83bfe18ce7b..22cbfb37489 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -362,7 +362,13 @@ impl<'a, 'gcc, 'tcx> AsmBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> { let ty = value.layout.gcc_type(self.cx); let reg_var = self.current_func().new_local(None, ty, "input_register"); reg_var.set_register_name(reg_name); - self.llbb().add_assignment(None, reg_var, value.immediate()); + let value = value.immediate(); + let value = if value.get_type() != ty { + self.context.new_cast(None, value, ty) + } else { + value + }; + self.llbb().add_assignment(None, reg_var, value); inputs.push(AsmInOperand { constraint: "r".into(), diff --git a/tests/run/asm.rs b/tests/run/asm.rs index 01775c92ffc..2d78f5ad5f9 100644 --- a/tests/run/asm.rs +++ b/tests/run/asm.rs @@ -190,6 +190,14 @@ fn asm() { } assert_eq!((x, y), (8, 8)); + // Regression test for + // typed pointer inputs to explicit registers need a cast. + let mut x = 123_i32; + unsafe { + asm!("", in("rdi") &mut x, options(nostack, preserves_flags)); + } + assert_eq!(x, 123); + // sysv64 is the default calling convention on unix systems. The rdi register is // used to pass arguments in the sysv64 calling convention, so this register will be clobbered #[cfg(unix)] From 795487ef1177425568555f1d24b57962d22f02fc Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Thu, 30 Apr 2026 10:17:40 +0800 Subject: [PATCH 2/3] Add TODO --- src/asm.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/asm.rs b/src/asm.rs index 22cbfb37489..b011e843aee 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -362,6 +362,7 @@ impl<'a, 'gcc, 'tcx> AsmBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> { let ty = value.layout.gcc_type(self.cx); let reg_var = self.current_func().new_local(None, ty, "input_register"); reg_var.set_register_name(reg_name); + // TODO: We should remove this when switching to "untyped" pointers let value = value.immediate(); let value = if value.get_type() != ty { self.context.new_cast(None, value, ty) From f24d3b8b9df64b1aa068b95d9e702dca148a3559 Mon Sep 17 00:00:00 2001 From: Uni Hikousen <32487868+cijiugechu@users.noreply.github.com> Date: Fri, 1 May 2026 00:27:56 +0800 Subject: [PATCH 3/3] use FIXME --- src/asm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/asm.rs b/src/asm.rs index b011e843aee..00e6423e46a 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -362,7 +362,7 @@ impl<'a, 'gcc, 'tcx> AsmBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> { let ty = value.layout.gcc_type(self.cx); let reg_var = self.current_func().new_local(None, ty, "input_register"); reg_var.set_register_name(reg_name); - // TODO: We should remove this when switching to "untyped" pointers + // FIXME: We should remove this when switching to "untyped" pointers let value = value.immediate(); let value = if value.get_type() != ty { self.context.new_cast(None, value, ty)