[Pkg-rust-maintainers] Bug#985810: rust-compiler-builtins: FTBFS on arm, uses old asm!

peter green plugwash at p10link.net
Wed Mar 24 05:29:45 GMT 2021


package: rust-compiler-builtins
version: 0.1.26-2
severity: serious

While looking through my ddpo page I noticed it was listing rust-compiler-builtins as FTBFS,
following the link through to reproducible builds showed it had been failing to build on
armhf for some time.

Rust upstream have renamed the old assembler support from asm! to llvm_asm! in preperation
for the introduction of a new more robust assembler syntax, which is not tied to llvm.
This breaks the build of rust-compiler-builtins on arm (tested on armhf but presumablly
also affects armel).

The crate also has assembler code in the x86 and x86_64 modules, but this code is gated
behind a windows feature test, so it doesn't directly affect Debian.

Upstream fixed this some time ago,
https://github.com/rust-lang/compiler-builtins/commit/cde22bc180391e75de1c189fe29f442ada86ccde
but unfortunately the new version was never uploaded to Debian and given that it's a key package,
it's too late for new upstream versions now.

I therefore took the upstream commit, removed changes unrelated to the asm change
and applied it to the Debian package. I left in the changes to the windows specific
asm blocks figuring it was sensible to treat the asm change as one unit. I was then able
to successfully build the package on armhf.

If noone objects, then in a week or so I will apply this change in the debcargo-conf
repo, make an upload and file an unblock request with the release team.
-------------- next part --------------
diff -Nru rust-compiler-builtins-0.1.26/debian/changelog rust-compiler-builtins-0.1.26/debian/changelog
--- rust-compiler-builtins-0.1.26/debian/changelog	2020-04-12 21:42:44.000000000 +0000
+++ rust-compiler-builtins-0.1.26/debian/changelog	2021-03-24 05:09:17.000000000 +0000
@@ -1,3 +1,10 @@
+rust-compiler-builtins (0.1.26-3) UNRELEASED; urgency=medium
+
+  * Apply upstream changes to replace asm with llvm_asm and hence
+    fix FTBFS on arm (Closes: ?????).
+
+ -- Peter Michael Green <plugwash at debian.org>  Wed, 24 Mar 2021 05:09:17 +0000
+
 rust-compiler-builtins (0.1.26-2) unstable; urgency=medium
 
   * Team upload.
diff -Nru rust-compiler-builtins-0.1.26/debian/patches/series rust-compiler-builtins-0.1.26/debian/patches/series
--- rust-compiler-builtins-0.1.26/debian/patches/series	1970-01-01 00:00:00.000000000 +0000
+++ rust-compiler-builtins-0.1.26/debian/patches/series	2021-03-24 05:08:41.000000000 +0000
@@ -0,0 +1 @@
+use-llvm_asm.patch
\ No newline at end of file
diff -Nru rust-compiler-builtins-0.1.26/debian/patches/use-llvm_asm.patch rust-compiler-builtins-0.1.26/debian/patches/use-llvm_asm.patch
--- rust-compiler-builtins-0.1.26/debian/patches/use-llvm_asm.patch	1970-01-01 00:00:00.000000000 +0000
+++ rust-compiler-builtins-0.1.26/debian/patches/use-llvm_asm.patch	2021-03-24 05:04:10.000000000 +0000
@@ -0,0 +1,305 @@
+Patch to fix asm related FTBFS by switching from asm! to llvm_asm!
+
+This patch is Based on the upstream commit referenced below with
+non-asm related changes removed.
+
+commit cde22bc180391e75de1c189fe29f442ada86ccde
+Author: Alex Crichton <alex at alexcrichton.com>
+Date:   Wed Apr 29 15:30:10 2020 -0500
+
+diff --git a/examples/intrinsics.rs b/examples/intrinsics.rs
+index 5ceebe1..82762e0 100644
+--- a/examples/intrinsics.rs
++++ b/examples/intrinsics.rs
+@@ -6,7 +6,7 @@
+ #![allow(unused_features)]
+ #![cfg_attr(thumb, no_main)]
+ #![deny(dead_code)]
+-#![feature(asm)]
++#![feature(llvm_asm)]
+ #![feature(lang_items)]
+ #![feature(start)]
+ #![feature(allocator_api)]
+@@ -280,7 +280,7 @@ fn run() {
+ 
+     // A copy of "test::black_box". Used to prevent LLVM from optimizing away the intrinsics during LTO
+     fn bb<T>(dummy: T) -> T {
+-        unsafe { asm!("" : : "r"(&dummy)) }
++        unsafe { llvm_asm!("" : : "r"(&dummy)) }
+         dummy
+     }
+ 
+diff --git a/src/arm.rs b/src/arm.rs
+index 4cf73ef..190bba7 100644
+--- a/src/arm.rs
++++ b/src/arm.rs
+@@ -8,13 +8,15 @@ use core::intrinsics;
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_uidivmod() {
+-    asm!("push {lr}
+-          sub sp, sp, #4
+-          mov r2, sp
+-          bl __udivmodsi4
+-          ldr r1, [sp]
+-          add sp, sp, #4
+-          pop {pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {lr}
++        sub sp, sp, #4
++        mov r2, sp
++        bl __udivmodsi4
++        ldr r1, [sp]
++        add sp, sp, #4
++        pop {pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -22,13 +24,15 @@ pub unsafe fn __aeabi_uidivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_uidivmod() {
+-    asm!("push {lr}
+-          sub sp, sp, #4
+-          mov r2, sp
+-          bl ___udivmodsi4
+-          ldr r1, [sp]
+-          add sp, sp, #4
+-          pop {pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {lr}
++        sub sp, sp, #4
++        mov r2, sp
++        bl ___udivmodsi4
++        ldr r1, [sp]
++        add sp, sp, #4
++        pop {pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -36,15 +40,17 @@ pub unsafe fn __aeabi_uidivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_uldivmod() {
+-    asm!("push {r4, lr}
+-          sub sp, sp, #16
+-          add r4, sp, #8
+-          str r4, [sp]
+-          bl __udivmoddi4
+-          ldr r2, [sp, #8]
+-          ldr r3, [sp, #12]
+-          add sp, sp, #16
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r4, lr}
++        sub sp, sp, #16
++        add r4, sp, #8
++        str r4, [sp]
++        bl __udivmoddi4
++        ldr r2, [sp, #8]
++        ldr r3, [sp, #12]
++        add sp, sp, #16
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -52,15 +58,17 @@ pub unsafe fn __aeabi_uldivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_uldivmod() {
+-    asm!("push {r4, lr}
+-          sub sp, sp, #16
+-          add r4, sp, #8
+-          str r4, [sp]
+-          bl ___udivmoddi4
+-          ldr r2, [sp, #8]
+-          ldr r3, [sp, #12]
+-          add sp, sp, #16
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r4, lr}
++        sub sp, sp, #16
++        add r4, sp, #8
++        str r4, [sp]
++        bl ___udivmoddi4
++        ldr r2, [sp, #8]
++        ldr r3, [sp, #12]
++        add sp, sp, #16
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -68,12 +76,14 @@ pub unsafe fn __aeabi_uldivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_idivmod() {
+-    asm!("push {r0, r1, r4, lr}
+-          bl __aeabi_idiv
+-          pop {r1, r2}
+-          muls r2, r2, r0
+-          subs r1, r1, r2
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r0, r1, r4, lr}
++        bl __aeabi_idiv
++        pop {r1, r2}
++        muls r2, r2, r0
++        subs r1, r1, r2
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -81,12 +91,14 @@ pub unsafe fn __aeabi_idivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_idivmod() {
+-    asm!("push {r0, r1, r4, lr}
+-          bl ___aeabi_idiv
+-          pop {r1, r2}
+-          muls r2, r2, r0
+-          subs r1, r1, r2
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r0, r1, r4, lr}
++        bl ___aeabi_idiv
++        pop {r1, r2}
++        muls r2, r2, r0
++        subs r1, r1, r2
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -94,15 +106,17 @@ pub unsafe fn __aeabi_idivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_ldivmod() {
+-    asm!("push {r4, lr}
+-          sub sp, sp, #16
+-          add r4, sp, #8
+-          str r4, [sp]
+-          bl __divmoddi4
+-          ldr r2, [sp, #8]
+-          ldr r3, [sp, #12]
+-          add sp, sp, #16
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r4, lr}
++        sub sp, sp, #16
++        add r4, sp, #8
++        str r4, [sp]
++        bl __divmoddi4
++        ldr r2, [sp, #8]
++        ldr r3, [sp, #12]
++        add sp, sp, #16
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+@@ -110,15 +124,17 @@ pub unsafe fn __aeabi_ldivmod() {
+ #[naked]
+ #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
+ pub unsafe fn __aeabi_ldivmod() {
+-    asm!("push {r4, lr}
+-          sub sp, sp, #16
+-          add r4, sp, #8
+-          str r4, [sp]
+-          bl ___divmoddi4
+-          ldr r2, [sp, #8]
+-          ldr r3, [sp, #12]
+-          add sp, sp, #16
+-          pop {r4, pc}" ::: "memory" : "volatile");
++    llvm_asm!("
++        push {r4, lr}
++        sub sp, sp, #16
++        add r4, sp, #8
++        str r4, [sp]
++        bl ___divmoddi4
++        ldr r2, [sp, #8]
++        ldr r3, [sp, #12]
++        add sp, sp, #16
++        pop {r4, pc}
++    " ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+ 
+diff --git a/src/lib.rs b/src/lib.rs
+index e57a5ef..0ca770b 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -1,6 +1,6 @@
+ #![cfg_attr(feature = "compiler-builtins", compiler_builtins)]
+ #![feature(abi_unadjusted)]
+-#![feature(asm)]
++#![feature(llvm_asm)]
+ #![feature(global_asm)]
+ #![feature(cfg_target_has_atomic)]
+ #![feature(compiler_builtins)]
+diff --git a/src/x86.rs b/src/x86.rs
+index 035c0a3..5511c45 100644
+--- a/src/x86.rs
++++ b/src/x86.rs
+@@ -12,7 +12,7 @@ use core::intrinsics;
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn ___chkstk_ms() {
+-    asm!("
++    llvm_asm!("
+         push   %ecx
+         push   %eax
+         cmp    $$0x1000,%eax
+@@ -38,7 +38,7 @@ pub unsafe fn ___chkstk_ms() {
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn __alloca() {
+-    asm!("jmp ___chkstk   // Jump to ___chkstk since fallthrough may be unreliable"
++    llvm_asm!("jmp ___chkstk   // Jump to ___chkstk since fallthrough may be unreliable"
+          ::: "memory" : "volatile");
+     intrinsics::unreachable();
+ }
+@@ -47,7 +47,7 @@ pub unsafe fn __alloca() {
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn ___chkstk() {
+-    asm!("
++    llvm_asm!("
+         push   %ecx
+         cmp    $$0x1000,%eax
+         lea    8(%esp),%ecx     // esp before calling this routine -> ecx
+diff --git a/src/x86_64.rs b/src/x86_64.rs
+index 6940f8d..6a0cd56 100644
+--- a/src/x86_64.rs
++++ b/src/x86_64.rs
+@@ -12,7 +12,7 @@ use core::intrinsics;
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn ___chkstk_ms() {
+-    asm!("
++    llvm_asm!("
+         push   %rcx
+         push   %rax
+         cmp    $$0x1000,%rax
+@@ -37,7 +37,7 @@ pub unsafe fn ___chkstk_ms() {
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn __alloca() {
+-    asm!("mov    %rcx,%rax  // x64 _alloca is a normal function with parameter in rcx
++    llvm_asm!("mov    %rcx,%rax  // x64 _alloca is a normal function with parameter in rcx
+           jmp    ___chkstk  // Jump to ___chkstk since fallthrough may be unreliable"
+          ::: "memory" : "volatile");
+     intrinsics::unreachable();
+@@ -47,7 +47,7 @@ pub unsafe fn __alloca() {
+ #[naked]
+ #[no_mangle]
+ pub unsafe fn ___chkstk() {
+-    asm!(
++    llvm_asm!(
+         "
+         push   %rcx
+         cmp    $$0x1000,%rax


More information about the Pkg-rust-maintainers mailing list