* ldlex.l: ASSERT is recognized in SCRIPT env. NAMES cannot
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 24 May 2007 09:24:09 +0000 (09:24 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Thu, 24 May 2007 09:24:09 +0000 (09:24 +0000)
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
ld/ldgram.y
ld/ldlex.l
ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/assert.t
ld/testsuite/ld-scripts/extern.exp [new file with mode: 0644]
ld/testsuite/ld-scripts/extern.s [new file with mode: 0644]
ld/testsuite/ld-scripts/extern.t [new file with mode: 0644]

index 0adf7c7..873fb4b 100644 (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.
index 78d7165..b79fc6a 100644 (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:
index 61fbe6d..88a8f1d 100644 (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;
                                }
index 0eba593..b5f29f7 100644 (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.
index 62aee34..c3caebd 100644 (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")
 }
diff --git a/ld/testsuite/ld-scripts/extern.exp b/ld/testsuite/ld-scripts/extern.exp
new file mode 100644 (file)
index 0000000..a613a75
--- /dev/null
@@ -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 (file)
index 0000000..09cc1e1
--- /dev/null
@@ -0,0 +1 @@
+       .text
diff --git a/ld/testsuite/ld-scripts/extern.t b/ld/testsuite/ld-scripts/extern.t
new file mode 100644 (file)
index 0000000..b2a012a
--- /dev/null
@@ -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
+{
+}