[cfe-users] [PATCH v5] cacheflush.2: Document __builtin___clear_cache() as a more portable alternative

2020-12-21 Thread Alejandro Colomar via cfe-users
Reported-by: Heinrich Schuchardt 
Signed-off-by: Alejandro Colomar 
---
 man2/cacheflush.2 | 24 
 1 file changed, 24 insertions(+)

diff --git a/man2/cacheflush.2 b/man2/cacheflush.2
index aba625721..7a2eed506 100644
--- a/man2/cacheflush.2
+++ b/man2/cacheflush.2
@@ -86,6 +86,30 @@ On Linux, this call first appeared on the MIPS architecture,
 but nowadays, Linux provides a
 .BR cacheflush ()
 system call on some other architectures, but with different arguments.
+.SH NOTES
+Unless you need the finer grained control that this system call provides,
+you probably want to use the GCC built-in function
+.BR __builtin___clear_cache (),
+which provides a portable interface
+across platforms supported by GCC and compatible compilers:
+.PP
+.in +4n
+.EX
+.BI "void __builtin___clear_cache(void *" begin ", void *" end );
+.EE
+.in
+.PP
+On platforms that don't require instruction cache flushes,
+.BR __builtin___clear_cache ()
+has no effect.
+.PP
+.IR Note :
+Until GCC 9.1.0,
+the prototype for this built-in function used
+.I char *
+instead of
+.I void *
+for the parameters.
 .SH BUGS
 Linux kernels older than version 2.6.11 ignore the
 .I addr
-- 
2.29.2

___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] [PATCH v5] cacheflush.2: Document __builtin___clear_cache() as a more portable alternative

2020-12-21 Thread Heinrich Schuchardt via cfe-users

On 12/14/20 12:43 PM, Alejandro Colomar wrote:

Reported-by: Heinrich Schuchardt 
Signed-off-by: Alejandro Colomar 


Reviewed-by: Heinrich Schuchardt 


---
  man2/cacheflush.2 | 24 
  1 file changed, 24 insertions(+)

diff --git a/man2/cacheflush.2 b/man2/cacheflush.2
index aba625721..7a2eed506 100644
--- a/man2/cacheflush.2
+++ b/man2/cacheflush.2
@@ -86,6 +86,30 @@ On Linux, this call first appeared on the MIPS architecture,
  but nowadays, Linux provides a
  .BR cacheflush ()
  system call on some other architectures, but with different arguments.
+.SH NOTES
+Unless you need the finer grained control that this system call provides,
+you probably want to use the GCC built-in function
+.BR __builtin___clear_cache (),
+which provides a portable interface
+across platforms supported by GCC and compatible compilers:
+.PP
+.in +4n
+.EX
+.BI "void __builtin___clear_cache(void *" begin ", void *" end );
+.EE
+.in
+.PP
+On platforms that don't require instruction cache flushes,
+.BR __builtin___clear_cache ()
+has no effect.
+.PP
+.IR Note :
+Until GCC 9.1.0,
+the prototype for this built-in function used
+.I char *
+instead of
+.I void *
+for the parameters.
  .SH BUGS
  Linux kernels older than version 2.6.11 ignore the
  .I addr



___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] cacheflush.2

2020-12-21 Thread Martin Sebor via cfe-users

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










___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] cacheflush.2

2020-12-21 Thread Alejandro Colomar (man-pages) via cfe-users
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
___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


[cfe-users] [PATCH v6] cacheflush.2: Document __builtin___clear_cache() as a more portable alternative

2020-12-21 Thread Alejandro Colomar via cfe-users
Reported-by: Heinrich Schuchardt 
Signed-off-by: Alejandro Colomar 
Cc: Martin Sebor 
Cc: Dave Martin 
---

v6:
- GCC has always exposed 'void *', as Martin Sebor noted.
  It's Clang (and maybe others) that (following GCC's docs)
  exposed 'char *'.

 man2/cacheflush.2 | 24 
 1 file changed, 24 insertions(+)

diff --git a/man2/cacheflush.2 b/man2/cacheflush.2
index aba625721..7a2eed506 100644
--- a/man2/cacheflush.2
+++ b/man2/cacheflush.2
@@ -86,6 +86,30 @@ On Linux, this call first appeared on the MIPS architecture,
 but nowadays, Linux provides a
 .BR cacheflush ()
 system call on some other architectures, but with different arguments.
+.SH NOTES
+Unless you need the finer grained control that this system call provides,
+you probably want to use the GCC built-in function
+.BR __builtin___clear_cache (),
+which provides a portable interface
+across platforms supported by GCC and compatible compilers:
+.PP
+.in +4n
+.EX
+.BI "void __builtin___clear_cache(void *" begin ", void *" end );
+.EE
+.in
+.PP
+On platforms that don't require instruction cache flushes,
+.BR __builtin___clear_cache ()
+has no effect.
+.PP
+.IR Note :
+On some GCC-compatible compilers,
+the prototype for this built-in function uses
+.I char *
+instead of
+.I void *
+for the parameters.
 .SH BUGS
 Linux kernels older than version 2.6.11 ignore the
 .I addr
-- 
2.29.2

___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


[cfe-users] Ping: cacheflush.2

2020-12-21 Thread Alejandro Colomar (man-pages) via cfe-users
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/
___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] Ping: cacheflush.2

2020-12-21 Thread Martin Sebor via cfe-users

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
















___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] Ping: cacheflush.2

2020-12-21 Thread Alejandro Colomar (man-pages) via cfe-users
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

[cfe-users] Ping: [PATCH v6] cacheflush.2: Document __builtin___clear_cache() as a more portable alternative

2020-12-21 Thread Alejandro Colomar (man-pages) via cfe-users
Ping

On 12/15/20 2:30 PM, Alejandro Colomar wrote:
> Reported-by: Heinrich Schuchardt 
> Signed-off-by: Alejandro Colomar 
> Cc: Martin Sebor 
> Cc: Dave Martin 
> ---
> 
> v6:
> - GCC has always exposed 'void *', as Martin Sebor noted.
>   It's Clang (and maybe others) that (following GCC's docs)
>   exposed 'char *'.
> 
>  man2/cacheflush.2 | 24 
>  1 file changed, 24 insertions(+)
> 
> diff --git a/man2/cacheflush.2 b/man2/cacheflush.2
> index aba625721..7a2eed506 100644
> --- a/man2/cacheflush.2
> +++ b/man2/cacheflush.2
> @@ -86,6 +86,30 @@ On Linux, this call first appeared on the MIPS 
> architecture,
>  but nowadays, Linux provides a
>  .BR cacheflush ()
>  system call on some other architectures, but with different arguments.
> +.SH NOTES
> +Unless you need the finer grained control that this system call provides,
> +you probably want to use the GCC built-in function
> +.BR __builtin___clear_cache (),
> +which provides a portable interface
> +across platforms supported by GCC and compatible compilers:
> +.PP
> +.in +4n
> +.EX
> +.BI "void __builtin___clear_cache(void *" begin ", void *" end );
> +.EE
> +.in
> +.PP
> +On platforms that don't require instruction cache flushes,
> +.BR __builtin___clear_cache ()
> +has no effect.
> +.PP
> +.IR Note :
> +On some GCC-compatible compilers,
> +the prototype for this built-in function uses
> +.I char *
> +instead of
> +.I void *
> +for the parameters.
>  .SH BUGS
>  Linux kernels older than version 2.6.11 ignore the
>  .I addr
> 

-- 
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/
___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users


Re: [cfe-users] [PATCH v6] cacheflush.2: Document __builtin___clear_cache() as a more portable alternative

2020-12-21 Thread Michael Kerrisk (man-pages) via cfe-users
On 12/15/20 2:30 PM, Alejandro Colomar wrote:
> Reported-by: Heinrich Schuchardt 
> Signed-off-by: Alejandro Colomar 
> Cc: Martin Sebor 
> Cc: Dave Martin 
> ---
> 
> v6:
> - GCC has always exposed 'void *', as Martin Sebor noted.
>   It's Clang (and maybe others) that (following GCC's docs)
>   exposed 'char *'.

Thanks, Alex. Patch applied.

Cheers,

Michael

>  man2/cacheflush.2 | 24 
>  1 file changed, 24 insertions(+)
> 
> diff --git a/man2/cacheflush.2 b/man2/cacheflush.2
> index aba625721..7a2eed506 100644
> --- a/man2/cacheflush.2
> +++ b/man2/cacheflush.2
> @@ -86,6 +86,30 @@ On Linux, this call first appeared on the MIPS 
> architecture,
>  but nowadays, Linux provides a
>  .BR cacheflush ()
>  system call on some other architectures, but with different arguments.
> +.SH NOTES
> +Unless you need the finer grained control that this system call provides,
> +you probably want to use the GCC built-in function
> +.BR __builtin___clear_cache (),
> +which provides a portable interface
> +across platforms supported by GCC and compatible compilers:
> +.PP
> +.in +4n
> +.EX
> +.BI "void __builtin___clear_cache(void *" begin ", void *" end );
> +.EE
> +.in
> +.PP
> +On platforms that don't require instruction cache flushes,
> +.BR __builtin___clear_cache ()
> +has no effect.
> +.PP
> +.IR Note :
> +On some GCC-compatible compilers,
> +the prototype for this built-in function uses
> +.I char *
> +instead of
> +.I void *
> +for the parameters.
>  .SH BUGS
>  Linux kernels older than version 2.6.11 ignore the
>  .I addr
> 


-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
___
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users