From 746dcfd6a0c3e31c85454a1be271d513e46459f6 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 24 May 2007 09:24:09 +0000 Subject: [PATCH] * 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. --- ld/ChangeLog | 9 +++++ ld/ldgram.y | 27 ++++++++------- ld/ldlex.l | 14 ++++++-- ld/testsuite/ChangeLog | 6 ++++ ld/testsuite/ld-scripts/assert.t | 6 +++- ld/testsuite/ld-scripts/extern.exp | 68 ++++++++++++++++++++++++++++++++++++++ ld/testsuite/ld-scripts/extern.s | 1 + ld/testsuite/ld-scripts/extern.t | 14 ++++++++ 8 files changed, 129 insertions(+), 16 deletions(-) create mode 100644 ld/testsuite/ld-scripts/extern.exp create mode 100644 ld/testsuite/ld-scripts/extern.s create mode 100644 ld/testsuite/ld-scripts/extern.t diff --git a/ld/ChangeLog b/ld/ChangeLog index 0adf7c7b5..873fb4bad 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2007-05-24 Nathan Sidwell + + * 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 * ld.texinfo: Use @copying around the copyright notice. diff --git a/ld/ldgram.y b/ld/ldgram.y index 78d7165b0..b79fc6ad3 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 61fbe6d9b..88a8f1d65 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -256,7 +256,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "LOADADDR" { RTOKEN(LOADADDR);} "MAX" { RTOKEN(MAX_K); } "MIN" { RTOKEN(MIN_K); } -"ASSERT" { RTOKEN(ASSERT_K); } +"ASSERT" { RTOKEN(ASSERT_K); } "ENTRY" { RTOKEN(ENTRY);} "EXTERN" { RTOKEN(EXTERN);} "NEXT" { RTOKEN(NEXT);} @@ -363,11 +363,19 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* } -{FILENAMECHAR1}{FILENAMECHAR}* { +{FILENAMECHAR1}{FILENAMECHAR}* { yylval.name = xstrdup (yytext); return NAME; } -"-l"{FILENAMECHAR}+ { +"-l"{FILENAMECHAR}+ { + yylval.name = xstrdup (yytext + 2); + return LNAME; + } +{FILENAMECHAR1}{NOCFILENAMECHAR}* { + yylval.name = xstrdup (yytext); + return NAME; + } +"-l"{NOCFILENAMECHAR}+ { yylval.name = xstrdup (yytext + 2); return LNAME; } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 0eba59347..b5f29f788 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-05-24 Nathan Sidwell + + * 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 * 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 62aee34ed..c3caebddb 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 000000000..a613a757e --- /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 000000000..09cc1e1f7 --- /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 000000000..b2a012a32 --- /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 +{ +} -- 2.11.4.GIT