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  <j...@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.



-- 
Janne Blomqvist
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);
 

Reply via email to