diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 5 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.c | 100 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.h | 3 | ||||
-rw-r--r-- | gcc/fortran/iresolve.c | 26 | ||||
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 3 |
6 files changed, 103 insertions, 51 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 18cda16..85c4d23 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,20 @@ +2004-08-29 Steven G. Kargl <kargls@comcast.net> + Paul Brook <paul@codesourcery.com> + + * gfortran.h (enum gfc_generic_isym_id): Add GFC_ISYM_GET?ID. + (gfc_check_f, gfc_simplify_f): Add f0. + * intrinsic.c (do_check): Call f0. Flatten. + (add_sym_0): Fix prototype. Set f0. + (add_functions): Add getgid, getgid and getuid. + (resolve_intrinsic): Remove obsolete comment. + (do_simplify): Call f0. + * intrinsic.h (gfc_resolve_getgid, gfc_resolve_getpid, + gfc_resolve_getuid): Add prototypes. + * iresolve.c (gfc_resolve_getgid, gfc_resolve_getpid, + gfc_resolve_getuid): New functions. + * trans-intrinsic.c (gfc_conv_intrinsic_function): Handle + GFC_ISYM_GET?ID. + 2004-08-28 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> * error.c (gfc_error_init_1): Remove blank line in front of diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 09b8323..a633603 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -306,6 +306,9 @@ enum gfc_generic_isym_id GFC_ISYM_EXPONENT, GFC_ISYM_FLOOR, GFC_ISYM_FRACTION, + GFC_ISYM_GETGID, + GFC_ISYM_GETPID, + GFC_ISYM_GETUID, GFC_ISYM_IACHAR, GFC_ISYM_IAND, GFC_ISYM_IARGC, @@ -918,6 +921,7 @@ gfc_intrinsic_arg; typedef union { + try (*f0)(void); try (*f1)(struct gfc_expr *); try (*f1m)(gfc_actual_arglist *); try (*f2)(struct gfc_expr *, struct gfc_expr *); @@ -937,6 +941,7 @@ gfc_check_f; typedef union { + struct gfc_expr *(*f0)(void); struct gfc_expr *(*f1)(struct gfc_expr *); struct gfc_expr *(*f2)(struct gfc_expr *, struct gfc_expr *); struct gfc_expr *(*f3)(struct gfc_expr *, struct gfc_expr *, diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 744ce38..4e68090 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -153,51 +153,36 @@ static try do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg) { gfc_expr *a1, *a2, *a3, *a4, *a5; - try t; + + if (arg == NULL) + return (*specific->check.f0) (); a1 = arg->expr; arg = arg->next; - if (arg == NULL) - t = (*specific->check.f1) (a1); - else - { - a2 = arg->expr; - arg = arg->next; + return (*specific->check.f1) (a1); - if (arg == NULL) - t = (*specific->check.f2) (a1, a2); - else - { - a3 = arg->expr; - arg = arg->next; + a2 = arg->expr; + arg = arg->next; + if (arg == NULL) + return (*specific->check.f2) (a1, a2); - if (arg == NULL) - t = (*specific->check.f3) (a1, a2, a3); - else - { - a4 = arg->expr; - arg = arg->next; + a3 = arg->expr; + arg = arg->next; + if (arg == NULL) + return (*specific->check.f3) (a1, a2, a3); - if (arg == NULL) - t = (*specific->check.f4) (a1, a2, a3, a4); - else - { - a5 = arg->expr; - arg = arg->next; + a4 = arg->expr; + arg = arg->next; + if (arg == NULL) + return (*specific->check.f4) (a1, a2, a3, a4); - if (arg == NULL) - t = (*specific->check.f5) (a1, a2, a3, a4, a5); - else - { - gfc_internal_error ("do_check(): too many args"); - } - } - } - } - } + a5 = arg->expr; + arg = arg->next; + if (arg == NULL) + return (*specific->check.f5) (a1, a2, a3, a4, a5); - return t; + gfc_internal_error ("do_check(): too many args"); } @@ -307,17 +292,17 @@ add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED, static void add_sym_0 (const char *name, int elemental, int actual_ok, bt type, int kind, - try (*check)(gfc_expr *), - gfc_expr *(*simplify)(gfc_expr *), - void (*resolve)(gfc_expr *,gfc_expr *) + try (*check)(void), + gfc_expr *(*simplify)(void), + void (*resolve)(gfc_expr *) ) { gfc_simplify_f sf; gfc_check_f cf; gfc_resolve_f rf; - cf.f1 = check; - sf.f1 = simplify; - rf.f1 = resolve; + cf.f0 = check; + sf.f0 = simplify; + rf.f0 = resolve; add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf, (void*)0); @@ -1172,6 +1157,16 @@ add_functions (void) make_generic ("fraction", GFC_ISYM_FRACTION); + /* Unix IDs (g77 compatibility) */ + add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getgid); + make_generic ("getgid", GFC_ISYM_GETGID); + + add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getpid); + make_generic ("getpid", GFC_ISYM_GETPID); + + add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getuid); + make_generic ("getuid", GFC_ISYM_GETUID); + add_sym_1 ("huge", 0, 1, BT_REAL, dr, gfc_check_huge, gfc_simplify_huge, NULL, x, BT_UNKNOWN, dr, 0); @@ -2273,15 +2268,6 @@ resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e) arg = e->value.function.actual; - /* At present only the iargc extension intrinsic takes no arguments, - and it doesn't need a resolution function, but this is here for - generality. */ - if (arg == NULL) - { - (*specific->resolve.f0) (e); - return; - } - /* Special case hacks for MIN and MAX. */ if (specific->resolve.f1m == gfc_resolve_max || specific->resolve.f1m == gfc_resolve_min) @@ -2290,6 +2276,12 @@ resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e) return; } + if (arg == NULL) + { + (*specific->resolve.f0) (e); + return; + } + a1 = arg->expr; arg = arg->next; @@ -2373,6 +2365,12 @@ do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e) arg = e->value.function.actual; + if (arg == NULL) + { + result = (*specific->simplify.f0) (); + goto finish; + } + a1 = arg->expr; arg = arg->next; diff --git a/gcc/fortran/intrinsic.h b/gcc/fortran/intrinsic.h index ef4fad5..cff8a53 100644 --- a/gcc/fortran/intrinsic.h +++ b/gcc/fortran/intrinsic.h @@ -252,6 +252,9 @@ void gfc_resolve_exp (gfc_expr *, gfc_expr *); void gfc_resolve_exponent (gfc_expr *, gfc_expr *); void gfc_resolve_floor (gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_fraction (gfc_expr *, gfc_expr *); +void gfc_resolve_getgid (gfc_expr *); +void gfc_resolve_getpid (gfc_expr *); +void gfc_resolve_getuid (gfc_expr *); void gfc_resolve_iand (gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_ibclr (gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_ibits (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 24734ac..eef424f 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -545,6 +545,32 @@ gfc_resolve_fraction (gfc_expr * f, gfc_expr * x) void +gfc_resolve_getgid (gfc_expr * f) +{ + f->ts.type = BT_INTEGER; + f->ts.kind = 4; + f->value.function.name = gfc_get_string (PREFIX("getgid")); +} + + +void +gfc_resolve_getpid (gfc_expr * f) +{ + f->ts.type = BT_INTEGER; + f->ts.kind = 4; + f->value.function.name = gfc_get_string (PREFIX("getpid")); +} + + +void +gfc_resolve_getuid (gfc_expr * f) +{ + f->ts.type = BT_INTEGER; + f->ts.kind = 4; + f->value.function.name = gfc_get_string (PREFIX("getuid")); +} + +void gfc_resolve_iand (gfc_expr * f, gfc_expr * i, gfc_expr * j ATTRIBUTE_UNUSED) { diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index 396a3da..43e1e94 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -2925,6 +2925,9 @@ gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr) case GFC_ISYM_RAND: case GFC_ISYM_ETIME: case GFC_ISYM_SECOND: + case GFC_ISYM_GETGID: + case GFC_ISYM_GETPID: + case GFC_ISYM_GETUID: gfc_conv_intrinsic_funcall (se, expr); break; |