diff mbox series

[uclibc-ng-devel,2/2] Fix compilation error on noMMU/nothread systems with old compilers

Message ID 20230612074741.193637-2-yann@sionneau.net
State Accepted
Headers show
Series [uclibc-ng-devel,1/2] Revert "librt: avoid compilation error" | expand

Commit Message

Yann Sionneau June 12, 2023, 7:47 a.m. UTC
For instance with buildroot config sipeed_maix_bit_defconfig the pre-processor generates

  if (1)
    r = ({ long _sys_result; { register long int _a7 __asm__ ("a7"); register long _a3 __asm__ ("a3"); long _a3tmp; register long _a2 __asm__ ("a2"); long _a2tmp; register long _a1 __asm__ ("a1"); long _a1tmp; long _a0tmp; register long _a0 __asm__ ("a0"); _a0tmp = (long) (clock_id); _a0 = _a0tmp; _a1tmp = (long) (flags); _a1 = _a1tmp; _a2tmp = (long) (req); _a2 = _a2tmp; _a3tmp = (long) (rem); _a3 = _a3tmp; _a7 = (115); __asm__ volatile ( "scall\n\t" : "=r" (_a0) : "r"(_a7) , "r" (_a0), "r" (_a1), "r" (_a2), "r" (_a3) : "memory"); _sys_result = _a0; } _sys_result; });
  else
    {
      int oldstate = LIBC_CANCEL_ASYNC ();

      r = ({ long _sys_result; { register long int _a7 __asm__ ("a7"); register long _a3 __asm__ ("a3"); long _a3tmp; register long _a2 __asm__ ("a2"); long _a2tmp; register long _a1 __asm__ ("a1"); long _a1tmp; long _a0tmp; register long _a0 __asm__ ("a0"); _a0tmp = (long) (clock_id); _a0 = _a0tmp; _a1tmp = (long) (flags); _a1 = _a1tmp; _a2tmp = (long) (req); _a2 = _a2tmp; _a3tmp = (long) (rem); _a3 = _a3tmp; _a7 = (115); __asm__ volatile ( "scall\n\t" : "=r" (_a0) : "r"(_a7) , "r" (_a0), "r" (_a1), "r" (_a2), "r" (_a3) : "memory"); _sys_result = _a0; } _sys_result; })
           ;

      LIBC_CANCEL_RESET (oldstate);
    }

And also the compiler issues these warnings:

librt/clock_nanosleep.c: In function 'clock_nanosleep':
librt/clock_nanosleep.c:43:22: warning: implicit declaration of function
'LIBC_CANCEL_ASYNC'; did you mean 'LIBC_CANCEL_HANDLED'?
[-Wimplicit-function-declaration]
    43 |       int oldstate = LIBC_CANCEL_ASYNC ();
       |                      ^~~~~~~~~~~~~~~~~
       |                      LIBC_CANCEL_HANDLED
librt/clock_nanosleep.c:48:7: warning: implicit declaration of function
'LIBC_CANCEL_RESET'; did you mean 'LIBC_CANCEL_HANDLED'?
[-Wimplicit-function-declaration]
    48 |       LIBC_CANCEL_RESET (oldstate);
       |       ^~~~~~~~~~~~~~~~~
       |       LIBC_CANCEL_HANDLED

So if the compiler is a bit picky and does not optimize the if (1) {} else {} it can fail to link with undefined symbols.
This patch fixes this issue: no more warning.

Btw, that's the solution that is already used in the following cancellation point files:
* libc/sysdeps/linux/common/__syscall_fcntl.c
* libc/sysdeps/linux/common/__syscall_fcntl64.c
* libc/sysdeps/linux/common/ioctl.c
* libc/sysdeps/linux/common/openat.c
* libc/sysdeps/linux/common/open.c

Signed-off-by: Yann Sionneau <yann@sionneau.net>
---
 librt/clock_nanosleep.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Waldemar Brodkorb June 14, 2023, 7:44 a.m. UTC | #1
Hi Yann,

looks good to me and nobody complained, so I pushed both patches.

best regards
 Waldemar

Yann Sionneau wrote,

> For instance with buildroot config sipeed_maix_bit_defconfig the pre-processor generates
> 
>   if (1)
>     r = ({ long _sys_result; { register long int _a7 __asm__ ("a7"); register long _a3 __asm__ ("a3"); long _a3tmp; register long _a2 __asm__ ("a2"); long _a2tmp; register long _a1 __asm__ ("a1"); long _a1tmp; long _a0tmp; register long _a0 __asm__ ("a0"); _a0tmp = (long) (clock_id); _a0 = _a0tmp; _a1tmp = (long) (flags); _a1 = _a1tmp; _a2tmp = (long) (req); _a2 = _a2tmp; _a3tmp = (long) (rem); _a3 = _a3tmp; _a7 = (115); __asm__ volatile ( "scall\n\t" : "=r" (_a0) : "r"(_a7) , "r" (_a0), "r" (_a1), "r" (_a2), "r" (_a3) : "memory"); _sys_result = _a0; } _sys_result; });
>   else
>     {
>       int oldstate = LIBC_CANCEL_ASYNC ();
> 
>       r = ({ long _sys_result; { register long int _a7 __asm__ ("a7"); register long _a3 __asm__ ("a3"); long _a3tmp; register long _a2 __asm__ ("a2"); long _a2tmp; register long _a1 __asm__ ("a1"); long _a1tmp; long _a0tmp; register long _a0 __asm__ ("a0"); _a0tmp = (long) (clock_id); _a0 = _a0tmp; _a1tmp = (long) (flags); _a1 = _a1tmp; _a2tmp = (long) (req); _a2 = _a2tmp; _a3tmp = (long) (rem); _a3 = _a3tmp; _a7 = (115); __asm__ volatile ( "scall\n\t" : "=r" (_a0) : "r"(_a7) , "r" (_a0), "r" (_a1), "r" (_a2), "r" (_a3) : "memory"); _sys_result = _a0; } _sys_result; })
>            ;
> 
>       LIBC_CANCEL_RESET (oldstate);
>     }
> 
> And also the compiler issues these warnings:
> 
> librt/clock_nanosleep.c: In function 'clock_nanosleep':
> librt/clock_nanosleep.c:43:22: warning: implicit declaration of function
> 'LIBC_CANCEL_ASYNC'; did you mean 'LIBC_CANCEL_HANDLED'?
> [-Wimplicit-function-declaration]
>     43 |       int oldstate = LIBC_CANCEL_ASYNC ();
>        |                      ^~~~~~~~~~~~~~~~~
>        |                      LIBC_CANCEL_HANDLED
> librt/clock_nanosleep.c:48:7: warning: implicit declaration of function
> 'LIBC_CANCEL_RESET'; did you mean 'LIBC_CANCEL_HANDLED'?
> [-Wimplicit-function-declaration]
>     48 |       LIBC_CANCEL_RESET (oldstate);
>        |       ^~~~~~~~~~~~~~~~~
>        |       LIBC_CANCEL_HANDLED
> 
> So if the compiler is a bit picky and does not optimize the if (1) {} else {} it can fail to link with undefined symbols.
> This patch fixes this issue: no more warning.
> 
> Btw, that's the solution that is already used in the following cancellation point files:
> * libc/sysdeps/linux/common/__syscall_fcntl.c
> * libc/sysdeps/linux/common/__syscall_fcntl64.c
> * libc/sysdeps/linux/common/ioctl.c
> * libc/sysdeps/linux/common/openat.c
> * libc/sysdeps/linux/common/open.c
> 
> Signed-off-by: Yann Sionneau <yann@sionneau.net>
> ---
>  librt/clock_nanosleep.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/librt/clock_nanosleep.c b/librt/clock_nanosleep.c
> index 4cf1e06b4..85db72fb3 100644
> --- a/librt/clock_nanosleep.c
> +++ b/librt/clock_nanosleep.c
> @@ -40,12 +40,14 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
>      r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem);
>    else
>      {
> +#ifdef __NEW_THREADS
>        int oldstate = LIBC_CANCEL_ASYNC ();
>  
>        r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req,
>  			    rem);
>  
>        LIBC_CANCEL_RESET (oldstate);
> +#endif
>      }
>  
>    return (INTERNAL_SYSCALL_ERROR_P (r, err)
> -- 
> 2.34.1
> 
> _______________________________________________
> devel mailing list -- devel@uclibc-ng.org
> To unsubscribe send an email to devel-leave@uclibc-ng.org
>
diff mbox series

Patch

diff --git a/librt/clock_nanosleep.c b/librt/clock_nanosleep.c
index 4cf1e06b4..85db72fb3 100644
--- a/librt/clock_nanosleep.c
+++ b/librt/clock_nanosleep.c
@@ -40,12 +40,14 @@  clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
     r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem);
   else
     {
+#ifdef __NEW_THREADS
       int oldstate = LIBC_CANCEL_ASYNC ();
 
       r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req,
 			    rem);
 
       LIBC_CANCEL_RESET (oldstate);
+#endif
     }
 
   return (INTERNAL_SYSCALL_ERROR_P (r, err)