* 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
* 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
* 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
[parent not found: <20201210181726.GT6882@arm.com>]
[parent not found: <747d56e0-c102-ab40-add4-530a48a43a4d@gmx.de>]
* 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
* 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
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).