From 05056a8d5b72672948f507978c7ce1e2897d30be Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Wed, 27 May 2009 18:40:56 +0000 Subject: 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. --- ld/deffilep.y | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'ld/deffilep.y') 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 -%token NUMBER +%token DIGITS +%type NUMBER +%type opt_digits %type opt_base opt_ordinal %type attr attr_list opt_number exp_opt_list exp_opt -%type opt_name opt_equal_name dot_name +%type 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)) -- cgit v1.1