diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 13 | ||||
-rw-r--r-- | ld/deffilep.y | 35 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 6 | ||||
-rwxr-xr-x | ld/testsuite/ld-pe/non-c-lang-syms.d | 10 | ||||
-rwxr-xr-x | ld/testsuite/ld-pe/non-c-lang-syms.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pe.exp | 7 |
6 files changed, 79 insertions, 7 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 9c02e69..9c4b545 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2009-05-27 Dave Korn <dave.korn.cygwin@gmail.com> + + * 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. + 2009-05-26 Nathan Sidwell <nathan@codesourcery.com> * ldmain.c (main): Don't reject --relax -r. 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)) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9d54d03..e6a02b0 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-05-27 Dave Korn <dave.korn.cygwin@gmail.com> + + * 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. + 2009-05-26 Nathan Sidwell <nathan@codesourcery.com> * ld-powerpc/vxworks-relax-2.s: New. diff --git a/ld/testsuite/ld-pe/non-c-lang-syms.d b/ld/testsuite/ld-pe/non-c-lang-syms.d new file mode 100755 index 0000000..3c7fa93 --- /dev/null +++ b/ld/testsuite/ld-pe/non-c-lang-syms.d @@ -0,0 +1,10 @@ +#... +[0-9A-Fa-f]{6,14}[08]0 B _?test\$equiv\.eq\. +[0-9A-Fa-f]{6,14}[02468aAcCeE]0 B _?test\$equiv\.eq\.100 +[0-9A-Fa-f]{6,14}[0-9A-Fa-f]0 B _?test\$equiv\.eq\.1_ +[0-9A-Fa-f]{6,14}[048cC]0 B _?test\$equiv\.eq\._ +[0-9A-Fa-f]{6,14}[08]0 B _?test_equiv\.eq\. +[0-9A-Fa-f]{6,14}[02468aAcCeE]0 B _?test_equiv\.eq\.100 +[0-9A-Fa-f]{6,14}[0-9A-Fa-f]0 B _?test_equiv\.eq\.1_ +[0-9A-Fa-f]{6,14}[048cC]0 B _?test_equiv\.eq\._ +#... diff --git a/ld/testsuite/ld-pe/non-c-lang-syms.s b/ld/testsuite/ld-pe/non-c-lang-syms.s new file mode 100755 index 0000000..e849d9e --- /dev/null +++ b/ld/testsuite/ld-pe/non-c-lang-syms.s @@ -0,0 +1,15 @@ + +main: +_main: + nop + + .comm _test_equiv.eq.1_, 16, 4 + .comm _test_equiv.eq.100, 16, 5 + .comm _test_equiv.eq._, 16, 6 + .comm _test_equiv.eq., 16, 7 + + .comm _test$equiv.eq.1_, 16, 4 + .comm _test$equiv.eq.100, 16, 5 + .comm _test$equiv.eq._, 16, 6 + .comm _test$equiv.eq., 16, 7 + diff --git a/ld/testsuite/ld-pe/pe.exp b/ld/testsuite/ld-pe/pe.exp index 3fcf8cb..648e9a0 100644 --- a/ld/testsuite/ld-pe/pe.exp +++ b/ld/testsuite/ld-pe/pe.exp @@ -69,3 +69,10 @@ run_dump_test "longsecn-4" run_dump_test "longsecn-5" run_dump_test "orphan" + +set foreign_sym_test { + {"non-C aligned common" "" "" {non-c-lang-syms.s} + {{nm -C non-c-lang-syms.d}} "non-c-lang-syms.x"} +} + +run_ld_link_tests $foreign_sym_test |