From 8ddde5279eec45a2f2717e70851d66aabb03fd0b Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Wed, 27 May 2009 18:40:56 +0000 Subject: [PATCH] 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/ChangeLog | 13 +++++++++++++ ld/deffilep.y | 35 ++++++++++++++++++++++++++++------- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-pe/non-c-lang-syms.d | 10 ++++++++++ ld/testsuite/ld-pe/non-c-lang-syms.s | 15 +++++++++++++++ ld/testsuite/ld-pe/pe.exp | 7 +++++++ 6 files changed, 79 insertions(+), 7 deletions(-) create mode 100755 ld/testsuite/ld-pe/non-c-lang-syms.d create mode 100755 ld/testsuite/ld-pe/non-c-lang-syms.s diff --git a/ld/ChangeLog b/ld/ChangeLog index 9c02e69ea..9c4b54579 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2009-05-27 Dave Korn + + * 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 * ldmain.c (main): Don't reject --relax -r. diff --git a/ld/deffilep.y b/ld/deffilep.y index 5f02727bd..83872f598 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)) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9d54d034d..e6a02b0b2 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-05-27 Dave Korn + + * 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 * 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 000000000..3c7fa9376 --- /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 000000000..e849d9e16 --- /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 3fcf8cbf4..648e9a014 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 -- 2.11.4.GIT