From 7f535824f5ebeb0774d6c3185e89cf76a3a5d65e Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Fri, 18 Mar 2022 18:18:28 +0300 Subject: [PATCH] Provide an implementation of `strlen` to be used as a fallback --- library/compiler-builtins/src/lib.rs | 1 + library/compiler-builtins/src/mem/mod.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/library/compiler-builtins/src/lib.rs b/library/compiler-builtins/src/lib.rs index c3eefbc03622..9ca72bc20f4e 100644 --- a/library/compiler-builtins/src/lib.rs +++ b/library/compiler-builtins/src/lib.rs @@ -4,6 +4,7 @@ #![cfg_attr(not(feature = "no-asm"), feature(global_asm))] #![feature(cfg_target_has_atomic)] #![feature(compiler_builtins)] +#![feature(core_ffi_c)] #![feature(core_intrinsics)] #![feature(lang_items)] #![feature(linkage)] diff --git a/library/compiler-builtins/src/mem/mod.rs b/library/compiler-builtins/src/mem/mod.rs index dce4d87e0a5c..a551138612bb 100644 --- a/library/compiler-builtins/src/mem/mod.rs +++ b/library/compiler-builtins/src/mem/mod.rs @@ -68,6 +68,18 @@ intrinsics! { pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { memcmp(s1, s2, n) } + + #[mem_builtin] + #[cfg_attr(not(all(target_os = "windows", target_env = "gnu")), linkage = "weak")] + pub unsafe extern "C" fn strlen(s: *const core::ffi::c_char) -> usize { + let mut n = 0; + let mut s = s; + while *s != 0 { + n += 1; + s = s.offset(1); + } + n + } } // `bytes` must be a multiple of `mem::size_of::()`