aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/deffilep.y35
-rw-r--r--ld/testsuite/ChangeLog6
-rwxr-xr-xld/testsuite/ld-pe/non-c-lang-syms.d10
-rwxr-xr-xld/testsuite/ld-pe/non-c-lang-syms.s15
-rw-r--r--ld/testsuite/ld-pe/pe.exp7
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