@@ -14,7 +14,7 @@ struct Target {
14
14
15
15
impl Target {
16
16
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 ( ) {
18
18
"little" => true ,
19
19
"big" => false ,
20
20
x => panic ! ( "unknown endian {x}" ) ,
@@ -42,11 +42,12 @@ impl Target {
42
42
43
43
fn main ( ) {
44
44
println ! ( "cargo:rerun-if-changed=build.rs" ) ;
45
- configure_check_cfg ( ) ;
46
-
47
45
let target = Target :: from_env ( ) ;
48
46
let cwd = env:: current_dir ( ) . unwrap ( ) ;
49
47
48
+ configure_check_cfg ( ) ;
49
+ configure_f16_f128 ( & target) ;
50
+
50
51
println ! ( "cargo:compiler-rt={}" , cwd. join( "compiler-rt" ) . display( ) ) ;
51
52
52
53
// Activate libm's unstable features to make full use of Nightly.
@@ -259,6 +260,51 @@ fn configure_check_cfg() {
259
260
println ! ( "cargo::rustc-check-cfg=cfg(assert_no_panic)" ) ;
260
261
}
261
262
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
+
262
308
#[ cfg( feature = "c" ) ]
263
309
mod c {
264
310
use std:: collections:: { BTreeMap , HashSet } ;
0 commit comments