@@ -14,7 +14,7 @@ struct Target {
1414
1515impl Target {
1616 fn from_env ( ) -> Self {
17- let little_endian = match env:: var ( "CARGO_CFG_TARGET_LITTLE_ENDIAN " ) . unwrap ( ) . as_str ( ) {
17+ let little_endian = match env:: var ( "CARGO_CFG_TARGET_ENDIAN " ) . unwrap ( ) . as_str ( ) {
1818 "little" => true ,
1919 "big" => false ,
2020 x => panic ! ( "unknown endian {x}" ) ,
@@ -42,11 +42,12 @@ impl Target {
4242
4343fn main ( ) {
4444 println ! ( "cargo:rerun-if-changed=build.rs" ) ;
45- configure_check_cfg ( ) ;
46-
4745 let target = Target :: from_env ( ) ;
4846 let cwd = env:: current_dir ( ) . unwrap ( ) ;
4947
48+ configure_check_cfg ( ) ;
49+ configure_f16_f128 ( & target) ;
50+
5051 println ! ( "cargo:compiler-rt={}" , cwd. join( "compiler-rt" ) . display( ) ) ;
5152
5253 // Activate libm's unstable features to make full use of Nightly.
@@ -259,6 +260,51 @@ fn configure_check_cfg() {
259260 println ! ( "cargo::rustc-check-cfg=cfg(assert_no_panic)" ) ;
260261}
261262
263+ /// Configure whether or not `f16` and `f128` support should be enabled.
264+ fn configure_f16_f128 ( target : & Target ) {
265+ // Set whether or not `f16` and `f128` are supported at a basic level by LLVM. This only means
266+ // that the backend will not crash when using these types. This does not mean that the
267+ // backend does the right thing, or that the platform doesn't have ABI bugs.
268+ //
269+ // We do this here rather than in `rust-lang/rust` because configuring via cargo features is
270+ // not straightforward.
271+ //
272+ // Original source of this list:
273+ // <https://github.com/rust-lang/compiler-builtins/pull/652#issuecomment-2266151350>
274+ let ( f16_ok, f128_ok) = match target. arch . as_str ( ) {
275+ // `f16` and `f128` both crash <https://github.com/llvm/llvm-project/issues/94434>
276+ "arm64ec" => ( false , false ) ,
277+ // `f16` crashes <https://github.com/llvm/llvm-project/issues/50374>
278+ "s390x" => ( false , true ) ,
279+ // `f128` crashes <https://github.com/llvm/llvm-project/issues/96432>
280+ "mips64" | "mips64r6" => ( true , false ) ,
281+ // `f128` crashes <https://github.com/llvm/llvm-project/issues/101545>
282+ "powerpc64" if & target. os == "aix" => ( true , false ) ,
283+ // `f128` crashes <https://github.com/llvm/llvm-project/issues/41838>
284+ "sparc" | "sparcv9" => ( true , false ) ,
285+ // Most everything else works as of LLVM 19
286+ _ => ( true , true ) ,
287+ } ;
288+
289+ // If the feature is set, disable these types.
290+ let disable_both = env:: var_os ( "CARGO_FEATURE_NO_F16_F128" ) . is_some ( ) ;
291+
292+ println ! ( "cargo:warning=f16 {f16_ok} f128 {f128_ok} disable both {disable_both}" ) ;
293+
294+ println ! ( "cargo::rustc-check-cfg=cfg(f16_enabled)" ) ;
295+ println ! ( "cargo::rustc-check-cfg=cfg(f128_enabled)" ) ;
296+
297+ if f16_ok && !disable_both {
298+ println ! ( "cargo::rustc-cfg=f16_enabled" ) ;
299+ println ! ( "cargo:warning=f16 enabled" ) ;
300+ }
301+
302+ if f128_ok && !disable_both {
303+ println ! ( "cargo::rustc-cfg=f128_enabled" ) ;
304+ println ! ( "cargo:warning=f128 enabled" ) ;
305+ }
306+ }
307+
262308#[ cfg( feature = "c" ) ]
263309mod c {
264310 use std:: collections:: { BTreeMap , HashSet } ;
0 commit comments