Skip to content

Conversation

ivan-aksamentov
Copy link

@ivan-aksamentov ivan-aksamentov commented Nov 11, 2024

Depends on blas-lapack-rs/lapack-sys#15

This replaces hardcoded platform-specific char* types with the opaque types from core::ffi. This is necessary when cross-compiling.

I believe when interacting with C and Fortran, both lax and lapack-sys should not assume integer and pointer types. Current setup is biased towards x86_64 platform, for the most part due to a bug in lapack-sys (see blas-lapack-rs/lapack-sys#15), and it could cause broken builds and undefined behavior on other platforms.

For example, cross compilation build could fail with:

error[E0308]: mismatched types --> /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lax-0.16.0/src/cholesky.rs:30:26 | 30 | $trf(uplo.as_ptr(), &n, AsPtr::as_mut_ptr(a), &n, &mut info); | ---- ^^^^^^^^^^^^^ expected `*const u8`, found `*const i8` | | | arguments to this function are incorrect ... 41 | impl_cholesky_!(c64, lapack_sys::zpotrf_); | ----------------------------------------- in this macro invocation | = note: expected raw pointer `*const u8` found raw pointer `*const i8` note: function defined here --> /workdir/.build/docker-aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/release/build/lapack-sys-5fad11066d38a1a6/out/bindings.rs:12886:12 

Full build log for aarch64-unknown-linux-gnu:
build.log.txt

In this PR I change i8 to core::ffi::c_char - this, for example, resolves to i8 on x86 and to u8 on ARM, but is also universal for any platform rust supports, removing bias towards x86.

Depends on blas-lapack-rs/lapack-sys#15 This replaces hardcoded platform-specific `char*` types with the opaque types from [`core::ffi`](https://doc.rust-lang.org/stable/core/ffi/type.c_char.html). This is necessary when cross-compiling. I believe when interacting with C and Fortran, both `lax` and `lapack-sys` should not assume integer and pointer types. Current setup is biased towards x86_64 platform and it could cause broken builds and undefined behavior on other platforms. For example, cross compilation build could fail with: error[E0308]: mismatched types --> /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lax-0.16.0/src/cholesky.rs:30:26 | 30 | $trf(uplo.as_ptr(), &n, AsPtr::as_mut_ptr(a), &n, &mut info); | ---- ^^^^^^^^^^^^^ expected `*const u8`, found `*const i8` | | | arguments to this function are incorrect ... 41 | impl_cholesky_!(c64, lapack_sys::zpotrf_); | ----------------------------------------- in this macro invocation | = note: expected raw pointer `*const u8` found raw pointer `*const i8` note: function defined here --> /workdir/.build/docker-aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/release/build/lapack-sys-5fad11066d38a1a6/out/bindings.rs:12886:12 Full build log for aarch64-unknown-linux-gnu: [build.log.txt](https://github.com/user-attachments/files/17706011/build.log.txt) In this PR I change `i8` to `core::ffi::c_char` - this, for example, resolves to `i8` on x86 and to `u8` on ARM, but is also universal for any platform rust supports, removing bias towards x86.
@ivan-aksamentov
Copy link
Author

Closing as duplicate to #354

@ivan-aksamentov
Copy link
Author

Reopening, because my version is better - it uses core::ffi::c_char not std.

Either way the root cause is blas-lapack-rs/lapack-sys#15 and it needs to be merged for the thing to not be UB.

@ivan-aksamentov
Copy link
Author

#354 now also uses core::. Closing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
1 participant