mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-23 15:40:14 +08:00
17a6aff334
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.
148 lines
1.9 KiB
C
148 lines
1.9 KiB
C
/* FR30 system call emulation code
|
|
Copyright (C) 1998, 2010 Free Software Foundation, Inc.
|
|
Contributed by Cygnus Solutions. */
|
|
|
|
#include <sys/stat.h>
|
|
#include "../syscall.h"
|
|
|
|
#pragma GCC diagnostic ignored "-Wreturn-mismatch"
|
|
|
|
int
|
|
_read (file, ptr, len)
|
|
int file;
|
|
char * ptr;
|
|
int len;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_read) : "r0");
|
|
asm ("int #10");
|
|
|
|
return;
|
|
}
|
|
|
|
int
|
|
_lseek (file, ptr, dir)
|
|
int file;
|
|
int ptr;
|
|
int dir;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_lseek) : "r0");
|
|
asm ("int #10");
|
|
|
|
return;
|
|
}
|
|
|
|
int
|
|
_write (file, ptr, len)
|
|
int file;
|
|
char * ptr;
|
|
int len;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_write) : "r0");
|
|
asm ("int #10");
|
|
|
|
return;
|
|
}
|
|
|
|
int
|
|
_open (path, flags)
|
|
const char * path;
|
|
int flags;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_open) : "r0");
|
|
asm ("int #10");
|
|
|
|
return;
|
|
}
|
|
|
|
int
|
|
_close (file)
|
|
int file;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_close) : "r0");
|
|
asm ("int #10");
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
_exit (n)
|
|
int n;
|
|
{
|
|
asm ("ldi:8 %0, r0" :: "i" (SYS_exit) : "r0");
|
|
asm ("int #10");
|
|
}
|
|
|
|
|
|
caddr_t
|
|
_sbrk (incr)
|
|
int incr;
|
|
{
|
|
extern char end asm ("_end"); /* Defined by the linker */
|
|
extern int __stack; /* Defined by linker script. */
|
|
static char * heap_end;
|
|
char * prev_heap_end;
|
|
|
|
if (heap_end == NULL)
|
|
heap_end = & end;
|
|
|
|
prev_heap_end = heap_end;
|
|
#if 0
|
|
if (heap_end + incr > __stack)
|
|
{
|
|
_write ( 1, "_sbrk: Heap and stack collision\n", 32);
|
|
abort ();
|
|
}
|
|
#endif
|
|
heap_end += incr;
|
|
|
|
return (caddr_t) prev_heap_end;
|
|
}
|
|
|
|
int
|
|
_fstat (file, st)
|
|
int file;
|
|
struct stat * st;
|
|
{
|
|
st->st_mode = S_IFCHR;
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_unlink ()
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int
|
|
_isatty (fd)
|
|
int fd;
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_raise ()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_times ()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_kill (pid, sig)
|
|
int pid;
|
|
int sig;
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_getpid (void)
|
|
{
|
|
return 0;
|
|
}
|