Skip to content

Commit 514b387

Browse files
committed
Auto merge of #90007 - xfix:inline-cstr-from-str, r=kennytm
Inline CStr::from_ptr Inlining this function is valuable, as it allows LLVM to apply `strlen`-specific optimizations without having to enable LTO. For instance, the following function: ```rust pub fn f(p: *const c_char) -> Option<u8> { unsafe { CStr::from_ptr(p) }.to_bytes().get(0).copied() } ``` Looks like this if `CStr::from_ptr` is allowed to be inlined. ```asm before: push rax call qword ptr [rip + std::ffi::c_str::CStr::from_ptr@GOTPCREL] mov rcx, rax cmp rdx, 1 sete dl test rax, rax sete al or al, dl jne .LBB1_2 mov dl, byte ptr [rcx] .LBB1_2: xor al, 1 pop rcx ret after: mov dl, byte ptr [rdi] test dl, dl setne al ret ``` Note that optimization turned this from O(N) to O(1) in terms of performance, as LLVM knows that it doesn't really need to call `strlen` to determine whether a string is empty or not.
2 parents 0119879 + 86c309c commit 514b387

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

library/std/src/ffi/c_str.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,7 @@ impl CStr {
11711171
/// }
11721172
/// # }
11731173
/// ```
1174+
#[inline]
11741175
#[must_use]
11751176
#[stable(feature = "rust1", since = "1.0.0")]
11761177
pub unsafe fn from_ptr<'a>(ptr: *const c_char) -> &'a CStr {

0 commit comments

Comments
 (0)