Fix relibc strtold linkage for C++ consumers
Keep the relibc overlay consistent so the generated stdlib header preserves C linkage for strtold and the existing toolchain can still satisfy stale C++ callers while it is refreshed. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
diff --git a/src/c/stdlib.c b/src/c/stdlib.c
|
||||
index 62e98108..a9c72392 100644
|
||||
--- a/src/c/stdlib.c
|
||||
+++ b/src/c/stdlib.c
|
||||
@@ -4,6 +4,13 @@ long double strtold(const char *nptr, char **endptr) {
|
||||
return (long double)strtod(nptr, endptr);
|
||||
}
|
||||
|
||||
+long double relibc_compat_cpp_strtold(const char *nptr, char **endptr)
|
||||
+ __asm__("_Z7strtoldPKcPPc");
|
||||
+
|
||||
+long double relibc_compat_cpp_strtold(const char *nptr, char **endptr) {
|
||||
+ return strtold(nptr, endptr);
|
||||
+}
|
||||
+
|
||||
double relibc_ldtod(const long double* val) {
|
||||
return (double)(*val);
|
||||
}
|
||||
diff --git a/src/header/stdlib/cbindgen.toml b/src/header/stdlib/cbindgen.toml
|
||||
index 2e02e68a..07867c32 100644
|
||||
--- a/src/header/stdlib/cbindgen.toml
|
||||
+++ b/src/header/stdlib/cbindgen.toml
|
||||
@@ -1,7 +1,20 @@
|
||||
sys_includes = ["stddef.h", "alloca.h", "wchar.h", "features.h"]
|
||||
include_guard = "_RELIBC_STDLIB_H"
|
||||
trailer = """
|
||||
+#ifndef _RELIBC_STDLIB_STRTOLD_H
|
||||
+#define _RELIBC_STDLIB_STRTOLD_H
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+extern \"C\" {
|
||||
+#endif
|
||||
+
|
||||
long double strtold(const char *nptr, char **endptr);
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
"""
|
||||
language = "C"
|
||||
style = "Type"
|
||||
@@ -0,0 +1,157 @@
|
||||
diff --git a/src/c/stdlib.c b/src/c/stdlib.c
|
||||
index 62e98108..a9c72392 100644
|
||||
--- a/src/c/stdlib.c
|
||||
+++ b/src/c/stdlib.c
|
||||
@@ -4,6 +4,13 @@ long double strtold(const char *nptr, char **endptr) {
|
||||
return (long double)strtod(nptr, endptr);
|
||||
}
|
||||
|
||||
+long double relibc_compat_cpp_strtold(const char *nptr, char **endptr)
|
||||
+ __asm__("_Z7strtoldPKcPPc");
|
||||
+
|
||||
+long double relibc_compat_cpp_strtold(const char *nptr, char **endptr) {
|
||||
+ return strtold(nptr, endptr);
|
||||
+}
|
||||
+
|
||||
double relibc_ldtod(const long double* val) {
|
||||
return (double)(*val);
|
||||
}
|
||||
diff --git a/src/header/fcntl/mod.rs b/src/header/fcntl/mod.rs
|
||||
index 6a4db2fa..82484375 100644
|
||||
--- a/src/header/fcntl/mod.rs
|
||||
+++ b/src/header/fcntl/mod.rs
|
||||
@@ -7,6 +7,7 @@ use core::num::NonZeroU64;
|
||||
use crate::{
|
||||
c_str::CStr,
|
||||
error::ResultExt,
|
||||
+ header::unistd::{close, dup},
|
||||
platform::{
|
||||
Pal, Sys,
|
||||
types::{c_char, c_int, c_short, c_ulonglong, mode_t, off_t, pid_t},
|
||||
@@ -74,6 +75,18 @@ pub unsafe extern "C" fn fcntl(fildes: c_int, cmd: c_int, mut __valist: ...) ->
|
||||
_ => 0,
|
||||
};
|
||||
|
||||
+ if cmd == F_DUPFD_CLOEXEC {
|
||||
+ let new_fd = dup(fildes);
|
||||
+ if new_fd < 0 {
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if unsafe { fcntl(new_fd, F_SETFD, FD_CLOEXEC as c_ulonglong) } < 0 {
|
||||
+ let _ = close(new_fd);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return new_fd;
|
||||
+ }
|
||||
+
|
||||
Sys::fcntl(fildes, cmd, arg).or_minus_one_errno()
|
||||
}
|
||||
|
||||
diff --git a/src/header/mod.rs b/src/header/mod.rs
|
||||
index d3a7ba75..72f82084 100644
|
||||
--- a/src/header/mod.rs
|
||||
+++ b/src/header/mod.rs
|
||||
@@ -89,20 +89,23 @@ pub mod strings;
|
||||
// TODO: stropts.h (deprecated)
|
||||
pub mod sys_auxv;
|
||||
pub mod sys_epoll;
|
||||
+pub mod sys_eventfd;
|
||||
pub mod sys_file;
|
||||
pub mod sys_ioctl;
|
||||
-// TODO: sys/ipc.h
|
||||
+pub mod sys_ipc;
|
||||
pub mod sys_mman;
|
||||
// TODO: sys/msg.h
|
||||
pub mod sys_ptrace;
|
||||
pub mod sys_resource;
|
||||
pub mod sys_select;
|
||||
-// TODO: sys/sem.h
|
||||
-// TODO: sys/shm.h
|
||||
+pub mod sys_sem;
|
||||
+pub mod sys_shm;
|
||||
pub mod sys_socket;
|
||||
pub mod sys_stat;
|
||||
pub mod sys_statvfs;
|
||||
pub mod sys_time;
|
||||
+pub mod sys_timerfd;
|
||||
+pub mod sys_signalfd;
|
||||
#[deprecated]
|
||||
pub mod sys_timeb;
|
||||
//pub mod sys_times;
|
||||
diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs
|
||||
index 858d5ed4..5b5172aa 100644
|
||||
--- a/src/header/signal/mod.rs
|
||||
+++ b/src/header/signal/mod.rs
|
||||
@@ -32,6 +32,9 @@ pub mod sys;
|
||||
#[path = "redox.rs"]
|
||||
pub mod sys;
|
||||
|
||||
+mod signalfd;
|
||||
+pub use self::signalfd::*;
|
||||
+
|
||||
type SigSet = BitSet<[u64; 1]>;
|
||||
|
||||
pub(crate) const SIG_DFL: usize = 0;
|
||||
diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs
|
||||
index 069d4556..f7fe791a 100644
|
||||
--- a/src/header/stdio/mod.rs
|
||||
+++ b/src/header/stdio/mod.rs
|
||||
@@ -47,6 +47,9 @@ mod default;
|
||||
pub use self::getdelim::*;
|
||||
mod getdelim;
|
||||
|
||||
+pub use self::open_memstream::*;
|
||||
+mod open_memstream;
|
||||
+
|
||||
mod ext;
|
||||
mod helpers;
|
||||
pub mod printf;
|
||||
diff --git a/src/header/stdlib/cbindgen.toml b/src/header/stdlib/cbindgen.toml
|
||||
index 2e02e68a..07867c32 100644
|
||||
--- a/src/header/stdlib/cbindgen.toml
|
||||
+++ b/src/header/stdlib/cbindgen.toml
|
||||
@@ -1,7 +1,20 @@
|
||||
sys_includes = ["stddef.h", "alloca.h", "wchar.h", "features.h"]
|
||||
include_guard = "_RELIBC_STDLIB_H"
|
||||
trailer = """
|
||||
+#ifndef _RELIBC_STDLIB_STRTOLD_H
|
||||
+#define _RELIBC_STDLIB_STRTOLD_H
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+extern \"C\" {
|
||||
+#endif
|
||||
+
|
||||
long double strtold(const char *nptr, char **endptr);
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
"""
|
||||
language = "C"
|
||||
style = "Type"
|
||||
diff --git a/src/header/sys_socket/constants.rs b/src/header/sys_socket/constants.rs
|
||||
index ec42889b..bebfc7b2 100644
|
||||
--- a/src/header/sys_socket/constants.rs
|
||||
+++ b/src/header/sys_socket/constants.rs
|
||||
@@ -51,6 +51,7 @@ pub const MSG_TRUNC: c_int = 32;
|
||||
pub const MSG_DONTWAIT: c_int = 64;
|
||||
pub const MSG_WAITALL: c_int = 256;
|
||||
pub const MSG_CMSG_CLOEXEC: c_int = 0x40000000;
|
||||
+pub const MSG_NOSIGNAL: c_int = 0x4000;
|
||||
|
||||
pub const IP_ADD_SOURCE_MEMBERSHIP: c_int = 70;
|
||||
pub const IP_DROP_SOURCE_MEMBERSHIP: c_int = 71;
|
||||
diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs
|
||||
index 1c0c6d74..73a7f2e7 100644
|
||||
--- a/src/header/sys_socket/mod.rs
|
||||
+++ b/src/header/sys_socket/mod.rs
|
||||
@@ -334,6 +334,7 @@ pub unsafe extern "C" fn recvfrom(
|
||||
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/recvmsg.html>.
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn recvmsg(socket: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t {
|
||||
+ let flags = flags & !constants::MSG_NOSIGNAL;
|
||||
unsafe { Sys::recvmsg(socket, msg, flags) }
|
||||
.map(|r| r as ssize_t)
|
||||
.or_minus_one_errno()
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../local/patches/relibc/redox.patch
|
||||
Reference in New Issue
Block a user