summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2007-05-24 09:24:09 +0000
committerNathan Sidwell <nathan@codesourcery.com>2007-05-24 09:24:09 +0000
commit746dcfd6a0c3e31c85454a1be271d513e46459f6 (patch)
tree2b27bd3a957af47723f0d685cd94b52c691a29b3 /ld
parentded9754e4e5386ad69bf485dd4b08905f1fa0b8a (diff)
downloadbinutils-redhat-746dcfd6a0c3e31c85454a1be271d513e46459f6.tar.gz
* ldlex.l: ASSERT is recognized in SCRIPT env. NAMES cannot
contain commas in EXP env. * ldgram.y (extern_name_list): Push to EXP env, move body to ... (extern_name_list_body): ... here. (script_file, ifile_list): Reformat. (statement): Add ASSERT. testsuite: * ld-scripts/assert.t: Add additional cases. * ld-scripts/extern.t, ld-scripts/extern.s, ld-scripts/extern.exp: New.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/ldgram.y27
-rw-r--r--ld/ldlex.l14
-rw-r--r--ld/testsuite/ChangeLog6
-rw-r--r--ld/testsuite/ld-scripts/assert.t6
-rw-r--r--ld/testsuite/ld-scripts/extern.exp68
-rw-r--r--ld/testsuite/ld-scripts/extern.s1
-rw-r--r--ld/testsuite/ld-scripts/extern.t14
8 files changed, 129 insertions, 16 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0adf7c7b5a..873fb4bad7 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+2007-05-24 Nathan Sidwell <nathan@codesourcery.com>
+
+ * ldlex.l: ASSERT is recognized in SCRIPT env. NAMES cannot
+ contain commas in EXP env.
+ * ldgram.y (extern_name_list): Push to EXP env, move body to ...
+ (extern_name_list_body): ... here.
+ (script_file, ifile_list): Reformat.
+ (statement): Add ASSERT.
+
2007-05-22 Nick Clifton <nickc@redhat.com>
* ld.texinfo: Use @copying around the copyright notice.
diff --git a/ld/ldgram.y b/ld/ldgram.y
index 78d7165b09..b79fc6ad3b 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -280,33 +280,33 @@ casesymlist:
| casesymlist ',' NAME
;
+/* Parsed as expressions so that commas separate entries */
extern_name_list:
+ { ldlex_expression (); }
+ extern_name_list_body
+ { ldlex_popstate (); }
+
+extern_name_list_body:
NAME
{ ldlang_add_undef ($1); }
- | extern_name_list NAME
+ | extern_name_list_body NAME
{ ldlang_add_undef ($2); }
- | extern_name_list ',' NAME
+ | extern_name_list_body ',' NAME
{ ldlang_add_undef ($3); }
;
script_file:
- {
- ldlex_both();
- }
- ifile_list
- {
- ldlex_popstate();
- }
+ { ldlex_both(); }
+ ifile_list
+ { ldlex_popstate(); }
;
-
ifile_list:
- ifile_list ifile_p1
+ ifile_list ifile_p1
|
;
-
ifile_p1:
memory
| sections
@@ -573,6 +573,9 @@ statement:
{
lang_add_fill ($3);
}
+ | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end
+ { ldlex_popstate ();
+ lang_add_assignment (exp_assert ($4, $6)); }
;
statement_list:
diff --git a/ld/ldlex.l b/ld/ldlex.l
index 61fbe6d9bc..88a8f1d655 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -256,7 +256,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
-<EXPRESSION,BOTH>"ASSERT" { RTOKEN(ASSERT_K); }
+<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
@@ -363,11 +363,19 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
}
-<BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* {
+<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
yylval.name = xstrdup (yytext);
return NAME;
}
-<BOTH,EXPRESSION>"-l"{FILENAMECHAR}+ {
+<BOTH>"-l"{FILENAMECHAR}+ {
+ yylval.name = xstrdup (yytext + 2);
+ return LNAME;
+ }
+<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
+ yylval.name = xstrdup (yytext);
+ return NAME;
+ }
+<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
yylval.name = xstrdup (yytext + 2);
return LNAME;
}
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 0eba593473..b5f29f788f 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-05-24 Nathan Sidwell <nathan@codesourcery.com>
+
+ * ld-scripts/assert.t: Add additional cases.
+ * ld-scripts/extern.t, ld-scripts/extern.s,
+ ld-scripts/extern.exp: New.
+
2007-05-22 Paul Brook <paul@codesourcery.com>
* ld-arm/arm-pic-veneer.d: Update expected output.
diff --git a/ld/testsuite/ld-scripts/assert.t b/ld/testsuite/ld-scripts/assert.t
index 62aee34ed3..c3caebddbf 100644
--- a/ld/testsuite/ld-scripts/assert.t
+++ b/ld/testsuite/ld-scripts/assert.t
@@ -1,5 +1,9 @@
SECTIONS
{
- .empty : {}
+ .empty : {
+ here = !.;
+ ASSERT (!., "dot is not zero");
+ ASSERT (here, "here is zero");
+ }
ASSERT (!SIZEOF(.empty), "Empty is not empty")
}
diff --git a/ld/testsuite/ld-scripts/extern.exp b/ld/testsuite/ld-scripts/extern.exp
new file mode 100644
index 0000000000..a613a757ee
--- /dev/null
+++ b/ld/testsuite/ld-scripts/extern.exp
@@ -0,0 +1,68 @@
+# Test EXTERN in a linker script.
+# By Nathan Sidwell, CodeSourcery LLC
+# Copyright 2007
+# Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+set testname "EXTERN"
+
+if ![ld_assemble $as $srcdir/$subdir/extern.s tmpdir/extern.o] {
+ unresolved $testname
+ return
+}
+
+if ![ld_simple_link $ld tmpdir/extern "-T $srcdir/$subdir/extern.t tmpdir/extern.o"] {
+ fail $testname
+}
+
+if ![ld_nm $nm "" tmpdir/extern] {
+ unresolved $testname
+ return
+}
+
+if {![info exists nm_output(sym1)] || $nm_output(sym1) != 1} {
+ send_log "sym1 wrong\n"
+ verbose "sym1 wrong"
+ fail $testname
+ return
+}
+
+if {![info exists nm_output(sym2)] || $nm_output(sym2) != 2} {
+ send_log "sym1 wrong\n"
+ verbose "sym1 wrong"
+ fail $testname
+ return
+}
+if {![info exists nm_output(sym3)] || $nm_output(sym3) != 3} {
+ send_log "sym1 wrong\n"
+ verbose "sym1 wrong"
+ fail $testname
+ return
+}
+if {![info exists nm_output(sym4)] || $nm_output(sym4) != 4} {
+ send_log "sym1 wrong\n"
+ verbose "sym1 wrong"
+ fail $testname
+ return
+}
+if {![info exists nm_output(sym5)] || $nm_output(sym5) != 5} {
+ send_log "sym1 wrong\n"
+ verbose "sym1 wrong"
+ fail $testname
+ return
+}
+
+pass $testname
diff --git a/ld/testsuite/ld-scripts/extern.s b/ld/testsuite/ld-scripts/extern.s
new file mode 100644
index 0000000000..09cc1e1f7c
--- /dev/null
+++ b/ld/testsuite/ld-scripts/extern.s
@@ -0,0 +1 @@
+ .text
diff --git a/ld/testsuite/ld-scripts/extern.t b/ld/testsuite/ld-scripts/extern.t
new file mode 100644
index 0000000000..b2a012a322
--- /dev/null
+++ b/ld/testsuite/ld-scripts/extern.t
@@ -0,0 +1,14 @@
+
+EXTERN(sym1)
+EXTERN(sym2, sym3)
+EXTERN(sym4 sym5)
+
+PROVIDE(sym1 = 1);
+PROVIDE(sym2 = 2);
+PROVIDE(sym3 = 3);
+PROVIDE(sym4 = 4);
+PROVIDE(sym5 = 5);
+
+SECTIONS
+{
+}