diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2007-05-24 09:24:09 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@codesourcery.com> | 2007-05-24 09:24:09 +0000 |
commit | 8545d1a9dd556efc7950409426bd70d439fa43d8 (patch) | |
tree | 86699d55d009b454b4e0120f2e133efc39d55f09 | |
parent | 01be46b59d2e1078ccc0e69a3d5853b9d39a882b (diff) | |
download | gdb-8545d1a9dd556efc7950409426bd70d439fa43d8.zip gdb-8545d1a9dd556efc7950409426bd70d439fa43d8.tar.gz gdb-8545d1a9dd556efc7950409426bd70d439fa43d8.tar.bz2 |
* 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.
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/ldgram.y | 27 | ||||
-rw-r--r-- | ld/ldlex.l | 14 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/assert.t | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/extern.exp | 68 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/extern.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/extern.t | 14 |
8 files changed, 129 insertions, 16 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 0adf7c7..873fb4b 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 78d7165..b79fc6a 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: @@ -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 0eba593..b5f29f7 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 62aee34..c3caebd 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 0000000..a613a75 --- /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 0000000..09cc1e1 --- /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 0000000..b2a012a --- /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 +{ +} |