Skip to content

Commit 5f074f3

Browse files
nickdesaulnierstorvalds
authored andcommitted
lib/string.c: implement a basic bcmp
A recent optimization in Clang (r355672) lowers comparisons of the return value of memcmp against zero to comparisons of the return value of bcmp against zero. This helps some platforms that implement bcmp more efficiently than memcmp. glibc simply aliases bcmp to memcmp, but an optimized implementation is in the works. This results in linkage failures for all targets with Clang due to the undefined symbol. For now, just implement bcmp as a tailcail to memcmp to unbreak the build. This routine can be further optimized in the future. Other ideas discussed: * A weak alias was discussed, but breaks for architectures that define their own implementations of memcmp since aliases to declarations are not permitted (only definitions). Arch-specific memcmp implementations typically declare memcmp in C headers, but implement them in assembly. * -ffreestanding also is used sporadically throughout the kernel. * -fno-builtin-bcmp doesn't work when doing LTO. Link: https://bugs.llvm.org/show_bug.cgi?id=41035 Link: https://code.woboq.org/userspace/glibc/string/memcmp.c.html#bcmp Link: llvm/llvm-project@8e16d73 Link: ClangBuiltLinux/linux#416 Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Nick Desaulniers <[email protected]> Reported-by: Nathan Chancellor <[email protected]> Reported-by: Adhemerval Zanella <[email protected]> Suggested-by: Arnd Bergmann <[email protected]> Suggested-by: James Y Knight <[email protected]> Suggested-by: Masahiro Yamada <[email protected]> Suggested-by: Nathan Chancellor <[email protected]> Suggested-by: Rasmus Villemoes <[email protected]> Acked-by: Steven Rostedt (VMware) <[email protected]> Reviewed-by: Nathan Chancellor <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Reviewed-by: Masahiro Yamada <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Cc: David Laight <[email protected]> Cc: Rasmus Villemoes <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Dan Williams <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7f46774 commit 5f074f3

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

include/linux/string.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ extern void * memscan(void *,int,__kernel_size_t);
150150
#ifndef __HAVE_ARCH_MEMCMP
151151
extern int memcmp(const void *,const void *,__kernel_size_t);
152152
#endif
153+
#ifndef __HAVE_ARCH_BCMP
154+
extern int bcmp(const void *,const void *,__kernel_size_t);
155+
#endif
153156
#ifndef __HAVE_ARCH_MEMCHR
154157
extern void * memchr(const void *,int,__kernel_size_t);
155158
#endif

lib/string.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,26 @@ __visible int memcmp(const void *cs, const void *ct, size_t count)
866866
EXPORT_SYMBOL(memcmp);
867867
#endif
868868

869+
#ifndef __HAVE_ARCH_BCMP
870+
/**
871+
* bcmp - returns 0 if and only if the buffers have identical contents.
872+
* @a: pointer to first buffer.
873+
* @b: pointer to second buffer.
874+
* @len: size of buffers.
875+
*
876+
* The sign or magnitude of a non-zero return value has no particular
877+
* meaning, and architectures may implement their own more efficient bcmp(). So
878+
* while this particular implementation is a simple (tail) call to memcmp, do
879+
* not rely on anything but whether the return value is zero or non-zero.
880+
*/
881+
#undef bcmp
882+
int bcmp(const void *a, const void *b, size_t len)
883+
{
884+
return memcmp(a, b, len);
885+
}
886+
EXPORT_SYMBOL(bcmp);
887+
#endif
888+
869889
#ifndef __HAVE_ARCH_MEMSCAN
870890
/**
871891
* memscan - Find a character in an area of memory.

0 commit comments

Comments
 (0)