* 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.
This commit is contained in:
Nathan Sidwell 2007-05-24 09:24:09 +00:00
parent 01be46b59d
commit 8545d1a9dd
8 changed files with 129 additions and 16 deletions

View File

@ -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.

View File

@ -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:

View File

@ -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;
}

View File

@ -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.

View File

@ -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")
}

View File

@ -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

View File

@ -0,0 +1 @@
.text

View File

@ -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
{
}