Commit 6b25a558 by Richard Henderson Committed by Richard Henderson

gfortran.h (gfc_expr.function.name): Make const.

        * gfortran.h (gfc_expr.function.name): Make const.
        (gfc_iresolve_init_1, gfc_iresolve_done_1): Remove.
        (gfc_get_string): Update prototype.
        * iresolve.c: Include tree.h.
        (string_node, HASH_SIZE, string_head, hash): Remove.
        (gfc_get_string): Use vsnprintf, get_identifier.
        (free_strings, gfc_iresolve_init_1, gfc_iresolve_done_1): Remove.
        * misc.c (gfc_init_1): Don't call gfc_iresolve_init_1.
        (gfc_done_1): Don't call gfc_iresolve_done_1.
        * module.c (mio_allocated_string): Take and return const char *,
        instead of modifying char**.
        (mio_expr): Update to match.
        * resolve.c (pure_function): Constify name argument.
        (resolve_function): Constify name.
        * trans-intrinsic.c (gfc_conv_intrinsic_function): Likewise.

From-SVN: r92176
parent 6bd26f0b
2004-12-14 Richard Henderson <rth@redhat.com>
* gfortran.h (gfc_expr.function.name): Make const.
(gfc_iresolve_init_1, gfc_iresolve_done_1): Remove.
(gfc_get_string): Update prototype.
* iresolve.c: Include tree.h.
(string_node, HASH_SIZE, string_head, hash): Remove.
(gfc_get_string): Use vsnprintf, get_identifier.
(free_strings, gfc_iresolve_init_1, gfc_iresolve_done_1): Remove.
* misc.c (gfc_init_1): Don't call gfc_iresolve_init_1.
(gfc_done_1): Don't call gfc_iresolve_done_1.
* module.c (mio_allocated_string): Take and return const char *,
instead of modifying char**.
(mio_expr): Update to match.
* resolve.c (pure_function): Constify name argument.
(resolve_function): Constify name.
* trans-intrinsic.c (gfc_conv_intrinsic_function): Likewise.
2004-12-12 Richard Henderson <rth@redhat.com> 2004-12-12 Richard Henderson <rth@redhat.com>
* iresolve.c (gfc_resolve_all, gfc_resolve_any, gfc_resolve_count, * iresolve.c (gfc_resolve_all, gfc_resolve_any, gfc_resolve_count,
......
...@@ -1075,7 +1075,7 @@ typedef struct gfc_expr ...@@ -1075,7 +1075,7 @@ typedef struct gfc_expr
struct struct
{ {
gfc_actual_arglist *actual; gfc_actual_arglist *actual;
char *name; /* Points to the ultimate name of the function */ const char *name; /* Points to the ultimate name of the function */
gfc_intrinsic_sym *isym; gfc_intrinsic_sym *isym;
gfc_symbol *esym; gfc_symbol *esym;
} }
...@@ -1509,9 +1509,7 @@ int gfc_handle_option (size_t, const char *, int); ...@@ -1509,9 +1509,7 @@ int gfc_handle_option (size_t, const char *, int);
bool gfc_post_options (const char **); bool gfc_post_options (const char **);
/* iresolve.c */ /* iresolve.c */
char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1; const char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1;
void gfc_iresolve_init_1 (void);
void gfc_iresolve_done_1 (void);
/* error.c */ /* error.c */
......
...@@ -29,97 +29,36 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -29,97 +29,36 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
are generally set according to the function arguments. */ are generally set according to the function arguments. */
#include "config.h" #include "config.h"
#include <string.h> #include "system.h"
#include <stdarg.h> #include "coretypes.h"
#include "tree.h"
#include "gfortran.h" #include "gfortran.h"
#include "intrinsic.h" #include "intrinsic.h"
/* String pool subroutines. This are used to provide static locations /* Given printf-like arguments, return a stable version of the result string.
for the string constants that represent library function names. */
typedef struct string_node
{
struct string_node *next;
char string[1];
}
string_node;
#define HASH_SIZE 13
static string_node *string_head[HASH_SIZE];
/* Return a hash code based on the name. */
static int
hash (const char *name)
{
int h;
h = 1;
while (*name)
h = 5311966 * h + *name++;
if (h < 0)
h = -h;
return h % HASH_SIZE;
}
/* Given printf-like arguments, return a static address of the We already have a working, optimized string hashing table in the form of
resulting string. If the name is not in the table, it is added. */ the identifier table. Reusing this table is likely not to be wasted,
since if the function name makes it to the gimple output of the frontend,
we'll have to create the identifier anyway. */
char * const char *
gfc_get_string (const char *format, ...) gfc_get_string (const char *format, ...)
{ {
char temp_name[50]; char temp_name[128];
string_node *p;
va_list ap; va_list ap;
int h; tree ident;
va_start (ap, format); va_start (ap, format);
vsprintf (temp_name, format, ap); vsnprintf (temp_name, sizeof(temp_name), format, ap);
va_end (ap); va_end (ap);
temp_name[sizeof(temp_name)-1] = 0;
h = hash (temp_name); ident = get_identifier (temp_name);
return IDENTIFIER_POINTER (ident);
/* Search */
for (p = string_head[h]; p; p = p->next)
if (strcmp (p->string, temp_name) == 0)
return p->string;
/* Add */
p = gfc_getmem (sizeof (string_node) + strlen (temp_name));
strcpy (p->string, temp_name);
p->next = string_head[h];
string_head[h] = p;
return p->string;
} }
static void
free_strings (void)
{
string_node *p, *q;
int h;
for (h = 0; h < HASH_SIZE; h++)
{
for (p = string_head[h]; p; p = q)
{
q = p->next;
gfc_free (p);
}
}
}
/********************** Resolution functions **********************/ /********************** Resolution functions **********************/
...@@ -1785,20 +1724,3 @@ gfc_resolve_unlink_sub (gfc_code * c) ...@@ -1785,20 +1724,3 @@ gfc_resolve_unlink_sub (gfc_code * c)
name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind); name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind);
c->resolved_sym = gfc_get_intrinsic_sub_symbol (name); c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
} }
void
gfc_iresolve_init_1 (void)
{
int i;
for (i = 0; i < HASH_SIZE; i++)
string_head[i] = NULL;
}
void
gfc_iresolve_done_1 (void)
{
free_strings ();
}
...@@ -278,12 +278,10 @@ gfc_intent_string (sym_intent i) ...@@ -278,12 +278,10 @@ gfc_intent_string (sym_intent i)
void void
gfc_init_1 (void) gfc_init_1 (void)
{ {
gfc_error_init_1 (); gfc_error_init_1 ();
gfc_scanner_init_1 (); gfc_scanner_init_1 ();
gfc_arith_init_1 (); gfc_arith_init_1 ();
gfc_intrinsic_init_1 (); gfc_intrinsic_init_1 ();
gfc_iresolve_init_1 ();
gfc_simplify_init_1 (); gfc_simplify_init_1 ();
} }
...@@ -306,10 +304,8 @@ gfc_init_2 (void) ...@@ -306,10 +304,8 @@ gfc_init_2 (void)
void void
gfc_done_1 (void) gfc_done_1 (void)
{ {
gfc_scanner_done_1 (); gfc_scanner_done_1 ();
gfc_intrinsic_done_1 (); gfc_intrinsic_done_1 ();
gfc_iresolve_done_1 ();
gfc_arith_done_1 (); gfc_arith_done_1 ();
} }
......
...@@ -1330,16 +1330,18 @@ mio_integer (int *ip) ...@@ -1330,16 +1330,18 @@ mio_integer (int *ip)
/* Read or write a character pointer that points to a string on the /* Read or write a character pointer that points to a string on the
heap. */ heap. */
static void static const char *
mio_allocated_string (char **sp) mio_allocated_string (const char *s)
{ {
if (iomode == IO_OUTPUT) if (iomode == IO_OUTPUT)
write_atom (ATOM_STRING, *sp); {
write_atom (ATOM_STRING, s);
return s;
}
else else
{ {
require_atom (ATOM_STRING); require_atom (ATOM_STRING);
*sp = atom_string; return atom_string;
} }
} }
...@@ -2449,7 +2451,8 @@ mio_expr (gfc_expr ** ep) ...@@ -2449,7 +2451,8 @@ mio_expr (gfc_expr ** ep)
if (iomode == IO_OUTPUT) if (iomode == IO_OUTPUT)
{ {
mio_allocated_string (&e->value.function.name); e->value.function.name
= mio_allocated_string (e->value.function.name);
flag = e->value.function.esym != NULL; flag = e->value.function.esym != NULL;
mio_integer (&flag); mio_integer (&flag);
if (flag) if (flag)
...@@ -2483,7 +2486,8 @@ mio_expr (gfc_expr ** ep) ...@@ -2483,7 +2486,8 @@ mio_expr (gfc_expr ** ep)
break; break;
case EXPR_SUBSTRING: case EXPR_SUBSTRING:
mio_allocated_string (&e->value.character.string); e->value.character.string = (char *)
mio_allocated_string (e->value.character.string);
mio_expr (&e->op1); mio_expr (&e->op1);
mio_expr (&e->op2); mio_expr (&e->op2);
break; break;
...@@ -2518,7 +2522,8 @@ mio_expr (gfc_expr ** ep) ...@@ -2518,7 +2522,8 @@ mio_expr (gfc_expr ** ep)
case BT_CHARACTER: case BT_CHARACTER:
mio_integer (&e->value.character.length); mio_integer (&e->value.character.length);
mio_allocated_string (&e->value.character.string); e->value.character.string = (char *)
mio_allocated_string (e->value.character.string);
break; break;
default: default:
......
...@@ -901,7 +901,7 @@ set_type: ...@@ -901,7 +901,7 @@ set_type:
function is PURE, zero if not. */ function is PURE, zero if not. */
static int static int
pure_function (gfc_expr * e, char **name) pure_function (gfc_expr * e, const char **name)
{ {
int pure; int pure;
...@@ -936,7 +936,7 @@ static try ...@@ -936,7 +936,7 @@ static try
resolve_function (gfc_expr * expr) resolve_function (gfc_expr * expr)
{ {
gfc_actual_arglist *arg; gfc_actual_arglist *arg;
char *name; const char *name;
try t; try t;
if (resolve_actual_arglist (expr->value.function.actual) == FAILURE) if (resolve_actual_arglist (expr->value.function.actual) == FAILURE)
......
...@@ -2663,7 +2663,7 @@ void ...@@ -2663,7 +2663,7 @@ void
gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr) gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr)
{ {
gfc_intrinsic_sym *isym; gfc_intrinsic_sym *isym;
char *name; const char *name;
int lib; int lib;
isym = expr->value.function.isym; isym = expr->value.function.isym;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment