[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <17ed9bf5-64da-418e-b40e-6e3d40c67769@t-8ch.de>
Date: Sat, 10 Aug 2024 18:45:19 +0200
From: Thomas Weißschuh <linux@...ssschuh.net>
To: Willy Tarreau <w@....eu>
Cc: Ammar Faizi <ammarfaizi2@...weeb.org>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 3/3] tools/nolibc: x86_64: wrap asm functions in functions
On 2024-08-10 18:04:36+0000, Thomas Weißschuh wrote:
> On 2024-08-10 16:35:56+0000, Willy Tarreau wrote:
<snip>
> > Also I'm wondering why there are errors about memcpy and memmove being
> > already defined with -flto, because these ones are marked "weak". Maybe
> > we need to add something else, that gcc emits with the functions when
> > using lto ?
>
> I think normally .weak would only be resolved by the linker.
> What happens here is that the assembler is already presented with
> duplicate definitions which it is not prepared to handle.
> (See below for an example)
>
> It works on gcc without -flto and on clang with and without -flto.
> It seems like a compiler bug to me. If you agree I'll open a ticket
> against GCC.
> Then we can fix only the label to make it work on clang and wait for a
> fixed GCC.
Iff we really want to support it, we could do use naked where available
and fall back to toplevel asm otherwise.
This should work on newer compilers and older ones without -flto.
It looks horrible though.
#define NOLIBC_ARCH_HAS_MEMSET
void *memset(void *dst, int c, size_t len);
#if __nolibc_has_attribute(naked)
__attribute__((weak,naked))
void *memset(void *dst __attribute__((unused)), int c __attribute__((unused)), size_t len __attribute__((unused))) {
#else
__asm__ (
".section .text.nolibc_memset\n"
".weak memset\n"
"memset:\n"
);
#endif
__asm__ (
"xchgl %eax, %esi\n\t"
"movq %rdx, %rcx\n\t"
"pushq %rdi\n\t"
"rep stosb\n\t"
"popq %rax\n\t"
"retq\n"
);
#if __nolibc_has_attribute(naked)
}
#endif
(Or some impenetrable macro wrapper abstraction thereof)
The memcpy / memmove combination could be split up into one real
function and one C inline wrapper and then the same pattern would apply.
But to be honest I'd be fine with not supporting -flto on GCC.
Thomas
Powered by blists - more mailing lists