[gfortran] use string pool where appropriate

Tobias Schlüter tobias.schlueter@physik.uni-muenchen.de
Mon Feb 7 14:03:00 GMT 2005


This fairly mechanical patch uses pointers into the string pool instead of a
character array within each structure which describes a named object.  This
allows using 'const char *' instead of 'char *' in a lot more places, and
saves memory since the string pool object is only allocated once, instead of
once for each symtree, symbol, keyword arg etc. where the same name is used.
While doing this I also uncovered a latent bug in gfc_new_nml_name_expr(): had
the structure allocated there ever been freed, a segfault would have resulted,
because a string was incorrectly not copied.

I didn't implement the obvious followup patch of using pointer comparisons
instead of strcmp when comparing names, as I didn't want this to grow too large.

Bootstrapped and tested on i686-pc-linux.  The basic idea (and the
mio_pool_string name) comes from g95.  Ok?

- Tobi

2005-02-07  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>

	* gfortran.h (gfc_component, gfc_actual_arglist, gfc_user_op,): Make
	'name' a 'const char *'.
	(gfc_symbol): Likewise, also for 'module'.
	(gfc_symtree): Make 'name' a 'const char *'.
	(gfc_intrinsic_sym): Likewise, also for 'lib_name'.
	(gfc_get_gsymbol, gfc_find_gsymbol): Add 'const' qualifier to
	'char *' argument.
	(gfc_intrinsic_symbol): Use 'gfc_get_string' instead of 'strcpy' to
	initialize 'SYM->module'.
	* check.c (gfc_check_minloc_maxloc, check_reduction): Check for NULL
	pointer instead of empty string.
	* dump-parse-tree.c (gfc_show_actual_arglist): Likewise.
	* interface.c (gfc_compare_types): Adapt check to account for possible
	NULL pointer.
	(compare_actual_formal): Check for NULL pointer instead of empty
	string.
	* intrinsic.c (gfc_current_intrinsic, gfc_current_intrinsic_arg):
	Add 'const' qualifier.	
	(conv_name): Return a heap allocated string.
	(find_conv): Add 'const' qualifier to 'target'.
	(add_sym): Use 'gfc_get_string' instead of 'strcpy'.
	(make_generic): Check for NULL pointer instead of empty	string.
	(make_alias): Use 'gfc_get_string' instead of 'strcpy'.
	(add_conv): No need to strcpy result from 'conv_name'.
	(sort_actual): Check for NULL pointer instead of empty	string.
	* intrinsic.h (gfc_current_intrinsic, gfc_current_intrinsic_arg):
	Adapt prototype.
	* module.c (compare_true_names): Compare pointers instead of strings
	for 'module' member.
	(find_true_name): Initialize string fields with gfc_get_string.
	(mio_pool_string): New function.
	(mio_internal_string): Adapt comment.
	(mio_component_ref, mio_component, mio_actual_arg): Use
	'mio_pool_string' instead of 'mio_internal_string'.
	(mio_symbol_interface): Add 'const' qualifier to string arguments.
	Add level of indirection. Use 'mio_pool_string' instead of
	'mio_internal_string'.
	(load_needed, read_module): Use 'gfc_get_string' instead of 'strcpy'.
	(write_common, write_symbol): Use 'mio_pool_string' instead of
	'mio_internal_string'.
	(write_symbol0, write_symbol1): Likewise, also check for NULL pointer
	instead of empty string.
	(write_operator, write_generic): Pass correct type variable to
	'mio_symbol_interface'.
	(write_symtree): Use 'mio_pool_string' instead of
	'mio_internal_string'.
	* primary.c (match_keyword_arg): Adapt check to possible
	case of NULL pointer.  Use 'gfc_get_string' instead of 'strcpy'.
	* symbol.c (gfc_add_component, gfc_new_symtree, delete_symtree,
	gfc_get_uop, gfc_new_symbol): Use 'gfc_get_string' instead of
	'strcpy'.
	(ambiguous_symbol): Check for NULL pointer instead of empty string.
	(gfc_find_gsymbol, gfc_get_gsymbol): Add 'const' qualifier on string
	arguments.
	* trans-array.c (gfc_trans_auto_array_allocation): Check for NULL
	pointer instead of empty string.
	* trans-decl.c (gfc_sym_mangled_identifier,
	gfc_sym_mangled_function_id, gfc_finish_var_decl, gfc_get_symbol_decl,
	gfc_get_symbol_decl): Likewise.
	* trans-io.c (gfc_new_nml_name_expr): Add 'const' qualifier to
	argument.  Copy string instead of pointing to it.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: pool.diff
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20050207/ae3b6ceb/attachment.ksh>


More information about the Fortran mailing list