@@ -51,31 +51,46 @@ impl Target {
5151/// Configure whether or not `f16` and `f128` support should be enabled.
5252pub fn configure_f16_f128 ( target : & Target ) {
5353 // Set whether or not `f16` and `f128` are supported at a basic level by LLVM. This only means
54- // that the backend will not crash when using these types. This does not mean that the
55- // backend does the right thing, or that the platform doesn't have ABI bugs.
54+ // that the backend will not crash when using these types and generates code that can be called
55+ // without crashing (no infinite recursion). This does not mean that the platform doesn't have
56+ // ABI or other bugs.
5657 //
5758 // We do this here rather than in `rust-lang/rust` because configuring via cargo features is
5859 // not straightforward.
5960 //
6061 // Original source of this list:
6162 // <https://github.com/rust-lang/compiler-builtins/pull/652#issuecomment-2266151350>
62- let ( f16_ok, f128_ok) = match target. arch . as_str ( ) {
63- // `f16` and `f128` both crash <https://github.com/llvm/llvm-project/issues/94434>
64- "arm64ec" => ( false , false ) ,
65- // `f16` crashes <https://github.com/llvm/llvm-project/issues/50374>
66- "s390x" => ( false , true ) ,
67- // FIXME(llvm): `f16` test failures fixed by <https://github.com/llvm/llvm-project/pull/107791>
68- "loongarch64" => ( false , true ) ,
69- // `f128` crashes <https://github.com/llvm/llvm-project/issues/96432>
70- "mips64" | "mips64r6" => ( true , false ) ,
71- // `f128` crashes <https://github.com/llvm/llvm-project/issues/101545>
72- "powerpc64" if & target. os == "aix" => ( true , false ) ,
73- // `f128` crashes <https://github.com/llvm/llvm-project/issues/41838>
74- "sparc" => ( true , false ) ,
75- // `f16` miscompiles <https://github.com/llvm/llvm-project/issues/96438>
76- "wasm32" | "wasm64" => ( false , true ) ,
63+ let f16_enabled = match target. arch . as_str ( ) {
64+ // Unsupported <https://github.com/llvm/llvm-project/issues/94434>
65+ "arm64ec" => false ,
66+ // Selection failure <https://github.com/llvm/llvm-project/issues/50374>
67+ "s390x" => false ,
68+ // Infinite recursion <https://github.com/llvm/llvm-project/issues/97981>
69+ // FIXME(llvm): loongarch fixed by <https://github.com/llvm/llvm-project/pull/107791>
70+ "csky" => false ,
71+ "hexagon" => false ,
72+ "loongarch64" => false ,
73+ "mips" | "mips64" | "mips32r6" | "mips64r6" => false ,
74+ "powerpc" | "powerpc64" => false ,
75+ "sparc" | "sparc64" => false ,
76+ "wasm32" | "wasm64" => false ,
7777 // Most everything else works as of LLVM 19
78- _ => ( true , true ) ,
78+ _ => true ,
79+ } ;
80+
81+ let f128_enabled = match target. arch . as_str ( ) {
82+ // Unsupported <https://github.com/llvm/llvm-project/issues/94434>
83+ "arm64ec" => false ,
84+ // Selection failure <https://github.com/llvm/llvm-project/issues/96432>
85+ "mips64" | "mips64r6" => false ,
86+ // Selection failure <https://github.com/llvm/llvm-project/issues/95471>
87+ "nvptx64" => false ,
88+ // Selection failure <https://github.com/llvm/llvm-project/issues/101545>
89+ "powerpc64" if & target. os == "aix" => false ,
90+ // Selection failure <https://github.com/llvm/llvm-project/issues/41838>
91+ "sparc" => false ,
92+ // Most everything else works as of LLVM 19
93+ _ => true ,
7994 } ;
8095
8196 // If the feature is set, disable these types.
@@ -84,11 +99,11 @@ pub fn configure_f16_f128(target: &Target) {
8499 println ! ( "cargo::rustc-check-cfg=cfg(f16_enabled)" ) ;
85100 println ! ( "cargo::rustc-check-cfg=cfg(f128_enabled)" ) ;
86101
87- if f16_ok && !disable_both {
102+ if f16_enabled && !disable_both {
88103 println ! ( "cargo::rustc-cfg=f16_enabled" ) ;
89104 }
90105
91- if f128_ok && !disable_both {
106+ if f128_enabled && !disable_both {
92107 println ! ( "cargo::rustc-cfg=f128_enabled" ) ;
93108 }
94109}
0 commit comments