4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-28 03:27:46 +08:00

Committed, CRIS port: fix fallout from time_t defaulting to 64 bits, part 1

It's been a while...  I see the CRIS port broke with the
time_t-default-to-64-bit change, observable by a few test-cases in the
gcc fortran(!) tests failing, regressing when trying a recent newlib.

This is a two-part belt-and-suspenders change: adjust the CRIS port
gettimeofday syscall (the only one in newlib/CRIS passing a time_t or
struct timeval) to handle a userspace 64-bit time_t and secondly default
time_t to 32-bit long anyway.  I considered making the local
"kernel_timeval" copy in _gettimeofday conditional on (userspace) time_t
being 64 bits, but thought it not worth bothering with the few move insns.
The effect of a 64-bit time_t is however observable as longer simulation
time when running the gcc testsuite and as bigger binaries without any
actual upside from the larger time_t size, so I thought better make the
default for this port go back to being a "long" again.

Tested by running the gcc testsuite over the three combinations of two
parts of the patch and observing the expected changes.  Committed.

libgloss:
	Adjust for syscall and userspace having different time_t or timeval.
	* cris/linunistd.h (kernel_time_t, kernel_suseconds_t, kernel_timeval):
	New types.
	(gettimeofday): Change the type of the first argument to be a
	pointer to a struct kernel_timeval.
	* cris/gensyscalls (_gettimeofday): Use an intermediate struct
	kernel_timeval for the syscall and initialize the result from
	that.

Signed-off-by: Hans-Peter Nilsson <hp@axis.com>
This commit is contained in:
Hans-Peter Nilsson 2018-09-13 17:45:39 +02:00
parent d83404e418
commit a6837ca34f
2 changed files with 21 additions and 5 deletions

View File

@ -1,5 +1,5 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2005 Axis Communications. # Copyright (C) 2005, 2018 Axis Communications.
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -93,8 +93,16 @@ cat > gettod.c <<EOF
$lu#include <sys/time.h> $lu#include <sys/time.h>
#include <sys/times.h> #include <sys/times.h>
int int
_gettimeofday (struct timeval *tp, void *tzp _gettimeofday (struct timeval *tp, void *tzp)
${r}gettimeofday (tp, tzp)) {
struct kernel_timeval kt;
int retval = _Sys_gettimeofday(&kt, tzp);
if (retval == 0)
{
tp->tv_sec = kt.tv_sec;
tp->tv_usec = kt.tv_usec;
}
R (retval)
EOF EOF
cat > isatty.c <<EOF cat > isatty.c <<EOF
$lu $lu

View File

@ -1,5 +1,5 @@
/* Support for syscalls for cris*-axis-linux-gnu and simulators /* Support for syscalls for cris*-axis-linux-gnu and simulators
Copyright (C) 1998-2005 Axis Communications. Copyright (C) 1998-2005, 2018 Axis Communications.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
@ -402,6 +402,14 @@ struct new_stat {
unsigned long __unused5; unsigned long __unused5;
}; };
typedef long int kernel_time_t;
typedef long int kernel_suseconds_t;
struct kernel_timeval {
kernel_time_t tv_sec;
kernel_suseconds_t tv_usec;
};
static inline _syscall2(int,stat,const char *,path,struct new_stat *,statbuf) static inline _syscall2(int,stat,const char *,path,struct new_stat *,statbuf)
static inline _syscall2(int,fstat,int,fd,struct new_stat *,statbuf) static inline _syscall2(int,fstat,int,fd,struct new_stat *,statbuf)
static inline _syscall0(int,getpid) static inline _syscall0(int,getpid)
@ -412,7 +420,7 @@ static inline _syscall1(long,times,struct tms *,tbuf)
static inline _syscall1(long,mmap,long *, buf) static inline _syscall1(long,mmap,long *, buf)
struct timeval; struct timeval;
struct timezone; struct timezone;
static inline _syscall2(int,gettimeofday,struct timeval *,tp, static inline _syscall2(int,gettimeofday,struct kernel_timeval *,tp,
void *, tzp) void *, tzp)
static inline _syscall2(int,link,const char *,old,const char *,new) static inline _syscall2(int,link,const char *,old,const char *,new)
static inline _syscall1(int,unlink,const char *, f) static inline _syscall1(int,unlink,const char *, f)