Add build.rs config for reliable f16
and f128
· model-checking/verify-rust-std@b0e0503 (original) (raw)
`@@ -7,6 +7,10 @@ fn main() {
`
7
7
`let target_vendor =
`
8
8
` env::var("CARGO_CFG_TARGET_VENDOR").expect("CARGO_CFG_TARGET_VENDOR was not set");
`
9
9
`let target_env = env::var("CARGO_CFG_TARGET_ENV").expect("CARGO_CFG_TARGET_ENV was not set");
`
``
10
`+
let target_pointer_width: u32 = env::var("CARGO_CFG_TARGET_POINTER_WIDTH")
`
``
11
`+
.expect("CARGO_CFG_TARGET_POINTER_WIDTH was not set")
`
``
12
`+
.parse()
`
``
13
`+
.unwrap();
`
10
14
``
11
15
`println!("cargo:rustc-check-cfg=cfg(netbsd10)");
`
12
16
`if target_os == "netbsd" && env::var("RUSTC_STD_NETBSD10").is_ok() {
`
`@@ -70,4 +74,62 @@ fn main() {
`
70
74
`println!("cargo:rustc-cfg=backtrace_in_libstd");
`
71
75
``
72
76
`println!("cargo:rustc-env=STD_ENV_ARCH={}", env::var("CARGO_CFG_TARGET_ARCH").unwrap());
`
``
77
+
``
78
`+
// Emit these on platforms that have no known ABI bugs, LLVM selection bugs, lowering bugs,
`
``
79
`+
// missing symbols, or other problems, to determine when tests get run.
`
``
80
`+
// If more broken platforms are found, please update the tracking issue at
`
``
81
`+
// https://github.com/rust-lang/rust/issues/116909
`
``
82
`+
//
`
``
83
`+
// Some of these match arms are redundant; the goal is to separate reasons that the type is
`
``
84
`+
// unreliable, even when multiple reasons might fail the same platform.
`
``
85
`+
println!("cargo:rustc-check-cfg=cfg(reliable_f16)");
`
``
86
`+
println!("cargo:rustc-check-cfg=cfg(reliable_f128)");
`
``
87
+
``
88
`+
let has_reliable_f16 = match (target_arch.as_str(), target_os.as_str()) {
`
``
89
`+
// Selection failure until recent LLVM https://github.com/llvm/llvm-project/issues/93894
`
``
90
`+
// FIXME(llvm19): can probably be removed at the version bump
`
``
91
`+
("loongarch64", _) => false,
`
``
92
`+
// Selection failure https://github.com/llvm/llvm-project/issues/50374
`
``
93
`+
("s390x", _) => false,
`
``
94
`+
// Unsupported https://github.com/llvm/llvm-project/issues/94434
`
``
95
`+
("arm64ec", _) => false,
`
``
96
`+
// MinGW ABI bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115054
`
``
97
`+
("x86", "windows") => false,
`
``
98
`+
// x86 has ABI bugs that show up with optimizations. This should be partially fixed with
`
``
99
`+
// the compiler-builtins update. https://github.com/rust-lang/rust/issues/123885
`
``
100
`+
("x86" | "x86_64", _) => false,
`
``
101
`` +
// Missing __gnu_h2f_ieee
and __gnu_f2h_ieee
``
``
102
`+
("powerpc" | "powerpc64" | "powerpc64le", _) => false,
`
``
103
`` +
// Missing __extendhfsf
and __truncsfhf
``
``
104
`+
("riscv32" | "riscv64", _) => false,
`
``
105
`` +
// Most OSs are missing __extendhfsf
and __truncsfhf
``
``
106
`+
(_, "linux" | "macos") => true,
`
``
107
`+
// Almost all OSs besides Linux and MacOS are missing symbols until compiler-builtins can
`
``
108
`+
// be updated. https://github.com/rust-lang/rust/pull/125016 will get some of these, the
`
``
109
`+
// next CB update should get the rest.
`
``
110
`+
_ => false,
`
``
111
`+
};
`
``
112
+
``
113
`+
let has_reliable_f128 = match (target_arch.as_str(), target_os.as_str()) {
`
``
114
`+
// Unsupported https://github.com/llvm/llvm-project/issues/94434
`
``
115
`+
("arm64ec", _) => false,
`
``
116
`+
// ABI and precision bugs https://github.com/rust-lang/rust/issues/125109
`
``
117
`+
// https://github.com/rust-lang/rust/issues/125102
`
``
118
`+
("powerpc" | "powerpc64", _) => false,
`
``
119
`+
// Selection bug https://github.com/llvm/llvm-project/issues/95471
`
``
120
`+
("nvptx64", _) => false,
`
``
121
`+
// ABI unsupported https://github.com/llvm/llvm-project/issues/41838
`
``
122
`+
("sparc", _) => false,
`
``
123
`+
// 64-bit Linux is about the only platform to have f128 symbols by default
`
``
124
`+
(_, "linux") if target_pointer_width == 64 => true,
`
``
125
`+
// Same as for f16, except MacOS is also missing f128 symbols.
`
``
126
`+
_ => false,
`
``
127
`+
};
`
``
128
+
``
129
`+
if has_reliable_f16 {
`
``
130
`+
println!("cargo:rustc-cfg=reliable_f16");
`
``
131
`+
}
`
``
132
`+
if has_reliable_f128 {
`
``
133
`+
println!("cargo:rustc-cfg=reliable_f128");
`
``
134
`+
}
`
73
135
`}
`