Skip to content

Commit

Permalink
PR fortran/30947
Browse files Browse the repository at this point in the history
	* iresolve.c (gfc_resolve_alarm_sub): Suffix the subroutine name
	with the kind of the STATUS argument.

	* intrinsics/signal.c: Create specific versions of alarm_sub and
	alarm_sub_int according to the integer kind of the last argument.
	* gfortran.map (GFORTRAN_1.0): Remove _gfortran_alarm_sub and
	_gfortran_alarm_sub_int, add _gfortran_alarm_sub_i4,
	_gfortran_alarm_sub_i8, _gfortran_alarm_sub_int_i4 and
	_gfortran_alarm_sub_int_i8.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127259 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
fxcoudert committed Aug 6, 2007
1 parent 3ccfa1c commit 4055554
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 13 deletions.
6 changes: 6 additions & 0 deletions gcc/fortran/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2007-08-06 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>

PR fortran/30947
* iresolve.c (gfc_resolve_alarm_sub): Suffix the subroutine name
with the kind of the STATUS argument.

2007-08-06 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>

PR fortran/30948
Expand Down
10 changes: 7 additions & 3 deletions gcc/fortran/iresolve.c
Original file line number Diff line number Diff line change
Expand Up @@ -2385,15 +2385,19 @@ gfc_resolve_alarm_sub (gfc_code *c)
ts.type = BT_INTEGER;
ts.kind = gfc_c_int_kind;

/* handler can be either BT_INTEGER or BT_PROCEDURE */
/* handler can be either BT_INTEGER or BT_PROCEDURE.
In all cases, the status argument is of default integer kind
(enforced in check.c) so that the function suffix is fixed. */
if (handler->ts.type == BT_INTEGER)
{
if (handler->ts.kind != gfc_c_int_kind)
gfc_convert_type (handler, &ts, 2);
name = gfc_get_string (PREFIX ("alarm_sub_int"));
name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
gfc_default_integer_kind);
}
else
name = gfc_get_string (PREFIX ("alarm_sub"));
name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
gfc_default_integer_kind);

if (seconds->ts.kind != gfc_c_int_kind)
gfc_convert_type (seconds, &ts, 2);
Expand Down
10 changes: 10 additions & 0 deletions libgfortran/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2007-08-06 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>

PR fortran/30947
* intrinsics/signal.c: Create specific versions of alarm_sub and
alarm_sub_int according to the integer kind of the last argument.
* gfortran.map (GFORTRAN_1.0): Remove _gfortran_alarm_sub and
_gfortran_alarm_sub_int, add _gfortran_alarm_sub_i4,
_gfortran_alarm_sub_i8, _gfortran_alarm_sub_int_i4 and
_gfortran_alarm_sub_int_i8.

2007-08-06 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>

PR fortran/29828
Expand Down
6 changes: 4 additions & 2 deletions libgfortran/gfortran.map
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ GFORTRAN_1.0 {
_gfortran_access_func;
_gfortran_adjustl;
_gfortran_adjustr;
_gfortran_alarm_sub;
_gfortran_alarm_sub_int;
_gfortran_alarm_sub_i4;
_gfortran_alarm_sub_i8;
_gfortran_alarm_sub_int_i4;
_gfortran_alarm_sub_int_i8;
_gfortran_all_l16;
_gfortran_all_l4;
_gfortran_all_l8;
Expand Down
72 changes: 64 additions & 8 deletions libgfortran/intrinsics/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,11 @@ iexport(signal_func_int);


/* ALARM intrinsic with PROCEDURE as handler */
extern void alarm_sub (int *, void (*)(int), int *);
iexport_proto(alarm_sub);
extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4 *);
iexport_proto(alarm_sub_i4);

void
alarm_sub (int *seconds, void (*handler)(int), int *status)
alarm_sub_i4 (int *seconds, void (*handler)(int), GFC_INTEGER_4 *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
Expand All @@ -157,15 +157,71 @@ alarm_sub (int *seconds, void (*handler)(int), int *status)
*status = -1;
#endif
}
iexport(alarm_sub);
iexport(alarm_sub_i4);


extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8 *);
iexport_proto(alarm_sub_i8);

void
alarm_sub_i8 (int *seconds, void (*handler)(int), GFC_INTEGER_8 *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
{
if (signal (SIGALRM, handler) == SIG_ERR)
*status = -1;
else
*status = alarm (*seconds);
}
else
{
signal (SIGALRM, handler);
alarm (*seconds);
}
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(alarm_sub_i8);


/* ALARM intrinsic with INTEGER as handler */
extern void alarm_sub_int (int *, int *, int *);
iexport_proto(alarm_sub_int);
extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4 *);
iexport_proto(alarm_sub_int_i4);

void
alarm_sub_int_i4 (int *seconds, int *handler, GFC_INTEGER_4 *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
{
if (signal (SIGALRM, (void (*)(int)) *handler) == SIG_ERR)
*status = -1;
else
*status = alarm (*seconds);
}
else
{
signal (SIGALRM, (void (*)(int)) *handler);
alarm (*seconds);
}
#else
errno = ENOSYS;
if (status != NULL)
*status = -1;
#endif
}
iexport(alarm_sub_int_i4);


extern void alarm_sub_int_i8 (int *, int *, GFC_INTEGER_8 *);
iexport_proto(alarm_sub_int_i8);

void
alarm_sub_int (int *seconds, int *handler, int *status)
alarm_sub_int_i8 (int *seconds, int *handler, GFC_INTEGER_8 *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
Expand All @@ -186,5 +242,5 @@ alarm_sub_int (int *seconds, int *handler, int *status)
*status = -1;
#endif
}
iexport(alarm_sub_int);
iexport(alarm_sub_int_i8);

0 comments on commit 4055554

Please sign in to comment.