From eb3b93d14ad1c163a862098f1cbcd7c293985712 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 12 Jan 2024 12:21:20 -0700 Subject: [PATCH] Define strtold in C until Rust and cbindgen can use f128 --- Cargo.lock | 14 ++++++++++++-- Cargo.toml | 3 +++ build.rs | 38 ++++++++++++++++++++++++++++++++++++++ include/bits/stdlib.h | 4 +--- src/c/stdlib.c | 5 +++++ 5 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 build.rs create mode 100644 src/c/stdlib.c diff --git a/Cargo.lock b/Cargo.lock index e3a5979b18..f4af0254dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + [[package]] name = "crt0" version = "0.1.0" @@ -56,9 +65,9 @@ version = "0.1.0" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "log" @@ -225,6 +234,7 @@ version = "0.2.5" dependencies = [ "bitflags", "cbitset", + "cc", "dlmalloc", "goblin", "libc", diff --git a/Cargo.toml b/Cargo.toml index 9ac37b223b..66ea8f2454 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,9 @@ crate-type = ["staticlib"] members = ["src/crt0", "src/crti", "src/crtn", "src/ld_so", "src/platform/redox/redox-exec"] exclude = ["ralloc", "tests", "dlmalloc-rs"] +[build-dependencies] +cc = "1" + [dependencies] bitflags = "2" cbitset = "0.2" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000000..154c0527c6 --- /dev/null +++ b/build.rs @@ -0,0 +1,38 @@ +extern crate cc; + +use std::{env, fs}; + +fn get_target() -> String { + env::var("TARGET").unwrap_or( + option_env!("TARGET").map_or("x86_64-unknown-redox".to_string(), |x| x.to_string()), + ) +} + +fn main() { + let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + let target = get_target(); + + println!("cargo:rerun-if-changed=src/c"); + + let mut cc_builder = &mut cc::Build::new(); + + cc_builder = cc_builder + .flag("-nostdinc") + .flag("-nostdlib"); + + if target.starts_with("aarch64") { + cc_builder = cc_builder.flag("-mno-outline-atomics") + } + + cc_builder + .flag("-fno-stack-protector") + .flag("-Wno-expansion-to-defined") + .files( + fs::read_dir("src/c") + .expect("src/c directory missing") + .map(|res| res.expect("read_dir error").path()), + ) + .compile("relibc_c"); + + println!("cargo:rustc-link-lib=static=relibc_c"); +} diff --git a/include/bits/stdlib.h b/include/bits/stdlib.h index 45bb7a37e8..8d639cef38 100644 --- a/include/bits/stdlib.h +++ b/include/bits/stdlib.h @@ -5,9 +5,7 @@ extern "C" { #endif -long double strtold(const char *nptr, char **endptr) { - return (long double)strtod(nptr, endptr); -} +long double strtold(const char *nptr, char **endptr); #ifdef __cplusplus } // extern "C" diff --git a/src/c/stdlib.c b/src/c/stdlib.c new file mode 100644 index 0000000000..39e4fb0f44 --- /dev/null +++ b/src/c/stdlib.c @@ -0,0 +1,5 @@ +double strtod(const char *nptr, char **endptr); + +long double strtold(const char *nptr, char **endptr) { + return (long double)strtod(nptr, endptr); +}