aboutsummaryrefslogtreecommitdiff
path: root/ld/deffilep.y
diff options
context:
space:
mode:
authorDave Korn <dave.korn@artimi.com>2009-05-27 18:40:56 +0000
committerDave Korn <dave.korn@artimi.com>2009-05-27 18:40:56 +0000
commit05056a8d5b72672948f507978c7ce1e2897d30be (patch)
tree1393f040fe5028138329b878204491fd11f24bee /ld/deffilep.y
parent97c4411662ebaae1d51ff328632f26c82a3bda89 (diff)
downloadfsf-binutils-gdb-05056a8d5b72672948f507978c7ce1e2897d30be.zip
fsf-binutils-gdb-05056a8d5b72672948f507978c7ce1e2897d30be.tar.gz
fsf-binutils-gdb-05056a8d5b72672948f507978c7ce1e2897d30be.tar.bz2
ld/ChangeLog
* deffilep.y (%union): Add new string-type semantic value 'digits'. (%token): Remove NUMBER as token, add DIGITS. (%type): Add NUMBER as type. Add new id types anylang_id, opt_id. (ALIGNCOMM): Parse an anylang_id instead of a plain ID. (anylang_id): New production. (opt_digits): Likewise. (opt_id): Likewise. (NUMBER): Likewise. (def_lex): Return strings of digits in raw string form as DIGITS token, instead of converting to numeric integer type. ld/testsuite/ChangeLog * ld-pe/non-c-lang-syms.c: New dump test source file. * ld-pe/non-c-lang-syms.d: New dump test pattern file. * ld-pe/pe.exp: Run new "foreign symbol" test.
Diffstat (limited to 'ld/deffilep.y')
-rw-r--r--ld/deffilep.y35
1 files changed, 28 insertions, 7 deletions
diff --git a/ld/deffilep.y b/ld/deffilep.y
index 5f02727..83872f5 100644
--- a/ld/deffilep.y
+++ b/ld/deffilep.y
@@ -103,6 +103,7 @@ static const char *lex_parse_string_end = 0;
%union {
char *id;
int number;
+ char *digits;
};
%token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL
@@ -110,10 +111,12 @@ static const char *lex_parse_string_end = 0;
%token PRIVATEU PRIVATEL ALIGNCOMM
%token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE
%token <id> ID
-%token <number> NUMBER
+%token <digits> DIGITS
+%type <number> NUMBER
+%type <digits> opt_digits
%type <number> opt_base opt_ordinal
%type <number> attr attr_list opt_number exp_opt_list exp_opt
-%type <id> opt_name opt_equal_name dot_name
+%type <id> opt_name opt_equal_name dot_name anylang_id opt_id
%%
@@ -135,7 +138,7 @@ command:
| VERSIONK NUMBER { def_version ($2, 0);}
| VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);}
| DIRECTIVE ID { def_directive ($2);}
- | ALIGNCOMM ID ',' NUMBER { def_aligncomm ($2, $4);}
+ | ALIGNCOMM anylang_id ',' NUMBER { def_aligncomm ($2, $4);}
;
@@ -245,7 +248,25 @@ dot_name: ID { $$ = $1; }
$$ = name;
}
;
-
+
+anylang_id: ID { $$ = $1; }
+ | anylang_id '.' opt_digits opt_id
+ {
+ char *id = xmalloc (strlen ($1) + 1 + strlen ($3) + strlen ($4) + 1);
+ sprintf (id, "%s.%s%s", $1, $3, $4);
+ $$ = id;
+ }
+ ;
+
+opt_digits: DIGITS { $$ = $1; }
+ | { $$ = ""; }
+ ;
+
+opt_id: ID { $$ = $1; }
+ | { $$ = ""; }
+ ;
+
+NUMBER: DIGITS { $$ = strtoul ($1, 0, 0); }
%%
@@ -1010,11 +1031,11 @@ def_lex (void)
}
if (c != EOF)
def_ungetc (c);
- yylval.number = strtoul (buffer, 0, 0);
+ yylval.digits = xstrdup (buffer);
#if TRACE
- printf ("lex: `%s' returns NUMBER %d\n", buffer, yylval.number);
+ printf ("lex: `%s' returns DIGITS\n", buffer);
#endif
- return NUMBER;
+ return DIGITS;
}
if (ISALPHA (c) || strchr ("$:-_?@", c))