* Re: cacheflush.2
[not found] ` <5257a883-29f0-6eaa-5708-d1f47356a57a@gmx.de>
@ 2020-12-09 19:15 ` Alejandro Colomar (man-pages)
2020-12-11 18:14 ` cacheflush.2 Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-09 19:15 UTC (permalink / raw)
To: Heinrich Schuchardt, Michael Kerrisk (man-pages)
Cc: linux-man, gcc, cfe-users
Hi Heinrich,
It looks like a bug (or at least an undocumented divergence from GCC) in
Clang/LLVM. Or I couldn't find the documentation for it.
Clang uses 'char *':
https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
GCC uses 'void *':
https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
I CCd Clang and GCC lists; maybe they know about that divergence.
Cheers,
Alex
On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>> Hi Heinrich & Michael,
>>
>> What about the following?:
>>
>> [
>> NOTES
>> GCC provides a similar function, which may be useful on archi‐
>> tectures that lack this system call:
>>
>> void __builtin___clear_cache(void *begin, void *end);
>> ]
>
> I just checked building with Clang/LLVM. There the arguments are of type
> (char *). See the following error output:
>
> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
> 'unsigned char *') to parameter of type 'char *' converts between
> pointers to integer types with different sign [-Werror,-Wpointer-sign]
> + __builtin___clear_cache(state->ram_buf,
> + ^~~~~~~~~~~~~~
> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
> 'unsigned char *') to parameter of type 'char *' converts between
> pointers to integer types with different sign [-Werror,-Wpointer-sign]
> + state->ram_buf + state->ram_size);
> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Best regards
>
> Heinrich
>
>>
>> Cheers,
>>
>> Alex
>>
>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>> Hello Michael,
>>>
>>> function cacheflush() does not exist on many architectures.
>>>
>>> It would have saved me a lot of time if the man-page had referenced
>>> GCC's
>>>
>>> void __builtin___clear_cache(void *begin, void *end)
>>>
>>> Maybe you can add it to NOTES.
>>>
>>> Best regards
>>>
>>> heirnich
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; http://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* RFC v2: Re: cacheflush.2
[not found] ` <747d56e0-c102-ab40-add4-530a48a43a4d@gmx.de>
@ 2020-12-10 20:56 ` Alejandro Colomar (man-pages)
2020-12-11 8:15 ` Michael Kerrisk (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-10 20:56 UTC (permalink / raw)
To: Heinrich Schuchardt, Dave Martin
Cc: Michael Kerrisk (man-pages), linux-man, gcc, cfe-users
Hi all,
v2:
[
NOTES
Unless you need the finer grained control that this system
call provides, you probably want to use the GCC built-in
function __builtin___clear_cache(), which provides a more
portable interface:
void __builtin___clear_cache(void *begin, void *end);
]
If you like it, I'll send the patch.
BTW, I'll also have a look and document the different prototypes for
cacheflush(2).
Thanks,
Alex
On 12/10/20 8:20 PM, Heinrich Schuchardt wrote:
> On 12/10/20 7:17 PM, Dave Martin wrote:
>> On Wed, Dec 09, 2020 at 07:34:09PM +0100, Alejandro Colomar
>> (man-pages) wrote:
>>> Hi Heinrich & Michael,
>>>
>>> What about the following?:
>>>
>>> [
>>> NOTES
>>> GCC provides a similar function, which may be useful on archi‐
>>> tectures that lack this system call:
>>>
>>> void __builtin___clear_cache(void *begin, void *end);
>>> ]
>>>
>>> Cheers,
>>>
>>> Alex
>>
>> Maybe we should discourage people from calling the cacheflush syscall?
>>
>> I think that people shouldn't be using the syscall unless they really
>> need the finer grained control it provides, and are prepared to take a
>> hit to portability.
>>
>> (On arches where userspace is allowed to do cache flushing directly,
>> __builtin___clear_cache() should transparently do the right thing, with
>> no syscall overhead -- if not, that's probably a bug in the toolchain or
>> compiler support library.)
>
> What the compiler builtin does depends on the architecture (e.g. nothing
> for x86, cacheflush() for MIPS, a private syscall (0xf0002) on ARM,
> assembly code on ARM64, ...) and on the the operating system (Linux,
> BSD, OS X). For portable code the builtin is really the best choice.
>
> Best regards
>
> Heinrich
>
>>
>> [...]
>>
>> Cheers
>> ---Dave
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: RFC v2: Re: cacheflush.2
2020-12-10 20:56 ` RFC v2: cacheflush.2 Alejandro Colomar (man-pages)
@ 2020-12-11 8:15 ` Michael Kerrisk (man-pages)
2020-12-11 18:02 ` Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Michael Kerrisk (man-pages) @ 2020-12-11 8:15 UTC (permalink / raw)
To: Alejandro Colomar (man-pages), Heinrich Schuchardt, Dave Martin
Cc: mtk.manpages, linux-man, gcc, cfe-users
i Alex,
On 12/10/20 9:56 PM, Alejandro Colomar (man-pages) wrote:
> Hi all,
>
> v2:
>
> [
> NOTES
> Unless you need the finer grained control that this system
> call provides, you probably want to use the GCC built-in
> function __builtin___clear_cache(), which provides a more
> portable interface:
>
> void __builtin___clear_cache(void *begin, void *end);
> ]
This seems a reasonable text to me, but I think it would be helpful
to say a little more precisely what kind of portability we are
talking about here.
Greater ortability across Linux architectures? Greater portability
across platforms supported by GCC (including non-Linux) platforms?
Something else?
Thanks,
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: RFC v2: Re: cacheflush.2
2020-12-11 8:15 ` Michael Kerrisk (man-pages)
@ 2020-12-11 18:02 ` Alejandro Colomar (man-pages)
2020-12-11 18:22 ` RFC v3: " Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-11 18:02 UTC (permalink / raw)
To: Michael Kerrisk (man-pages), Heinrich Schuchardt, Dave Martin
Cc: linux-man, gcc, cfe-users
Hi Michael,
On 12/11/20 9:15 AM, Michael Kerrisk (man-pages) wrote:
> i Alex,
>
> On 12/10/20 9:56 PM, Alejandro Colomar (man-pages) wrote:
>> Hi all,
>>
>> v2:
>>
>> [
>> NOTES
>> Unless you need the finer grained control that this system
>> call provides, you probably want to use the GCC built-in
>> function __builtin___clear_cache(), which provides a more
>> portable interface:
>>
>> void __builtin___clear_cache(void *begin, void *end);
>> ]
>
> This seems a reasonable text to me, but I think it would be helpful
> to say a little more precisely what kind of portability we are
> talking about here.
Sure.
>
> Greater ortability across Linux architectures? Greater portability
> across platforms supported by GCC (including non-Linux) platforms?
> Something else?
'... which provides a portable interface across platforms supported by
GCC:' sounds good.
Maybe GCC devs have something more to add.
Thanks,
Alex
>
> Thanks,
>
> Michael
>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: cacheflush.2
2020-12-09 19:15 ` cacheflush.2 Alejandro Colomar (man-pages)
@ 2020-12-11 18:14 ` Alejandro Colomar (man-pages)
2020-12-14 21:13 ` cacheflush.2 Martin Sebor
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-11 18:14 UTC (permalink / raw)
To: Heinrich Schuchardt, Michael Kerrisk (man-pages)
Cc: linux-man, gcc, cfe-users, Dave Martin
It looks like GCC recently moved from 'char *' to 'void *'.
This SO question[1] (4 years ago) quotes the GCC docs
and they had 'char *'.
Maybe Clang hasn't noticed the change.
I'll report a bug.
[1]: https://stackoverflow.com/q/35741814/6872717
On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
> Hi Heinrich,
>
> It looks like a bug (or at least an undocumented divergence from GCC) in
> Clang/LLVM. Or I couldn't find the documentation for it.
>
> Clang uses 'char *':
> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>
> GCC uses 'void *':
> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>
> I CCd Clang and GCC lists; maybe they know about that divergence.
>
> Cheers,
>
> Alex
>
> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>> Hi Heinrich & Michael,
>>>
>>> What about the following?:
>>>
>>> [
>>> NOTES
>>> GCC provides a similar function, which may be useful on archi‐
>>> tectures that lack this system call:
>>>
>>> void __builtin___clear_cache(void *begin, void *end);
>>> ]
>>
>> I just checked building with Clang/LLVM. There the arguments are of type
>> (char *). See the following error output:
>>
>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>> 'unsigned char *') to parameter of type 'char *' converts between
>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>> + __builtin___clear_cache(state->ram_buf,
>> + ^~~~~~~~~~~~~~
>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>> 'unsigned char *') to parameter of type 'char *' converts between
>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>> + state->ram_buf + state->ram_size);
>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> Best regards
>>
>> Heinrich
>>
>>>
>>> Cheers,
>>>
>>> Alex
>>>
>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>> Hello Michael,
>>>>
>>>> function cacheflush() does not exist on many architectures.
>>>>
>>>> It would have saved me a lot of time if the man-page had referenced
>>>> GCC's
>>>>
>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>
>>>> Maybe you can add it to NOTES.
>>>>
>>>> Best regards
>>>>
>>>> heirnich
>>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* RFC v3: Re: cacheflush.2
2020-12-11 18:02 ` Alejandro Colomar (man-pages)
@ 2020-12-11 18:22 ` Alejandro Colomar (man-pages)
2020-12-11 18:26 ` RFC v4: " Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-11 18:22 UTC (permalink / raw)
To: Michael Kerrisk (man-pages), Heinrich Schuchardt, Dave Martin
Cc: linux-man, gcc, cfe-users
Hi all,
Please review this text:
[
NOTES
Unless you need the finer grained control that this system
call provides, you probably want to use the GCC built-in
function __builtin___clear_cache(), which provides a more
portable interface:
void __builtin___clear_cache(void *begin, void *end);
On platforms that don't require instruction cache flushes,
__builtin___clear_cache() has no effect.
Note: On some GCC-compatible compilers, such as clang, the
prototype for this function uses char * instead of void *.
]
Thanks,
Alex
On 12/11/20 7:02 PM, Alejandro Colomar (man-pages) wrote:
> Hi Michael,
>
> On 12/11/20 9:15 AM, Michael Kerrisk (man-pages) wrote:
>> i Alex,
>>
>> On 12/10/20 9:56 PM, Alejandro Colomar (man-pages) wrote:
>>> Hi all,
>>>
>>> v2:
>>>
>>> [
>>> NOTES
>>> Unless you need the finer grained control that this system
>>> call provides, you probably want to use the GCC built-in
>>> function __builtin___clear_cache(), which provides a more
>>> portable interface:
>>>
>>> void __builtin___clear_cache(void *begin, void *end);
>>> ]
>>
>> This seems a reasonable text to me, but I think it would be helpful
>> to say a little more precisely what kind of portability we are
>> talking about here.
> Sure.
>
>>
>> Greater ortability across Linux architectures? Greater portability
>> across platforms supported by GCC (including non-Linux) platforms?
>> Something else?
>
> '... which provides a portable interface across platforms supported by
> GCC:' sounds good.
>
> Maybe GCC devs have something more to add.
>
> Thanks,
>
> Alex
>
>>
>> Thanks,
>>
>> Michael
>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* RFC v4: Re: cacheflush.2
2020-12-11 18:22 ` RFC v3: " Alejandro Colomar (man-pages)
@ 2020-12-11 18:26 ` Alejandro Colomar (man-pages)
0 siblings, 0 replies; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-11 18:26 UTC (permalink / raw)
To: Michael Kerrisk (man-pages), Heinrich Schuchardt, Dave Martin
Cc: linux-man, gcc, cfe-users
I forgot to add a junk to the text.
v4:
NOTES
Unless you need the finer grained control that this system
call provides, you probably want to use the GCC built-in
function __builtin___clear_cache(), which provides a portable
interface across platforms supported by GCC and compatible
compilers:
//Maybe 'and compatible compilers' is redundant and I should remove it?
void __builtin___clear_cache(void *begin, void *end);
On platforms that don't require instruction cache flushes,
__builtin___clear_cache() has no effect.
Note: On some GCC-compatible compilers, such as clang, the
prototype for this function uses char * instead of void *.
On 12/11/20 7:22 PM, Alejandro Colomar (man-pages) wrote:
> Hi all,
>
> Please review this text:
>
> [
> NOTES
> Unless you need the finer grained control that this system
> call provides, you probably want to use the GCC built-in
> function __builtin___clear_cache(), which provides a more
> portable interface:
>
> void __builtin___clear_cache(void *begin, void *end);
>
> On platforms that don't require instruction cache flushes,
> __builtin___clear_cache() has no effect.
>
> Note: On some GCC-compatible compilers, such as clang, the
> prototype for this function uses char * instead of void *.
> ]
>
> Thanks,
>
> Alex
>
> On 12/11/20 7:02 PM, Alejandro Colomar (man-pages) wrote:
>> Hi Michael,
>>
>> On 12/11/20 9:15 AM, Michael Kerrisk (man-pages) wrote:
>>> i Alex,
>>>
>>> On 12/10/20 9:56 PM, Alejandro Colomar (man-pages) wrote:
>>>> Hi all,
>>>>
>>>> v2:
>>>>
>>>> [
>>>> NOTES
>>>> Unless you need the finer grained control that this system
>>>> call provides, you probably want to use the GCC built-in
>>>> function __builtin___clear_cache(), which provides a more
>>>> portable interface:
>>>>
>>>> void __builtin___clear_cache(void *begin, void *end);
>>>> ]
>>>
>>> This seems a reasonable text to me, but I think it would be helpful
>>> to say a little more precisely what kind of portability we are
>>> talking about here.
>> Sure.
>>
>>>
>>> Greater ortability across Linux architectures? Greater portability
>>> across platforms supported by GCC (including non-Linux) platforms?
>>> Something else?
>>
>> '... which provides a portable interface across platforms supported by
>> GCC:' sounds good.
>>
>> Maybe GCC devs have something more to add.
>
>>
>> Thanks,
>>
>> Alex
>>
>>>
>>> Thanks,
>>>
>>> Michael
>>>
>>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: cacheflush.2
2020-12-11 18:14 ` cacheflush.2 Alejandro Colomar (man-pages)
@ 2020-12-14 21:13 ` Martin Sebor
2020-12-14 22:34 ` cacheflush.2 Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Martin Sebor @ 2020-12-14 21:13 UTC (permalink / raw)
To: Alejandro Colomar (man-pages),
Heinrich Schuchardt, Michael Kerrisk (man-pages)
Cc: linux-man, Dave Martin, cfe-users, gcc
On 12/11/20 11:14 AM, Alejandro Colomar (man-pages) via Gcc wrote:
> It looks like GCC recently moved from 'char *' to 'void *'.
> This SO question[1] (4 years ago) quotes the GCC docs
> and they had 'char *'.
__builtin___clear_cache in GCC has always been declared to take
void*. The signature in the manual was recently corrected to match
the implementation, i.e., from char* to void*, in r269082.
Martin
> Maybe Clang hasn't noticed the change.
> I'll report a bug.
>
> [1]: https://stackoverflow.com/q/35741814/6872717
>
> On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
>> Hi Heinrich,
>>
>> It looks like a bug (or at least an undocumented divergence from GCC) in
>> Clang/LLVM. Or I couldn't find the documentation for it.
>>
>> Clang uses 'char *':
>> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>>
>> GCC uses 'void *':
>> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>>
>> I CCd Clang and GCC lists; maybe they know about that divergence.
>>
>> Cheers,
>>
>> Alex
>>
>> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>>> Hi Heinrich & Michael,
>>>>
>>>> What about the following?:
>>>>
>>>> [
>>>> NOTES
>>>> GCC provides a similar function, which may be useful on archi‐
>>>> tectures that lack this system call:
>>>>
>>>> void __builtin___clear_cache(void *begin, void *end);
>>>> ]
>>>
>>> I just checked building with Clang/LLVM. There the arguments are of type
>>> (char *). See the following error output:
>>>
>>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>>> 'unsigned char *') to parameter of type 'char *' converts between
>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>> + __builtin___clear_cache(state->ram_buf,
>>> + ^~~~~~~~~~~~~~
>>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>>> 'unsigned char *') to parameter of type 'char *' converts between
>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>> + state->ram_buf + state->ram_size);
>>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>> Best regards
>>>
>>> Heinrich
>>>
>>>>
>>>> Cheers,
>>>>
>>>> Alex
>>>>
>>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>>> Hello Michael,
>>>>>
>>>>> function cacheflush() does not exist on many architectures.
>>>>>
>>>>> It would have saved me a lot of time if the man-page had referenced
>>>>> GCC's
>>>>>
>>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>>
>>>>> Maybe you can add it to NOTES.
>>>>>
>>>>> Best regards
>>>>>
>>>>> heirnich
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: cacheflush.2
2020-12-14 21:13 ` cacheflush.2 Martin Sebor
@ 2020-12-14 22:34 ` Alejandro Colomar (man-pages)
2020-12-18 10:42 ` Ping: cacheflush.2 Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-14 22:34 UTC (permalink / raw)
To: Martin Sebor, Heinrich Schuchardt, Michael Kerrisk (man-pages)
Cc: linux-man, Dave Martin, cfe-users, gcc
Hello Martin,
Thanks for the correction!
Then the prototypes that changes from 'char *' to 'void *' in r269082
were not exposed to the user, right?
I guess then those are just internal implementation where GCC did use
'char *'.
Where is the actual prototype exposed to the user declared?
Thanks,
Alex
P.S.: Michael, wait for a patch revision (v6).
On 12/14/20 10:13 PM, Martin Sebor wrote:
> On 12/11/20 11:14 AM, Alejandro Colomar (man-pages) via Gcc wrote:
>> It looks like GCC recently moved from 'char *' to 'void *'.
>> This SO question[1] (4 years ago) quotes the GCC docs
>> and they had 'char *'.
>
> __builtin___clear_cache in GCC has always been declared to take
> void*. The signature in the manual was recently corrected to match
> the implementation, i.e., from char* to void*, in r269082.
>
> Martin
>
>> Maybe Clang hasn't noticed the change.
>> I'll report a bug.
>>
>> [1]: https://stackoverflow.com/q/35741814/6872717
>>
>> On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
>>> Hi Heinrich,
>>>
>>> It looks like a bug (or at least an undocumented divergence from GCC) in
>>> Clang/LLVM. Or I couldn't find the documentation for it.
>>>
>>> Clang uses 'char *':
>>> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>>>
>>>
>>> GCC uses 'void *':
>>> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>>>
>>> I CCd Clang and GCC lists; maybe they know about that divergence.
>>>
>>> Cheers,
>>>
>>> Alex
>>>
>>> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>>>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>>>> Hi Heinrich & Michael,
>>>>>
>>>>> What about the following?:
>>>>>
>>>>> [
>>>>> NOTES
>>>>> GCC provides a similar function, which may be useful on
>>>>> archi‐
>>>>> tectures that lack this system call:
>>>>>
>>>>> void __builtin___clear_cache(void *begin, void *end);
>>>>> ]
>>>>
>>>> I just checked building with Clang/LLVM. There the arguments are of
>>>> type
>>>> (char *). See the following error output:
>>>>
>>>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>> + __builtin___clear_cache(state->ram_buf,
>>>> + ^~~~~~~~~~~~~~
>>>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>> + state->ram_buf + state->ram_size);
>>>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>
>>>> Best regards
>>>>
>>>> Heinrich
>>>>
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Alex
>>>>>
>>>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>>>> Hello Michael,
>>>>>>
>>>>>> function cacheflush() does not exist on many architectures.
>>>>>>
>>>>>> It would have saved me a lot of time if the man-page had referenced
>>>>>> GCC's
>>>>>>
>>>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>>>
>>>>>> Maybe you can add it to NOTES.
>>>>>>
>>>>>> Best regards
>>>>>>
>>>>>> heirnich
>>>>>
>>>>
>>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es
^ permalink raw reply [flat|nested] 12+ messages in thread
* Ping: cacheflush.2
2020-12-14 22:34 ` cacheflush.2 Alejandro Colomar (man-pages)
@ 2020-12-18 10:42 ` Alejandro Colomar (man-pages)
2020-12-18 16:51 ` Martin Sebor
0 siblings, 1 reply; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-18 10:42 UTC (permalink / raw)
To: Martin Sebor, Heinrich Schuchardt, Michael Kerrisk (man-pages),
gcc, Dave Martin, cfe-users, linux-man
Hi Martin,
I sent you an email, but I received a "delivery failure".
If you're reading this from a list, could you answer, please?
Thanks,
Alex
On 12/14/20 11:34 PM, Alejandro Colomar (man-pages) wrote:
> Hello Martin,
>
> Thanks for the correction!
> Then the prototypes that changes from 'char *' to 'void *' in r269082
> were not exposed to the user, right?
> I guess then those are just internal implementation where GCC did use
> 'char *'.
>
> Where is the actual prototype exposed to the user declared?
>
> Thanks,
>
> Alex
>
> P.S.: Michael, wait for a patch revision (v6).
>
> On 12/14/20 10:13 PM, Martin Sebor wrote:
>> On 12/11/20 11:14 AM, Alejandro Colomar (man-pages) via Gcc wrote:
>>> It looks like GCC recently moved from 'char *' to 'void *'.
>>> This SO question[1] (4 years ago) quotes the GCC docs
>>> and they had 'char *'.
>>
>> __builtin___clear_cache in GCC has always been declared to take
>> void*. The signature in the manual was recently corrected to match
>> the implementation, i.e., from char* to void*, in r269082.
>>
>> Martin
>>
>>> Maybe Clang hasn't noticed the change.
>>> I'll report a bug.
>>>
>>> [1]: https://stackoverflow.com/q/35741814/6872717
>>>
>>> On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
>>>> Hi Heinrich,
>>>>
>>>> It looks like a bug (or at least an undocumented divergence from GCC) in
>>>> Clang/LLVM. Or I couldn't find the documentation for it.
>>>>
>>>> Clang uses 'char *':
>>>> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>>>>
>>>>
>>>> GCC uses 'void *':
>>>> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>>>>
>>>> I CCd Clang and GCC lists; maybe they know about that divergence.
>>>>
>>>> Cheers,
>>>>
>>>> Alex
>>>>
>>>> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>>>>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>>>>> Hi Heinrich & Michael,
>>>>>>
>>>>>> What about the following?:
>>>>>>
>>>>>> [
>>>>>> NOTES
>>>>>> GCC provides a similar function, which may be useful on
>>>>>> archi‐
>>>>>> tectures that lack this system call:
>>>>>>
>>>>>> void __builtin___clear_cache(void *begin, void *end);
>>>>>> ]
>>>>>
>>>>> I just checked building with Clang/LLVM. There the arguments are of
>>>>> type
>>>>> (char *). See the following error output:
>>>>>
>>>>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>>> + __builtin___clear_cache(state->ram_buf,
>>>>> + ^~~~~~~~~~~~~~
>>>>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>>> + state->ram_buf + state->ram_size);
>>>>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>
>>>>> Best regards
>>>>>
>>>>> Heinrich
>>>>>
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> Alex
>>>>>>
>>>>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>>>>> Hello Michael,
>>>>>>>
>>>>>>> function cacheflush() does not exist on many architectures.
>>>>>>>
>>>>>>> It would have saved me a lot of time if the man-page had referenced
>>>>>>> GCC's
>>>>>>>
>>>>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>>>>
>>>>>>> Maybe you can add it to NOTES.
>>>>>>>
>>>>>>> Best regards
>>>>>>>
>>>>>>> heirnich
>>>>>>
>>>>>
>>>>
>>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Ping: cacheflush.2
2020-12-18 10:42 ` Ping: cacheflush.2 Alejandro Colomar (man-pages)
@ 2020-12-18 16:51 ` Martin Sebor
2020-12-19 14:04 ` Alejandro Colomar (man-pages)
0 siblings, 1 reply; 12+ messages in thread
From: Martin Sebor @ 2020-12-18 16:51 UTC (permalink / raw)
To: Alejandro Colomar (man-pages),
Heinrich Schuchardt, Michael Kerrisk (man-pages),
gcc, Dave Martin, cfe-users, linux-man
On 12/18/20 3:42 AM, Alejandro Colomar (man-pages) wrote:
> Hi Martin,
>
> I sent you an email, but I received a "delivery failure".
> If you're reading this from a list, could you answer, please?
>
> Thanks,
>
> Alex
>
> On 12/14/20 11:34 PM, Alejandro Colomar (man-pages) wrote:
>> Hello Martin,
>>
>> Thanks for the correction!
>> Then the prototypes that changes from 'char *' to 'void *' in r269082
>> were not exposed to the user, right?
>> I guess then those are just internal implementation where GCC did use
>> 'char *'.
__builtin___clear_cache was added to GCC in r126535 (the __builtin_
prefix is added by the macro):
+DEF_EXT_LIB_BUILTIN (BUILT_IN_CLEAR_CACHE, "__clear_cache",
BT_FN_VOID_PTR_PTR, ATTR_NOTHROW_LIST)
The BT_FN_VOID_PTR_PTR macro describes its signature as returning
void and taking two void pointer arguments. AFAIK, this has never
changed. Contrary to that, the manual entry for the built-in added
in the same revision documented it as taking two char*. That was
corrected to void* in r269082 to match.
There's a GCC internal declaration of __clear_cache (apparently
provided in libgcc for VxWorks). It was added in r264479 and
it also used char*. This was also changed to void* in r269082
to match the built-in. Looks like this __clear_cache has just
been removed from libgcc in GCC 11:
https://gcc.gnu.org/pipermail/gcc-cvs/2020-December/338478.html
>>
>> Where is the actual prototype exposed to the user declared?
Built-in functions are declared implicitly by GCC. They have no
explicit declarations like user-defined functions. The implicit
internal "declarations" are specified in the GCC internal file
gcc/builtins.def, where they are hidden behind layers of macros.
For example, on the GCC 10 branch, the declaration for
__builtin___clear_cache is here:
https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/builtins.def;h=fa8b0641ab13b36f983c591a7020f6b432e5fb3d;hb=refs/heads/releases/gcc-10#l837
Martin
>>
>> Thanks,
>>
>> Alex
>>
>> P.S.: Michael, wait for a patch revision (v6).
>>
>> On 12/14/20 10:13 PM, Martin Sebor wrote:
>>> On 12/11/20 11:14 AM, Alejandro Colomar (man-pages) via Gcc wrote:
>>>> It looks like GCC recently moved from 'char *' to 'void *'.
>>>> This SO question[1] (4 years ago) quotes the GCC docs
>>>> and they had 'char *'.
>>>
>>> __builtin___clear_cache in GCC has always been declared to take
>>> void*. The signature in the manual was recently corrected to match
>>> the implementation, i.e., from char* to void*, in r269082.
>>>
>>> Martin
>>>
>>>> Maybe Clang hasn't noticed the change.
>>>> I'll report a bug.
>>>>
>>>> [1]: https://stackoverflow.com/q/35741814/6872717
>>>>
>>>> On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
>>>>> Hi Heinrich,
>>>>>
>>>>> It looks like a bug (or at least an undocumented divergence from GCC) in
>>>>> Clang/LLVM. Or I couldn't find the documentation for it.
>>>>>
>>>>> Clang uses 'char *':
>>>>> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>>>>>
>>>>>
>>>>> GCC uses 'void *':
>>>>> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>>>>>
>>>>> I CCd Clang and GCC lists; maybe they know about that divergence.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Alex
>>>>>
>>>>> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>>>>>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>>>>>> Hi Heinrich & Michael,
>>>>>>>
>>>>>>> What about the following?:
>>>>>>>
>>>>>>> [
>>>>>>> NOTES
>>>>>>> GCC provides a similar function, which may be useful on
>>>>>>> archi‐
>>>>>>> tectures that lack this system call:
>>>>>>>
>>>>>>> void __builtin___clear_cache(void *begin, void *end);
>>>>>>> ]
>>>>>>
>>>>>> I just checked building with Clang/LLVM. There the arguments are of
>>>>>> type
>>>>>> (char *). See the following error output:
>>>>>>
>>>>>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>>>> + __builtin___clear_cache(state->ram_buf,
>>>>>> + ^~~~~~~~~~~~~~
>>>>>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>>> pointers to integer types with different sign [-Werror,-Wpointer-sign]
>>>>>> + state->ram_buf + state->ram_size);
>>>>>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>
>>>>>> Best regards
>>>>>>
>>>>>> Heinrich
>>>>>>
>>>>>>>
>>>>>>> Cheers,
>>>>>>>
>>>>>>> Alex
>>>>>>>
>>>>>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>>>>>> Hello Michael,
>>>>>>>>
>>>>>>>> function cacheflush() does not exist on many architectures.
>>>>>>>>
>>>>>>>> It would have saved me a lot of time if the man-page had referenced
>>>>>>>> GCC's
>>>>>>>>
>>>>>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>>>>>
>>>>>>>> Maybe you can add it to NOTES.
>>>>>>>>
>>>>>>>> Best regards
>>>>>>>>
>>>>>>>> heirnich
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Ping: cacheflush.2
2020-12-18 16:51 ` Martin Sebor
@ 2020-12-19 14:04 ` Alejandro Colomar (man-pages)
0 siblings, 0 replies; 12+ messages in thread
From: Alejandro Colomar (man-pages) @ 2020-12-19 14:04 UTC (permalink / raw)
To: Martin Sebor
Cc: Heinrich Schuchardt, gcc, cfe-users, Michael Kerrisk (man-pages),
linux-man, Dave Martin
Hi Martin,
Thanks! It's good to learn some GCC internal details :)
Cheers,
Alex
On 12/18/20 5:51 PM, Martin Sebor wrote:
> On 12/18/20 3:42 AM, Alejandro Colomar (man-pages) wrote:
>> Hi Martin,
>>
>> I sent you an email, but I received a "delivery failure".
>> If you're reading this from a list, could you answer, please?
>>
>> Thanks,
>>
>> Alex
>>
>> On 12/14/20 11:34 PM, Alejandro Colomar (man-pages) wrote:
>>> Hello Martin,
>>>
>>> Thanks for the correction!
>>> Then the prototypes that changes from 'char *' to 'void *' in r269082
>>> were not exposed to the user, right?
>>> I guess then those are just internal implementation where GCC did use
>>> 'char *'.
>
> __builtin___clear_cache was added to GCC in r126535 (the __builtin_
> prefix is added by the macro):
>
> +DEF_EXT_LIB_BUILTIN (BUILT_IN_CLEAR_CACHE, "__clear_cache",
> BT_FN_VOID_PTR_PTR, ATTR_NOTHROW_LIST)
>
> The BT_FN_VOID_PTR_PTR macro describes its signature as returning
> void and taking two void pointer arguments. AFAIK, this has never
> changed. Contrary to that, the manual entry for the built-in added
> in the same revision documented it as taking two char*. That was
> corrected to void* in r269082 to match.
>
> There's a GCC internal declaration of __clear_cache (apparently
> provided in libgcc for VxWorks). It was added in r264479 and
> it also used char*. This was also changed to void* in r269082
> to match the built-in. Looks like this __clear_cache has just
> been removed from libgcc in GCC 11:
> https://gcc.gnu.org/pipermail/gcc-cvs/2020-December/338478.html
>
>>>
>>> Where is the actual prototype exposed to the user declared?
>
> Built-in functions are declared implicitly by GCC. They have no
> explicit declarations like user-defined functions. The implicit
> internal "declarations" are specified in the GCC internal file
> gcc/builtins.def, where they are hidden behind layers of macros.
> For example, on the GCC 10 branch, the declaration for
> __builtin___clear_cache is here:
>
> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/builtins.def;h=fa8b0641ab13b36f983c591a7020f6b432e5fb3d;hb=refs/heads/releases/gcc-10#l837
>
>
> Martin
>
>>>
>>> Thanks,
>>>
>>> Alex
>>>
>>> P.S.: Michael, wait for a patch revision (v6).
>>>
>>> On 12/14/20 10:13 PM, Martin Sebor wrote:
>>>> On 12/11/20 11:14 AM, Alejandro Colomar (man-pages) via Gcc wrote:
>>>>> It looks like GCC recently moved from 'char *' to 'void *'.
>>>>> This SO question[1] (4 years ago) quotes the GCC docs
>>>>> and they had 'char *'.
>>>>
>>>> __builtin___clear_cache in GCC has always been declared to take
>>>> void*. The signature in the manual was recently corrected to match
>>>> the implementation, i.e., from char* to void*, in r269082.
>>>>
>>>> Martin
>>>>
>>>>> Maybe Clang hasn't noticed the change.
>>>>> I'll report a bug.
>>>>>
>>>>> [1]: https://stackoverflow.com/q/35741814/6872717
>>>>>
>>>>> On 12/9/20 8:15 PM, Alejandro Colomar (man-pages) wrote:
>>>>>> Hi Heinrich,
>>>>>>
>>>>>> It looks like a bug (or at least an undocumented divergence from
>>>>>> GCC) in
>>>>>> Clang/LLVM. Or I couldn't find the documentation for it.
>>>>>>
>>>>>> Clang uses 'char *':
>>>>>> https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583
>>>>>>
>>>>>>
>>>>>>
>>>>>> GCC uses 'void *':
>>>>>> https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
>>>>>>
>>>>>> I CCd Clang and GCC lists; maybe they know about that divergence.
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> Alex
>>>>>>
>>>>>> On 12/9/20 7:48 PM, Heinrich Schuchardt wrote:
>>>>>>> On 12/9/20 7:34 PM, Alejandro Colomar (man-pages) wrote:
>>>>>>>> Hi Heinrich & Michael,
>>>>>>>>
>>>>>>>> What about the following?:
>>>>>>>>
>>>>>>>> [
>>>>>>>> NOTES
>>>>>>>> GCC provides a similar function, which may be useful on
>>>>>>>> archi‐
>>>>>>>> tectures that lack this system call:
>>>>>>>>
>>>>>>>> void __builtin___clear_cache(void *begin, void *end);
>>>>>>>> ]
>>>>>>>
>>>>>>> I just checked building with Clang/LLVM. There the arguments are of
>>>>>>> type
>>>>>>> (char *). See the following error output:
>>>>>>>
>>>>>>> +arch/sandbox/cpu/cache.c:19:26: error: passing 'uint8_t *' (aka
>>>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>>>> pointers to integer types with different sign
>>>>>>> [-Werror,-Wpointer-sign]
>>>>>>> + __builtin___clear_cache(state->ram_buf,
>>>>>>> + ^~~~~~~~~~~~~~
>>>>>>> +arch/sandbox/cpu/cache.c:20:12: error: passing 'uint8_t *' (aka
>>>>>>> 'unsigned char *') to parameter of type 'char *' converts between
>>>>>>> pointers to integer types with different sign
>>>>>>> [-Werror,-Wpointer-sign]
>>>>>>> + state->ram_buf + state->ram_size);
>>>>>>> + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>
>>>>>>> Best regards
>>>>>>>
>>>>>>> Heinrich
>>>>>>>
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>>
>>>>>>>> Alex
>>>>>>>>
>>>>>>>> On 12/9/20 7:04 PM, Heinrich Schuchardt wrote:
>>>>>>>>> Hello Michael,
>>>>>>>>>
>>>>>>>>> function cacheflush() does not exist on many architectures.
>>>>>>>>>
>>>>>>>>> It would have saved me a lot of time if the man-page had
>>>>>>>>> referenced
>>>>>>>>> GCC's
>>>>>>>>>
>>>>>>>>> void __builtin___clear_cache(void *begin, void *end)
>>>>>>>>>
>>>>>>>>> Maybe you can add it to NOTES.
>>>>>>>>>
>>>>>>>>> Best regards
>>>>>>>>>
>>>>>>>>> heirnich
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2020-12-19 14:04 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <794cf0d1-d528-4b5a-3ce0-b1b5f588dc6d@gmx.de>
[not found] ` <ca265930-00d7-44f5-b2dd-535a5cf0310a@gmail.com>
[not found] ` <5257a883-29f0-6eaa-5708-d1f47356a57a@gmx.de>
2020-12-09 19:15 ` cacheflush.2 Alejandro Colomar (man-pages)
2020-12-11 18:14 ` cacheflush.2 Alejandro Colomar (man-pages)
2020-12-14 21:13 ` cacheflush.2 Martin Sebor
2020-12-14 22:34 ` cacheflush.2 Alejandro Colomar (man-pages)
2020-12-18 10:42 ` Ping: cacheflush.2 Alejandro Colomar (man-pages)
2020-12-18 16:51 ` Martin Sebor
2020-12-19 14:04 ` Alejandro Colomar (man-pages)
[not found] ` <20201210181726.GT6882@arm.com>
[not found] ` <747d56e0-c102-ab40-add4-530a48a43a4d@gmx.de>
2020-12-10 20:56 ` RFC v2: cacheflush.2 Alejandro Colomar (man-pages)
2020-12-11 8:15 ` Michael Kerrisk (man-pages)
2020-12-11 18:02 ` Alejandro Colomar (man-pages)
2020-12-11 18:22 ` RFC v3: " Alejandro Colomar (man-pages)
2020-12-11 18:26 ` RFC v4: " Alejandro Colomar (man-pages)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).