* emulparms/elf64hppa.sh (TEXT_START_SYMBOLS): Kill completely.
[deliverable/binutils-gdb.git] / ld / deffilep.y
index c0f350b35746ca7a1af96993952b3e59f3bb87fc..70e517c486d92700d09d2e4fa7c855e67274f4d7 100644 (file)
@@ -1,6 +1,6 @@
 %{ /* deffilep.y - parser for .def files */
 
-/*   Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/*   Copyright (C) 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
 
 This file is part of GNU Binutils.
 
@@ -22,11 +22,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <ctype.h>
 #include "libiberty.h"
 #include "bfd.h"
+#include "sysdep.h"
 #include "ld.h"
+#include "ldmisc.h"
 #include "deffile.h"
 
 #define TRACE 0
 
+#define ROUND_UP(a, b) (((a)+((b)-1))&~((b)-1))
+
 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
    as well as gratuitiously global symbol names, so we can have multiple
    yacc generated parsers in ld.  Note that these are only the variables
@@ -89,7 +93,6 @@ static void def_version PARAMS ((int, int));
 static void def_directive PARAMS ((char *));
 static int def_parse PARAMS ((void));
 static int def_error PARAMS ((const char *));
-static int def_debug;
 static int def_lex PARAMS ((void));
 
 static int lex_forced_token = 0;
@@ -229,7 +232,6 @@ static FILE *the_file;
 static const char *def_filename;
 static int linenumber;
 static def_file *def;
-static int max_exports, max_imports, max_sections;
 static int saw_newline;
 
 struct directive
@@ -246,7 +248,6 @@ def_file_empty ()
 {
   def_file *rv = (def_file *) xmalloc (sizeof (def_file));
   memset (rv, 0, sizeof (def_file));
-  max_exports = max_imports = max_sections = 0;
   rv->is_dll = -1;
   rv->base_address = (bfd_vma) (-1);
   rv->stack_reserve = rv->stack_commit = -1;
@@ -273,9 +274,6 @@ def_file_parse (filename, add_to)
   if (add_to)
     {
       def = add_to;
-      max_exports = def->num_exports;
-      max_imports = def->num_imports;
-      max_sections = def->num_section_defs;
     }
   else
     {
@@ -295,7 +293,7 @@ def_file_parse (filename, add_to)
   for (d = directives; d; d = d->next)
     {
 #if TRACE
-      printf ("Adding directive `%s'\n", d->name);
+      printf ("Adding directive %08x `%s'\n", d->name, d->name);
 #endif
       def_file_add_directive (def, d->name, d->len);
     }
@@ -349,12 +347,17 @@ def_file_free (def)
            free (def->imports[i].internal_name);
          if (def->imports[i].name)
            free (def->imports[i].name);
-         if (def->imports[i].module)
-           free (def->imports[i].module);
        }
       free (def->imports);
     }
 
+  while (def->modules)
+    {
+      def_file_module *m = def->modules;
+      def->modules = def->modules->next;
+      free (m);
+    }
+
   free (def);
 }
 
@@ -448,9 +451,10 @@ def_file_add_export (def, external_name, internal_name, ordinal)
      int ordinal;
 {
   def_file_export *e;
+  int max_exports = ROUND_UP(def->num_exports, 32);
   if (def->num_exports >= max_exports)
     {
-      max_exports = def->num_exports + 50;
+      max_exports = ROUND_UP(def->num_exports+1, 32);
       if (def->exports)
        def->exports = (def_file_export *) xrealloc (def->exports, max_exports * sizeof (def_file_export));
       else
@@ -469,6 +473,23 @@ def_file_add_export (def, external_name, internal_name, ordinal)
   return e;
 }
 
+static def_file_module *
+def_stash_module (def, name)
+     def_file *def;
+     char *name;
+{
+  def_file_module *s;
+  for (s=def->modules; s; s=s->next)
+    if (strcmp (s->name, name) == 0)
+      return s;
+  s = (def_file_module *) xmalloc (sizeof (def_file_module) + strlen (name));
+  s->next = def->modules;
+  def->modules = s;
+  s->user_data = 0;
+  strcpy (s->name, name);
+  return s;
+}
+
 def_file_import *
 def_file_add_import (def, name, module, ordinal, internal_name)
      def_file *def;
@@ -478,9 +499,10 @@ def_file_add_import (def, name, module, ordinal, internal_name)
      const char *internal_name;
 {
   def_file_import *i;
+  int max_imports = ROUND_UP(def->num_imports, 16);
   if (def->num_imports >= max_imports)
     {
-      max_imports = def->num_imports + 50;
+      max_imports = ROUND_UP(def->num_imports+1, 16);
       if (def->imports)
        def->imports = (def_file_import *) xrealloc (def->imports, max_imports * sizeof (def_file_import));
       else
@@ -491,7 +513,7 @@ def_file_add_import (def, name, module, ordinal, internal_name)
   if (name)
     i->name = xstrdup (name);
   if (module)
-    i->module = xstrdup (module);
+    i->module = def_stash_module(def, module);
   i->ordinal = ordinal;
   if (internal_name)
     i->internal_name = xstrdup (internal_name);
@@ -515,7 +537,7 @@ diropts[] =
   { 0, 0 }
 };
 
-int
+void
 def_file_add_directive (my_def, param, len)
      def_file *my_def;
      const char *param;
@@ -524,8 +546,7 @@ def_file_add_directive (my_def, param, len)
   def_file *save_def = def;
   const char *pend = param + len;
   const char *tend = param;
-  unsigned int sh_reserve, sh_commit;
-  int i, j;
+  int i;
 
   def = my_def;
 
@@ -636,9 +657,10 @@ def_section (name, attr)
      int attr;
 {
   def_file_section *s;
+  int max_sections = ROUND_UP(def->num_section_defs, 4);
   if (def->num_section_defs >= max_sections)
     {
-      max_sections = def->num_section_defs + 50;
+      max_sections = ROUND_UP(def->num_section_defs+1, 4);
       if (def->section_defs)
        def->section_defs = (def_file_section *) xrealloc (def->section_defs, max_sections * sizeof (def_file_import));
       else
@@ -852,7 +874,10 @@ def_ungetc (c)
      int c;
 {
   if (lex_parse_string)
-    lex_parse_string--;
+    {
+      lex_parse_string--;
+      return c;
+    }
   else
     return ungetc (c, the_file);
 }
@@ -903,7 +928,7 @@ def_lex ()
   if (isdigit (c))
     {
       bufptr = 0;
-      while (c != EOF && isxdigit (c) || (c == 'x'))
+      while (c != EOF && (isxdigit (c) || (c == 'x')))
        {
          put_buf (c);
          c = def_getc ();
@@ -920,7 +945,7 @@ def_lex ()
   if (isalpha (c) || strchr ("$:-_?", c))
     {
       bufptr = 0;
-      while (c != EOF && isalnum (c) || strchr ("$:-_?/@", c))
+      while (c != EOF && (isalnum (c) || strchr ("$:-_?/@", c)))
        {
          put_buf (c);
          c = def_getc ();
This page took 0.026426 seconds and 4 git commands to generate.