aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog16
-rw-r--r--ld/deffilep.y72
2 files changed, 78 insertions, 10 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0a2357f..d2db3fd 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,19 @@
+2011-04-18 Kai Tietz <ktietz@redhat.com>
+
+ * deffilep.y (def_pool_str): New type.
+ (pool_strs): Local static.
+ (def_pool_alloc): Local function.
+ (def_pool_strdup): Likewise.
+ (def_pool_free): Likewise.
+ (opt_name): Replace xmalloc/xstrdup by
+ def_pool_alloc/def_pool_strdup.
+ (dot_name): Likewise.
+ (anylang_id): Likewise.
+ (def_lex): Likewise.
+ (def_file_parse): Call def_pool_free on
+ exit and cleanup directives elements.
+ (def_file_add_directive): Call def_pool_free.
+
2011-04-18 Paul Brook <paul@codesourcery.com>
* emulparams/elf32_tic6x_le.sh: Define OTHER_READONLY_SECTIONS
diff --git a/ld/deffilep.y b/ld/deffilep.y
index a1cd993..c1c95d2 100644
--- a/ld/deffilep.y
+++ b/ld/deffilep.y
@@ -78,6 +78,17 @@
#define yytable def_yytable
#define yycheck def_yycheck
+typedef struct def_pool_str {
+ struct def_pool_str *next;
+ char data[1];
+} def_pool_str;
+
+static def_pool_str *pool_strs = NULL;
+
+static char *def_pool_alloc (size_t sz);
+static char *def_pool_strdup (const char *str);
+static void def_pool_free (void);
+
static void def_description (const char *);
static void def_exports (const char *, const char *, int, int, const char *);
static void def_heapsize (int, int);
@@ -226,13 +237,13 @@ attr:
opt_name: ID { $$ = $1; }
| '.' ID
{
- char *name = xmalloc (strlen ($2) + 2);
+ char *name = def_pool_alloc (strlen ($2) + 2);
sprintf (name, ".%s", $2);
$$ = name;
}
| ID '.' ID
{
- char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1);
+ char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
sprintf (name, "%s.%s", $1, $3);
$$ = name;
}
@@ -260,13 +271,13 @@ opt_base: BASE '=' NUMBER { $$ = $3;}
dot_name: ID { $$ = $1; }
| '.' ID
{
- char *name = xmalloc (strlen ($2) + 2);
+ char *name = def_pool_alloc (strlen ($2) + 2);
sprintf (name, ".%s", $2);
$$ = name;
}
| dot_name '.' ID
{
- char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1);
+ char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
sprintf (name, "%s.%s", $1, $3);
$$ = name;
}
@@ -275,13 +286,13 @@ dot_name: ID { $$ = $1; }
anylang_id: ID { $$ = $1; }
| '.' ID
{
- char *id = xmalloc (strlen ($2) + 2);
+ char *id = def_pool_alloc (strlen ($2) + 2);
sprintf (id, ".%s", $2);
$$ = id;
}
| anylang_id '.' opt_digits opt_id
{
- char *id = xmalloc (strlen ($1) + 1 + strlen ($3) + strlen ($4) + 1);
+ char *id = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + strlen ($4) + 1);
sprintf (id, "%s.%s%s", $1, $3, $4);
$$ = id;
}
@@ -358,18 +369,23 @@ def_file_parse (const char *filename, def_file *add_to)
{
def_file_free (def);
fclose (the_file);
+ def_pool_free ();
return 0;
}
fclose (the_file);
- for (d = directives; d; d = d->next)
+ while ((d = directives) != NULL)
{
#if TRACE
printf ("Adding directive %08x `%s'\n", d->name, d->name);
#endif
def_file_add_directive (def, d->name, d->len);
+ directives = d->next;
+ free (d->name);
+ free (d);
}
+ def_pool_free ();
return def;
}
@@ -873,6 +889,7 @@ def_file_add_directive (def_file *my_def, const char *param, int len)
}
def = save_def;
+ def_pool_free ();
}
/* Parser Callbacks. */
@@ -1243,7 +1260,7 @@ def_lex (void)
}
if (c != EOF)
def_ungetc (c);
- yylval.digits = xstrdup (buffer);
+ yylval.digits = def_pool_strdup (buffer);
#if TRACE
printf ("lex: `%s' returns DIGITS\n", buffer);
#endif
@@ -1292,7 +1309,7 @@ def_lex (void)
#if TRACE
printf ("lex: `%s' returns ID\n", buffer);
#endif
- yylval.id = xstrdup (buffer);
+ yylval.id = def_pool_strdup (buffer);
return ID;
}
@@ -1307,7 +1324,7 @@ def_lex (void)
put_buf (c);
c = def_getc ();
}
- yylval.id = xstrdup (buffer);
+ yylval.id = def_pool_strdup (buffer);
#if TRACE
printf ("lex: `%s' returns ID\n", buffer);
#endif
@@ -1347,3 +1364,38 @@ def_lex (void)
/*printf ("lex: 0x%02x ignored\n", c); */
return def_lex ();
}
+
+static char *
+def_pool_alloc (size_t sz)
+{
+ def_pool_str *e;
+
+ e = (def_pool_str *) xmalloc (sizeof (def_pool_str) + sz);
+ e->next = pool_strs;
+ pool_strs = e;
+ return e->data;
+}
+
+static char *
+def_pool_strdup (const char *str)
+{
+ char *s;
+ size_t len;
+ if (!str)
+ return NULL;
+ len = strlen (str) + 1;
+ s = def_pool_alloc (len);
+ memcpy (s, str, len);
+ return s;
+}
+
+static void
+def_pool_free (void)
+{
+ def_pool_str *p;
+ while ((p = pool_strs) != NULL)
+ {
+ pool_strs = p->next;
+ free (p);
+ }
+}