[fortran] Reduce size of pointer_info tree

Submitted by Janne Blomqvist on Jan. 29, 2012, 8:33 p.m.

Details

Message ID CAO9iq9FxjN3WrAXg7aPZsHdcvwwpPEZ+cJ4JHpp7vwd+4DmKOQ@mail.gmail.com
State New
Headers show

Commit Message

Janne Blomqvist Jan. 29, 2012, 8:33 p.m.
Hi,

the attached patch reduces the size of the pointer_info tree used when
reading and writing module files by making the module and symbol names
pointers rather than arrays. As the strings are already put into heap
memory and resized to their correct size during parsing, we have
already paid the price of using the heap and we can just point to
those parsed strings instead of copying them.

Also, a few minor cleanups from my previous patch to heap allocate
binding_label.

Committed as obvious.

2012-01-29  Janne Blomqvist  <jb@gcc.gnu.org>

	* module.c (pointer_info): Make true_name and module pointers
	rather than arrays, order pointers before other fields.
	(free_pi_tree): free true_name and module as well.
	(mio_read_string): Rename to read_string.
	(mio_write_string): Remove.
	(load_commons): Use read_string.
	(read_module): Use read_string rather than mio_internal_string.
	(write_blank_common): Call write_atom directly.
	(write_symbol): Likewise.

Patch hide | download patch | download mbox

diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 4e6c520..c68277b 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -155,13 +155,12 @@  typedef struct pointer_info
     struct
     {
       gfc_symbol *sym;
-      char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
+      char *true_name, *module, *binding_label;
+      fixup_t *stfixup;
+      gfc_symtree *symtree;
       enum gfc_rsym_state state;
       int ns, referenced, renamed;
       module_locus where;
-      fixup_t *stfixup;
-      gfc_symtree *symtree;
-      char* binding_label;
     }
     rsym;
 
@@ -229,7 +228,11 @@  free_pi_tree (pointer_info *p)
   free_pi_tree (p->right);
 
   if (iomode == IO_INPUT)
-    XDELETEVEC (p->u.rsym.binding_label);
+    {
+      XDELETEVEC (p->u.rsym.true_name);
+      XDELETEVEC (p->u.rsym.module);
+      XDELETEVEC (p->u.rsym.binding_label);
+    }
 
   free (p);
 }
@@ -1442,6 +1445,19 @@  find_enum (const mstring *m)
 }
 
 
+/* Read a string. The caller is responsible for freeing.  */
+
+static char*
+read_string (void)
+{
+  char* p;
+  require_atom (ATOM_STRING);
+  p = atom_string;
+  atom_string = NULL;
+  return p;
+}
+
+
 /**************** Module output subroutines ***************************/
 
 /* Output a character to a module file.  */
@@ -1816,27 +1832,6 @@  mio_internal_string (char *string)
 }
 
 
-/* Read a string. The caller is responsible for freeing.  */
-
-static char*
-mio_read_string (void)
-{
-  char* p;
-  require_atom (ATOM_STRING);
-  p = atom_string;
-  atom_string = NULL;
-  return p;
-}
-
-
-/* Write a string.  */
-static void
-mio_write_string (const char* string)
-{
-  write_atom (ATOM_STRING, string);
-}
-
-
 typedef enum
 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
   AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
@@ -4168,7 +4163,7 @@  load_commons (void)
       /* Get whether this was a bind(c) common or not.  */
       mio_integer (&p->is_bind_c);
       /* Get the binding label.  */
-      label = mio_read_string ();
+      label = read_string ();
       if (strlen (label))
 	p->binding_label = IDENTIFIER_POINTER (get_identifier (label));
       XDELETEVEC (label);
@@ -4531,9 +4526,9 @@  read_module (void)
       info->type = P_SYMBOL;
       info->u.rsym.state = UNUSED;
 
-      mio_internal_string (info->u.rsym.true_name);
-      mio_internal_string (info->u.rsym.module);
-      bind_label = mio_read_string ();
+      info->u.rsym.true_name = read_string ();
+      info->u.rsym.module = read_string ();
+      bind_label = read_string ();
       if (strlen (bind_label))
 	info->u.rsym.binding_label = bind_label;
       else
@@ -4960,7 +4955,7 @@  write_blank_common (void)
   mio_integer (&is_bind_c);
 
   /* Write out an empty binding label.  */
-  mio_write_string ("");
+  write_atom (ATOM_STRING, "");
 
   mio_rparen ();
 }
@@ -5064,7 +5059,7 @@  write_symbol (int n, gfc_symbol *sym)
       mio_pool_string (&label);
     }
   else
-    mio_write_string ("");
+    write_atom (ATOM_STRING, "");
 
   mio_pointer_ref (&sym->ns);