Fix fr30 libgloss build

Message ID 7598c8ae-b123-4c47-8157-0ec11d78749c@gmail.com
State New
Headers
Series Fix fr30 libgloss build |

Commit Message

Jeff Law Dec. 14, 2023, 2:46 p.m. UTC
  gcc-14 will default to c99 and as a result a fair amount of old code in 
newlib (particularly libgloss) is failing to build.  I don't offhand 
know how many patches will be necessary to fix the various failures. 
I'll just pick them off one by one from my tree.

This particular patch works around the return-mismatch problem 
syscalls.c for fr30.

That file is a bit odd in that most functions are declared as returning 
an integer, but the implementations look like:

> int
> _read (file, ptr, len)
>      int    file;
>      char * ptr;
>      int    len;
> {
>   asm ("ldi:8 %0, r0" :: "i" (SYS_read) : "r0");
>   asm ("int   #10");
> 
>   return;
> }


Note the lack of a value on the "return" statement.  The assumption is 
that the interrupt handler implementing syscalls will put the return 
value into the proper register, so falling off the end of the C function 
or returning with no value works in the expected way.  It's not good 
code, but it probably works.

Working from that assumption I decided to just use a pragma to disable 
the upgraded diagnostic from GCC -- essentially preserving existing 
behavior.

This is the only fr30 specific issue that needs to be resolved and the 
only issue (so far) I've seen of this specific nature.

OK for the trunk?

jeff
  

Comments

Jeff Johnston Dec. 14, 2023, 3:54 p.m. UTC | #1
Looks fine.  Feel free to push.

-- Jeff J.

On Thu, Dec 14, 2023 at 9:47 AM Jeff Law <jeffreyalaw@gmail.com> wrote:

>
> gcc-14 will default to c99 and as a result a fair amount of old code in
> newlib (particularly libgloss) is failing to build.  I don't offhand
> know how many patches will be necessary to fix the various failures.
> I'll just pick them off one by one from my tree.
>
> This particular patch works around the return-mismatch problem
> syscalls.c for fr30.
>
> That file is a bit odd in that most functions are declared as returning
> an integer, but the implementations look like:
>
> > int
> > _read (file, ptr, len)
> >      int    file;
> >      char * ptr;
> >      int    len;
> > {
> >   asm ("ldi:8 %0, r0" :: "i" (SYS_read) : "r0");
> >   asm ("int   #10");
> >
> >   return;
> > }
>
>
> Note the lack of a value on the "return" statement.  The assumption is
> that the interrupt handler implementing syscalls will put the return
> value into the proper register, so falling off the end of the C function
> or returning with no value works in the expected way.  It's not good
> code, but it probably works.
>
> Working from that assumption I decided to just use a pragma to disable
> the upgraded diagnostic from GCC -- essentially preserving existing
> behavior.
>
> This is the only fr30 specific issue that needs to be resolved and the
> only issue (so far) I've seen of this specific nature.
>
> OK for the trunk?
>
> jeff
>
  

Patch

diff --git a/libgloss/fr30/syscalls.c b/libgloss/fr30/syscalls.c
index 2558556b6..36702b03d 100644
--- a/libgloss/fr30/syscalls.c
+++ b/libgloss/fr30/syscalls.c
@@ -5,6 +5,8 @@ 
 #include <sys/stat.h>
 #include "../syscall.h"
 
+#pragma GCC diagnostic ignored "-Wreturn-mismatch"
+
 int
 _read (file, ptr, len)
      int    file;