1 /* Intrinsic function resolution.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 /* Assign name and types to intrinsic procedures. For functions, the
25 first argument to a resolution function is an expression pointer to
26 the original function node and the rest are pointers to the
27 arguments of the function call. For subroutines, a pointer to the
28 code node is passed. The result type and library subroutine name
29 are generally set according to the function arguments. */
36 #include "intrinsic.h"
39 /* String pool subroutines. This are used to provide static locations
40 for the string constants that represent library function names. */
42 typedef struct string_node
44 struct string_node
*next
;
51 static string_node
*string_head
[HASH_SIZE
];
54 /* Return a hash code based on the name. */
57 hash (const char *name
)
63 h
= 5311966 * h
+ *name
++;
71 /* Given printf-like arguments, return a static address of the
72 resulting string. If the name is not in the table, it is added. */
75 gfc_get_string (const char *format
, ...)
82 va_start (ap
, format
);
83 vsprintf (temp_name
, format
, ap
);
89 for (p
= string_head
[h
]; p
; p
= p
->next
)
90 if (strcmp (p
->string
, temp_name
) == 0)
94 p
= gfc_getmem (sizeof (string_node
) + strlen (temp_name
));
96 strcpy (p
->string
, temp_name
);
98 p
->next
= string_head
[h
];
112 for (h
= 0; h
< HASH_SIZE
; h
++)
114 for (p
= string_head
[h
]; p
; p
= q
)
123 /********************** Resolution functions **********************/
127 gfc_resolve_abs (gfc_expr
* f
, gfc_expr
* a
)
131 if (f
->ts
.type
== BT_COMPLEX
)
132 f
->ts
.type
= BT_REAL
;
134 f
->value
.function
.name
=
135 gfc_get_string ("__abs_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
140 gfc_resolve_acos (gfc_expr
* f
, gfc_expr
* x
)
144 f
->value
.function
.name
=
145 gfc_get_string ("__acos_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
150 gfc_resolve_aimag (gfc_expr
* f
, gfc_expr
* x
)
153 f
->ts
.type
= BT_REAL
;
154 f
->ts
.kind
= x
->ts
.kind
;
155 f
->value
.function
.name
=
156 gfc_get_string ("__aimag_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
161 gfc_resolve_aint (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
164 f
->ts
.type
= a
->ts
.type
;
165 f
->ts
.kind
= (kind
== NULL
) ? a
->ts
.kind
: mpz_get_si (kind
->value
.integer
);
167 /* The resolved name is only used for specific intrinsics where
168 the return kind is the same as the arg kind. */
169 f
->value
.function
.name
=
170 gfc_get_string ("__aint_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
175 gfc_resolve_dint (gfc_expr
* f
, gfc_expr
* a
)
177 gfc_resolve_aint (f
, a
, NULL
);
182 gfc_resolve_all (gfc_expr
* f
, gfc_expr
* mask
, gfc_expr
* dim
)
189 gfc_resolve_index (dim
, 1);
190 f
->rank
= mask
->rank
- 1;
191 f
->shape
= gfc_copy_shape_excluding (mask
->shape
, mask
->rank
, dim
);
194 f
->value
.function
.name
=
195 gfc_get_string ("__all_%c%d", gfc_type_letter (mask
->ts
.type
),
201 gfc_resolve_anint (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
204 f
->ts
.type
= a
->ts
.type
;
205 f
->ts
.kind
= (kind
== NULL
) ? a
->ts
.kind
: mpz_get_si (kind
->value
.integer
);
207 /* The resolved name is only used for specific intrinsics where
208 the return kind is the same as the arg kind. */
209 f
->value
.function
.name
=
210 gfc_get_string ("__anint_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
215 gfc_resolve_dnint (gfc_expr
* f
, gfc_expr
* a
)
217 gfc_resolve_anint (f
, a
, NULL
);
222 gfc_resolve_any (gfc_expr
* f
, gfc_expr
* mask
, gfc_expr
* dim
)
229 gfc_resolve_index (dim
, 1);
230 f
->rank
= mask
->rank
- 1;
231 f
->shape
= gfc_copy_shape_excluding (mask
->shape
, mask
->rank
, dim
);
234 f
->value
.function
.name
=
235 gfc_get_string ("__any_%c%d", gfc_type_letter (mask
->ts
.type
),
241 gfc_resolve_asin (gfc_expr
* f
, gfc_expr
* x
)
245 f
->value
.function
.name
=
246 gfc_get_string ("__asin_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
251 gfc_resolve_atan (gfc_expr
* f
, gfc_expr
* x
)
255 f
->value
.function
.name
=
256 gfc_get_string ("__atan_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
261 gfc_resolve_atan2 (gfc_expr
* f
, gfc_expr
* x
,
262 gfc_expr
* y ATTRIBUTE_UNUSED
)
266 f
->value
.function
.name
=
267 gfc_get_string ("__atan2_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
271 /* Resolve the BESYN and BESJN intrinsics. */
274 gfc_resolve_besn (gfc_expr
* f
, gfc_expr
* n
, gfc_expr
* x
)
279 if (n
->ts
.kind
!= gfc_c_int_kind
)
281 ts
.type
= BT_INTEGER
;
282 ts
.kind
= gfc_c_int_kind
;
283 gfc_convert_type (n
, &ts
, 2);
285 f
->value
.function
.name
= gfc_get_string ("<intrinsic>");
290 gfc_resolve_btest (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* pos
)
293 f
->ts
.type
= BT_LOGICAL
;
294 f
->ts
.kind
= gfc_default_logical_kind
;
296 f
->value
.function
.name
= gfc_get_string ("__btest_%d_%d", i
->ts
.kind
,
302 gfc_resolve_ceiling (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
305 f
->ts
.type
= BT_INTEGER
;
306 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
307 : mpz_get_si (kind
->value
.integer
);
309 f
->value
.function
.name
=
310 gfc_get_string ("__ceiling_%d_%c%d", f
->ts
.kind
,
311 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
316 gfc_resolve_char (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
319 f
->ts
.type
= BT_CHARACTER
;
320 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_character_kind
321 : mpz_get_si (kind
->value
.integer
);
323 f
->value
.function
.name
=
324 gfc_get_string ("__char_%d_%c%d", f
->ts
.kind
,
325 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
330 gfc_resolve_cmplx (gfc_expr
* f
, gfc_expr
* x
, gfc_expr
* y
, gfc_expr
* kind
)
333 f
->ts
.type
= BT_COMPLEX
;
334 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_real_kind
335 : mpz_get_si (kind
->value
.integer
);
338 f
->value
.function
.name
=
339 gfc_get_string ("__cmplx0_%d_%c%d", f
->ts
.kind
,
340 gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
342 f
->value
.function
.name
=
343 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f
->ts
.kind
,
344 gfc_type_letter (x
->ts
.type
), x
->ts
.kind
,
345 gfc_type_letter (y
->ts
.type
), y
->ts
.kind
);
349 gfc_resolve_dcmplx (gfc_expr
* f
, gfc_expr
* x
, gfc_expr
* y
)
351 gfc_resolve_cmplx (f
, x
, y
, gfc_int_expr (gfc_default_double_kind
));
355 gfc_resolve_conjg (gfc_expr
* f
, gfc_expr
* x
)
359 f
->value
.function
.name
= gfc_get_string ("__conjg_%d", x
->ts
.kind
);
364 gfc_resolve_cos (gfc_expr
* f
, gfc_expr
* x
)
368 f
->value
.function
.name
=
369 gfc_get_string ("__cos_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
374 gfc_resolve_cosh (gfc_expr
* f
, gfc_expr
* x
)
378 f
->value
.function
.name
=
379 gfc_get_string ("__cosh_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
384 gfc_resolve_count (gfc_expr
* f
, gfc_expr
* mask
, gfc_expr
* dim
)
387 f
->ts
.type
= BT_INTEGER
;
388 f
->ts
.kind
= gfc_default_integer_kind
;
392 f
->rank
= mask
->rank
- 1;
393 gfc_resolve_index (dim
, 1);
394 f
->shape
= gfc_copy_shape_excluding (mask
->shape
, mask
->rank
, dim
);
397 f
->value
.function
.name
=
398 gfc_get_string ("__count_%d_%c%d", f
->ts
.kind
,
399 gfc_type_letter (mask
->ts
.type
), mask
->ts
.kind
);
404 gfc_resolve_cshift (gfc_expr
* f
, gfc_expr
* array
,
411 f
->rank
= array
->rank
;
412 f
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
421 gfc_resolve_index (dim
, 1);
422 /* Convert dim to shift's kind, so we don't need so many variations. */
423 if (dim
->ts
.kind
!= shift
->ts
.kind
)
424 gfc_convert_type (dim
, &shift
->ts
, 2);
426 f
->value
.function
.name
=
427 gfc_get_string ("__cshift%d_%d", n
, shift
->ts
.kind
);
432 gfc_resolve_dble (gfc_expr
* f
, gfc_expr
* a
)
435 f
->ts
.type
= BT_REAL
;
436 f
->ts
.kind
= gfc_default_double_kind
;
437 f
->value
.function
.name
=
438 gfc_get_string ("__dble_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
443 gfc_resolve_dim (gfc_expr
* f
, gfc_expr
* x
,
444 gfc_expr
* y ATTRIBUTE_UNUSED
)
448 f
->value
.function
.name
=
449 gfc_get_string ("__dim_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
454 gfc_resolve_dot_product (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b
)
458 if (a
->ts
.type
== BT_LOGICAL
&& b
->ts
.type
== BT_LOGICAL
)
460 f
->ts
.type
= BT_LOGICAL
;
461 f
->ts
.kind
= gfc_default_logical_kind
;
465 temp
.expr_type
= EXPR_OP
;
466 gfc_clear_ts (&temp
.ts
);
467 temp
.operator = INTRINSIC_NONE
;
470 gfc_type_convert_binary (&temp
);
474 f
->value
.function
.name
=
475 gfc_get_string ("__dot_product_%c%d", gfc_type_letter (f
->ts
.type
),
481 gfc_resolve_dprod (gfc_expr
* f
,
482 gfc_expr
* a ATTRIBUTE_UNUSED
,
483 gfc_expr
* b ATTRIBUTE_UNUSED
)
485 f
->ts
.kind
= gfc_default_double_kind
;
486 f
->ts
.type
= BT_REAL
;
488 f
->value
.function
.name
= gfc_get_string ("__dprod_r%d", f
->ts
.kind
);
493 gfc_resolve_eoshift (gfc_expr
* f
, gfc_expr
* array
,
501 f
->rank
= array
->rank
;
502 f
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
507 if (boundary
&& boundary
->rank
> 0)
510 /* Convert dim to the same type as shift, so we don't need quite so many
512 if (dim
!= NULL
&& dim
->ts
.kind
!= shift
->ts
.kind
)
513 gfc_convert_type (dim
, &shift
->ts
, 2);
515 f
->value
.function
.name
=
516 gfc_get_string ("__eoshift%d_%d", n
, shift
->ts
.kind
);
521 gfc_resolve_exp (gfc_expr
* f
, gfc_expr
* x
)
525 f
->value
.function
.name
=
526 gfc_get_string ("__exp_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
531 gfc_resolve_exponent (gfc_expr
* f
, gfc_expr
* x
)
534 f
->ts
.type
= BT_INTEGER
;
535 f
->ts
.kind
= gfc_default_integer_kind
;
537 f
->value
.function
.name
= gfc_get_string ("__exponent_%d", x
->ts
.kind
);
542 gfc_resolve_floor (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
545 f
->ts
.type
= BT_INTEGER
;
546 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
547 : mpz_get_si (kind
->value
.integer
);
549 f
->value
.function
.name
=
550 gfc_get_string ("__floor%d_%c%d", f
->ts
.kind
,
551 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
556 gfc_resolve_fraction (gfc_expr
* f
, gfc_expr
* x
)
560 f
->value
.function
.name
= gfc_get_string ("__fraction_%d", x
->ts
.kind
);
564 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
567 gfc_resolve_g77_math1 (gfc_expr
* f
, gfc_expr
* x
)
570 f
->value
.function
.name
= gfc_get_string ("<intrinsic>");
575 gfc_resolve_getcwd (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
577 f
->ts
.type
= BT_INTEGER
;
579 f
->value
.function
.name
= gfc_get_string (PREFIX("getcwd"));
584 gfc_resolve_getgid (gfc_expr
* f
)
586 f
->ts
.type
= BT_INTEGER
;
588 f
->value
.function
.name
= gfc_get_string (PREFIX("getgid"));
593 gfc_resolve_getpid (gfc_expr
* f
)
595 f
->ts
.type
= BT_INTEGER
;
597 f
->value
.function
.name
= gfc_get_string (PREFIX("getpid"));
602 gfc_resolve_getuid (gfc_expr
* f
)
604 f
->ts
.type
= BT_INTEGER
;
606 f
->value
.function
.name
= gfc_get_string (PREFIX("getuid"));
610 gfc_resolve_iand (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j ATTRIBUTE_UNUSED
)
614 f
->value
.function
.name
= gfc_get_string ("__iand_%d", i
->ts
.kind
);
619 gfc_resolve_ibclr (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* pos ATTRIBUTE_UNUSED
)
623 f
->value
.function
.name
= gfc_get_string ("__ibclr_%d", i
->ts
.kind
);
628 gfc_resolve_ibits (gfc_expr
* f
, gfc_expr
* i
,
629 gfc_expr
* pos ATTRIBUTE_UNUSED
,
630 gfc_expr
* len ATTRIBUTE_UNUSED
)
634 f
->value
.function
.name
= gfc_get_string ("__ibits_%d", i
->ts
.kind
);
639 gfc_resolve_ibset (gfc_expr
* f
, gfc_expr
* i
,
640 gfc_expr
* pos ATTRIBUTE_UNUSED
)
644 f
->value
.function
.name
= gfc_get_string ("__ibset_%d", i
->ts
.kind
);
649 gfc_resolve_ichar (gfc_expr
* f
, gfc_expr
* c
)
652 f
->ts
.type
= BT_INTEGER
;
653 f
->ts
.kind
= gfc_default_integer_kind
;
655 f
->value
.function
.name
= gfc_get_string ("__ichar_%d", c
->ts
.kind
);
660 gfc_resolve_idnint (gfc_expr
* f
, gfc_expr
* a
)
662 gfc_resolve_nint (f
, a
, NULL
);
667 gfc_resolve_ieor (gfc_expr
* f
, gfc_expr
* i
,
668 gfc_expr
* j ATTRIBUTE_UNUSED
)
672 f
->value
.function
.name
= gfc_get_string ("__ieor_%d", i
->ts
.kind
);
677 gfc_resolve_ior (gfc_expr
* f
, gfc_expr
* i
,
678 gfc_expr
* j ATTRIBUTE_UNUSED
)
682 f
->value
.function
.name
= gfc_get_string ("__ior_%d", i
->ts
.kind
);
687 gfc_resolve_int (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
690 f
->ts
.type
= BT_INTEGER
;
691 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
692 : mpz_get_si (kind
->value
.integer
);
694 f
->value
.function
.name
=
695 gfc_get_string ("__int_%d_%c%d", f
->ts
.kind
, gfc_type_letter (a
->ts
.type
),
701 gfc_resolve_ishft (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* shift
)
705 f
->value
.function
.name
=
706 gfc_get_string ("__ishft_%d_%d", i
->ts
.kind
, shift
->ts
.kind
);
711 gfc_resolve_ishftc (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* shift
,
716 s_kind
= (size
== NULL
) ? gfc_default_integer_kind
: shift
->ts
.kind
;
719 f
->value
.function
.name
=
720 gfc_get_string ("__ishftc_%d_%d_%d", i
->ts
.kind
, shift
->ts
.kind
, s_kind
);
725 gfc_resolve_lbound (gfc_expr
* f
, gfc_expr
* array
,
728 static char lbound
[] = "__lbound";
730 f
->ts
.type
= BT_INTEGER
;
731 f
->ts
.kind
= gfc_default_integer_kind
;
736 f
->shape
= gfc_get_shape (1);
737 mpz_init_set_ui (f
->shape
[0], array
->rank
);
740 f
->value
.function
.name
= lbound
;
745 gfc_resolve_len (gfc_expr
* f
, gfc_expr
* string
)
748 f
->ts
.type
= BT_INTEGER
;
749 f
->ts
.kind
= gfc_default_integer_kind
;
750 f
->value
.function
.name
= gfc_get_string ("__len_%d", string
->ts
.kind
);
755 gfc_resolve_len_trim (gfc_expr
* f
, gfc_expr
* string
)
758 f
->ts
.type
= BT_INTEGER
;
759 f
->ts
.kind
= gfc_default_integer_kind
;
760 f
->value
.function
.name
= gfc_get_string ("__len_trim%d", string
->ts
.kind
);
765 gfc_resolve_log (gfc_expr
* f
, gfc_expr
* x
)
769 f
->value
.function
.name
=
770 gfc_get_string ("__log_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
775 gfc_resolve_log10 (gfc_expr
* f
, gfc_expr
* x
)
779 f
->value
.function
.name
=
780 gfc_get_string ("__log10_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
785 gfc_resolve_logical (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
788 f
->ts
.type
= BT_LOGICAL
;
789 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_logical_kind
790 : mpz_get_si (kind
->value
.integer
);
793 f
->value
.function
.name
=
794 gfc_get_string ("__logical_%d_%c%d", f
->ts
.kind
,
795 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
800 gfc_resolve_matmul (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b
)
804 if (a
->ts
.type
== BT_LOGICAL
&& b
->ts
.type
== BT_LOGICAL
)
806 f
->ts
.type
= BT_LOGICAL
;
807 f
->ts
.kind
= gfc_default_logical_kind
;
811 temp
.expr_type
= EXPR_OP
;
812 gfc_clear_ts (&temp
.ts
);
813 temp
.operator = INTRINSIC_NONE
;
816 gfc_type_convert_binary (&temp
);
820 f
->rank
= (a
->rank
== 2 && b
->rank
== 2) ? 2 : 1;
822 f
->value
.function
.name
=
823 gfc_get_string ("__matmul_%c%d", gfc_type_letter (f
->ts
.type
),
829 gfc_resolve_minmax (const char * name
, gfc_expr
* f
, gfc_actual_arglist
* args
)
831 gfc_actual_arglist
*a
;
833 f
->ts
.type
= args
->expr
->ts
.type
;
834 f
->ts
.kind
= args
->expr
->ts
.kind
;
835 /* Find the largest type kind. */
836 for (a
= args
->next
; a
; a
= a
->next
)
838 if (a
->expr
->ts
.kind
> f
->ts
.kind
)
839 f
->ts
.kind
= a
->expr
->ts
.kind
;
842 /* Convert all parameters to the required kind. */
843 for (a
= args
; a
; a
= a
->next
)
845 if (a
->expr
->ts
.kind
!= f
->ts
.kind
)
846 gfc_convert_type (a
->expr
, &f
->ts
, 2);
849 f
->value
.function
.name
=
850 gfc_get_string (name
, gfc_type_letter (f
->ts
.type
), f
->ts
.kind
);
855 gfc_resolve_max (gfc_expr
* f
, gfc_actual_arglist
* args
)
857 gfc_resolve_minmax ("__max_%c%d", f
, args
);
862 gfc_resolve_maxloc (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
867 f
->ts
.type
= BT_INTEGER
;
868 f
->ts
.kind
= gfc_default_integer_kind
;
874 f
->rank
= array
->rank
- 1;
875 gfc_resolve_index (dim
, 1);
878 name
= mask
? "mmaxloc" : "maxloc";
879 f
->value
.function
.name
=
880 gfc_get_string ("__%s%d_%d_%c%d", name
, dim
!= NULL
, f
->ts
.kind
,
881 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
886 gfc_resolve_maxval (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
894 f
->rank
= array
->rank
- 1;
895 gfc_resolve_index (dim
, 1);
898 f
->value
.function
.name
=
899 gfc_get_string ("__%s_%c%d", mask
? "mmaxval" : "maxval",
900 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
905 gfc_resolve_merge (gfc_expr
* f
, gfc_expr
* tsource
,
906 gfc_expr
* fsource ATTRIBUTE_UNUSED
,
907 gfc_expr
* mask ATTRIBUTE_UNUSED
)
911 f
->value
.function
.name
=
912 gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource
->ts
.type
),
918 gfc_resolve_min (gfc_expr
* f
, gfc_actual_arglist
* args
)
920 gfc_resolve_minmax ("__min_%c%d", f
, args
);
925 gfc_resolve_minloc (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
930 f
->ts
.type
= BT_INTEGER
;
931 f
->ts
.kind
= gfc_default_integer_kind
;
937 f
->rank
= array
->rank
- 1;
938 gfc_resolve_index (dim
, 1);
941 name
= mask
? "mminloc" : "minloc";
942 f
->value
.function
.name
=
943 gfc_get_string ("__%s%d_%d_%c%d", name
, dim
!= NULL
, f
->ts
.kind
,
944 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
949 gfc_resolve_minval (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
957 f
->rank
= array
->rank
- 1;
958 gfc_resolve_index (dim
, 1);
961 f
->value
.function
.name
=
962 gfc_get_string ("__%s_%c%d", mask
? "mminval" : "minval",
963 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
968 gfc_resolve_mod (gfc_expr
* f
, gfc_expr
* a
,
969 gfc_expr
* p ATTRIBUTE_UNUSED
)
973 f
->value
.function
.name
=
974 gfc_get_string ("__mod_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
979 gfc_resolve_modulo (gfc_expr
* f
, gfc_expr
* a
,
980 gfc_expr
* p ATTRIBUTE_UNUSED
)
984 f
->value
.function
.name
=
985 gfc_get_string ("__modulo_%c%d", gfc_type_letter (a
->ts
.type
),
990 gfc_resolve_nearest (gfc_expr
* f
, gfc_expr
* a
,
991 gfc_expr
*p ATTRIBUTE_UNUSED
)
995 f
->value
.function
.name
=
996 gfc_get_string ("__nearest_%c%d", gfc_type_letter (a
->ts
.type
),
1001 gfc_resolve_nint (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
1004 f
->ts
.type
= BT_INTEGER
;
1005 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
1006 : mpz_get_si (kind
->value
.integer
);
1008 f
->value
.function
.name
=
1009 gfc_get_string ("__nint_%d_%d", f
->ts
.kind
, a
->ts
.kind
);
1014 gfc_resolve_not (gfc_expr
* f
, gfc_expr
* i
)
1018 f
->value
.function
.name
= gfc_get_string ("__not_%d", i
->ts
.kind
);
1023 gfc_resolve_pack (gfc_expr
* f
,
1024 gfc_expr
* array ATTRIBUTE_UNUSED
,
1026 gfc_expr
* vector ATTRIBUTE_UNUSED
)
1028 static char pack
[] = "__pack",
1029 pack_s
[] = "__pack_s";
1034 if (mask
->rank
!= 0)
1035 f
->value
.function
.name
= pack
;
1038 /* We convert mask to default logical only in the scalar case.
1039 In the array case we can simply read the array as if it were
1040 of type default logical. */
1041 if (mask
->ts
.kind
!= gfc_default_logical_kind
)
1045 ts
.type
= BT_LOGICAL
;
1046 ts
.kind
= gfc_default_logical_kind
;
1047 gfc_convert_type (mask
, &ts
, 2);
1050 f
->value
.function
.name
= pack_s
;
1056 gfc_resolve_product (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1064 f
->rank
= array
->rank
- 1;
1065 gfc_resolve_index (dim
, 1);
1068 f
->value
.function
.name
=
1069 gfc_get_string ("__%s_%c%d", mask
? "mproduct" : "product",
1070 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1075 gfc_resolve_real (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
1078 f
->ts
.type
= BT_REAL
;
1081 f
->ts
.kind
= mpz_get_si (kind
->value
.integer
);
1083 f
->ts
.kind
= (a
->ts
.type
== BT_COMPLEX
) ?
1084 a
->ts
.kind
: gfc_default_real_kind
;
1086 f
->value
.function
.name
=
1087 gfc_get_string ("__real_%d_%c%d", f
->ts
.kind
,
1088 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1093 gfc_resolve_repeat (gfc_expr
* f
, gfc_expr
* string
,
1094 gfc_expr
* ncopies ATTRIBUTE_UNUSED
)
1097 f
->ts
.type
= BT_CHARACTER
;
1098 f
->ts
.kind
= string
->ts
.kind
;
1099 f
->value
.function
.name
= gfc_get_string ("__repeat_%d", string
->ts
.kind
);
1104 gfc_resolve_reshape (gfc_expr
* f
, gfc_expr
* source
, gfc_expr
* shape
,
1105 gfc_expr
* pad ATTRIBUTE_UNUSED
,
1106 gfc_expr
* order ATTRIBUTE_UNUSED
)
1108 static char reshape0
[] = "__reshape";
1115 gfc_array_size (shape
, &rank
);
1116 f
->rank
= mpz_get_si (rank
);
1118 switch (source
->ts
.type
)
1121 kind
= source
->ts
.kind
* 2;
1127 kind
= source
->ts
.kind
;
1140 f
->value
.function
.name
=
1141 gfc_get_string ("__reshape_%d", source
->ts
.kind
);
1145 f
->value
.function
.name
= reshape0
;
1149 /* TODO: Make this work with a constant ORDER parameter. */
1150 if (shape
->expr_type
== EXPR_ARRAY
1151 && gfc_is_constant_expr (shape
)
1155 f
->shape
= gfc_get_shape (f
->rank
);
1156 c
= shape
->value
.constructor
;
1157 for (i
= 0; i
< f
->rank
; i
++)
1159 mpz_init_set (f
->shape
[i
], c
->expr
->value
.integer
);
1167 gfc_resolve_rrspacing (gfc_expr
* f
, gfc_expr
* x
)
1171 f
->value
.function
.name
= gfc_get_string ("__rrspacing_%d", x
->ts
.kind
);
1176 gfc_resolve_scale (gfc_expr
* f
, gfc_expr
* x
,
1177 gfc_expr
* y ATTRIBUTE_UNUSED
)
1181 f
->value
.function
.name
= gfc_get_string ("__scale_%d_%d", x
->ts
.kind
,
1187 gfc_resolve_scan (gfc_expr
* f
, gfc_expr
* string
,
1188 gfc_expr
* set ATTRIBUTE_UNUSED
,
1189 gfc_expr
* back ATTRIBUTE_UNUSED
)
1192 f
->ts
.type
= BT_INTEGER
;
1193 f
->ts
.kind
= gfc_default_integer_kind
;
1194 f
->value
.function
.name
= gfc_get_string ("__scan_%d", string
->ts
.kind
);
1199 gfc_resolve_set_exponent (gfc_expr
* f
, gfc_expr
* x
, gfc_expr
* i
)
1203 f
->value
.function
.name
=
1204 gfc_get_string ("__set_exponent_%d_%d", x
->ts
.kind
, i
->ts
.kind
);
1209 gfc_resolve_shape (gfc_expr
* f
, gfc_expr
* array
)
1212 f
->ts
.type
= BT_INTEGER
;
1213 f
->ts
.kind
= gfc_default_integer_kind
;
1215 f
->value
.function
.name
= gfc_get_string ("__shape_%d", f
->ts
.kind
);
1216 f
->shape
= gfc_get_shape (1);
1217 mpz_init_set_ui (f
->shape
[0], array
->rank
);
1222 gfc_resolve_sign (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b ATTRIBUTE_UNUSED
)
1226 f
->value
.function
.name
=
1227 gfc_get_string ("__sign_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1232 gfc_resolve_sin (gfc_expr
* f
, gfc_expr
* x
)
1236 f
->value
.function
.name
=
1237 gfc_get_string ("__sin_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1242 gfc_resolve_sinh (gfc_expr
* f
, gfc_expr
* x
)
1246 f
->value
.function
.name
=
1247 gfc_get_string ("__sinh_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1252 gfc_resolve_spacing (gfc_expr
* f
, gfc_expr
* x
)
1256 f
->value
.function
.name
= gfc_get_string ("__spacing_%d", x
->ts
.kind
);
1261 gfc_resolve_spread (gfc_expr
* f
, gfc_expr
* source
,
1265 static char spread
[] = "__spread";
1268 f
->rank
= source
->rank
+ 1;
1269 f
->value
.function
.name
= spread
;
1271 gfc_resolve_index (dim
, 1);
1272 gfc_resolve_index (ncopies
, 1);
1277 gfc_resolve_sqrt (gfc_expr
* f
, gfc_expr
* x
)
1281 f
->value
.function
.name
=
1282 gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1287 gfc_resolve_sum (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1295 f
->rank
= array
->rank
- 1;
1296 gfc_resolve_index (dim
, 1);
1299 f
->value
.function
.name
=
1300 gfc_get_string ("__%s_%c%d", mask
? "msum" : "sum",
1301 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1305 /* Resolve the g77 compatibility function SYSTEM. */
1308 gfc_resolve_system (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
1310 f
->ts
.type
= BT_INTEGER
;
1312 f
->value
.function
.name
= gfc_get_string (PREFIX("system"));
1317 gfc_resolve_tan (gfc_expr
* f
, gfc_expr
* x
)
1321 f
->value
.function
.name
=
1322 gfc_get_string ("__tan_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1327 gfc_resolve_tanh (gfc_expr
* f
, gfc_expr
* x
)
1331 f
->value
.function
.name
=
1332 gfc_get_string ("__tanh_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1337 gfc_resolve_transfer (gfc_expr
* f
, gfc_expr
* source ATTRIBUTE_UNUSED
,
1338 gfc_expr
* mold
, gfc_expr
* size
)
1340 /* TODO: Make this do something meaningful. */
1341 static char transfer0
[] = "__transfer0", transfer1
[] = "__transfer1";
1345 if (size
== NULL
&& mold
->rank
== 0)
1348 f
->value
.function
.name
= transfer0
;
1353 f
->value
.function
.name
= transfer1
;
1359 gfc_resolve_transpose (gfc_expr
* f
, gfc_expr
* matrix
)
1361 static char transpose0
[] = "__transpose";
1368 f
->shape
= gfc_get_shape (2);
1369 mpz_init_set (f
->shape
[0], matrix
->shape
[1]);
1370 mpz_init_set (f
->shape
[1], matrix
->shape
[0]);
1373 switch (matrix
->ts
.type
)
1376 kind
= matrix
->ts
.kind
* 2;
1382 kind
= matrix
->ts
.kind
;
1396 f
->value
.function
.name
=
1397 gfc_get_string ("__transpose_%d", kind
);
1401 f
->value
.function
.name
= transpose0
;
1407 gfc_resolve_trim (gfc_expr
* f
, gfc_expr
* string
)
1410 f
->ts
.type
= BT_CHARACTER
;
1411 f
->ts
.kind
= string
->ts
.kind
;
1412 f
->value
.function
.name
= gfc_get_string ("__trim_%d", string
->ts
.kind
);
1417 gfc_resolve_ubound (gfc_expr
* f
, gfc_expr
* array
,
1420 static char ubound
[] = "__ubound";
1422 f
->ts
.type
= BT_INTEGER
;
1423 f
->ts
.kind
= gfc_default_integer_kind
;
1428 f
->shape
= gfc_get_shape (1);
1429 mpz_init_set_ui (f
->shape
[0], array
->rank
);
1432 f
->value
.function
.name
= ubound
;
1437 gfc_resolve_unpack (gfc_expr
* f
, gfc_expr
* vector
, gfc_expr
* mask
,
1438 gfc_expr
* field ATTRIBUTE_UNUSED
)
1441 f
->ts
.type
= vector
->ts
.type
;
1442 f
->ts
.kind
= vector
->ts
.kind
;
1443 f
->rank
= mask
->rank
;
1445 f
->value
.function
.name
=
1446 gfc_get_string ("__unpack%d", field
->rank
> 0 ? 1 : 0);
1451 gfc_resolve_verify (gfc_expr
* f
, gfc_expr
* string
,
1452 gfc_expr
* set ATTRIBUTE_UNUSED
,
1453 gfc_expr
* back ATTRIBUTE_UNUSED
)
1456 f
->ts
.type
= BT_INTEGER
;
1457 f
->ts
.kind
= gfc_default_integer_kind
;
1458 f
->value
.function
.name
= gfc_get_string ("__verify_%d", string
->ts
.kind
);
1462 /* Intrinsic subroutine resolution. */
1465 gfc_resolve_cpu_time (gfc_code
* c ATTRIBUTE_UNUSED
)
1469 name
= gfc_get_string (PREFIX("cpu_time_%d"),
1470 c
->ext
.actual
->expr
->ts
.kind
);
1471 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1476 gfc_resolve_mvbits (gfc_code
* c
)
1481 kind
= c
->ext
.actual
->expr
->ts
.kind
;
1482 name
= gfc_get_string (PREFIX("mvbits_i%d"), kind
);
1484 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1489 gfc_resolve_random_number (gfc_code
* c ATTRIBUTE_UNUSED
)
1494 kind
= c
->ext
.actual
->expr
->ts
.kind
;
1495 if (c
->ext
.actual
->expr
->rank
== 0)
1496 name
= gfc_get_string (PREFIX("random_r%d"), kind
);
1498 name
= gfc_get_string (PREFIX("arandom_r%d"), kind
);
1500 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1504 /* G77 compatibility subroutines etime() and dtime(). */
1507 gfc_resolve_etime_sub (gfc_code
* c
)
1511 name
= gfc_get_string (PREFIX("etime_sub"));
1512 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1516 /* G77 compatibility subroutine second(). */
1519 gfc_resolve_second_sub (gfc_code
* c
)
1523 name
= gfc_get_string (PREFIX("second_sub"));
1524 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1528 /* G77 compatibility function srand(). */
1531 gfc_resolve_srand (gfc_code
* c
)
1534 name
= gfc_get_string (PREFIX("srand"));
1535 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1539 /* Resolve the getarg intrinsic subroutine. */
1542 gfc_resolve_getarg (gfc_code
* c
)
1547 kind
= gfc_default_integer_kind
;
1548 name
= gfc_get_string (PREFIX("getarg_i%d"), kind
);
1549 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1552 /* Resolve the getcwd intrinsic subroutine. */
1555 gfc_resolve_getcwd_sub (gfc_code
* c
)
1560 if (c
->ext
.actual
->next
->expr
!= NULL
)
1561 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
1563 kind
= gfc_default_integer_kind
;
1565 name
= gfc_get_string (PREFIX("getcwd_i%d_sub"), kind
);
1566 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1570 /* Resolve the get_command intrinsic subroutine. */
1573 gfc_resolve_get_command (gfc_code
* c
)
1578 kind
= gfc_default_integer_kind
;
1579 name
= gfc_get_string (PREFIX("get_command_i%d"), kind
);
1580 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1584 /* Resolve the get_command_argument intrinsic subroutine. */
1587 gfc_resolve_get_command_argument (gfc_code
* c
)
1592 kind
= gfc_default_integer_kind
;
1593 name
= gfc_get_string (PREFIX("get_command_argument_i%d"), kind
);
1594 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1597 /* Resolve the get_environment_variable intrinsic subroutine. */
1600 gfc_resolve_get_environment_variable (gfc_code
* code
)
1605 kind
= gfc_default_integer_kind
;
1606 name
= gfc_get_string (PREFIX("get_environment_variable_i%d"), kind
);
1607 code
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1610 /* Resolve the SYSTEM intrinsic subroutine. */
1613 gfc_resolve_system_sub (gfc_code
* c
)
1617 name
= gfc_get_string (PREFIX("system_sub"));
1618 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1621 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
1624 gfc_resolve_system_clock (gfc_code
* c
)
1629 if (c
->ext
.actual
->expr
!= NULL
)
1630 kind
= c
->ext
.actual
->expr
->ts
.kind
;
1631 else if (c
->ext
.actual
->next
->expr
!= NULL
)
1632 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
1633 else if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
1634 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
1636 kind
= gfc_default_integer_kind
;
1638 name
= gfc_get_string (PREFIX("system_clock_%d"), kind
);
1639 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
1643 gfc_iresolve_init_1 (void)
1647 for (i
= 0; i
< HASH_SIZE
; i
++)
1648 string_head
[i
] = NULL
;
1653 gfc_iresolve_done_1 (void)