* ldlang.c (map_input_to_output_sections): Initialize sections
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 19 Feb 2004 14:08:31 +0000 (14:08 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Thu, 19 Feb 2004 14:08:31 +0000 (14:08 +0000)
mentioned in a data statement expression.
(lang_do_assignments_1): Add data statement's expression's
section's vma.
* ld-scripts/data.{s,t,d,exp}: New.

ld/ChangeLog
ld/ldlang.c
ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/data.d [new file with mode: 0644]
ld/testsuite/ld-scripts/data.exp [new file with mode: 0644]
ld/testsuite/ld-scripts/data.s [new file with mode: 0644]
ld/testsuite/ld-scripts/data.t [new file with mode: 0644]

index fc4b1be..3b3516e 100644 (file)
@@ -1,3 +1,10 @@
+2004-02-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ldlang.c (map_input_to_output_sections): Initialize sections
+       mentioned in a data statement expression.
+       (lang_do_assignments_1): Add data statement's expression's
+       section's vma.
+
 2004-02-18  Nathan Sidwell  <nathan@codesourcery.com>
 
        * ldgram.y (statement_anywhere): Add assert rule.
index 487ee02..a25f5f3 100644 (file)
@@ -2098,10 +2098,14 @@ map_input_to_output_sections
                                        target,
                                        output_section_statement);
          break;
+       case lang_data_statement_enum:
+         /* Make sure that any sections mentioned in the expression
+            are initialized.  */
+         exp_init_os (s->data_statement.exp);
+         /* FALLTHROUGH */
        case lang_fill_statement_enum:
        case lang_input_section_enum:
        case lang_object_symbols_statement_enum:
-       case lang_data_statement_enum:
        case lang_reloc_statement_enum:
        case lang_padding_statement_enum:
        case lang_input_statement_enum:
@@ -3375,9 +3379,10 @@ lang_do_assignments_1
            value = exp_fold_tree (s->data_statement.exp,
                                   abs_output_section,
                                   lang_final_phase_enum, dot, &dot);
-           s->data_statement.value = value.value;
            if (!value.valid_p)
              einfo (_("%F%P: invalid data statement\n"));
+           s->data_statement.value
+             = value.value + value.section->bfd_section->vma;
          }
          {
            unsigned int size;
index 282ee0c..23e41a9 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-scripts/data.{s,t,d,exp}: New.
+
 2004-02-18  Nathan Sidwell  <nathan@codesourcery.com>
 
        * ld-scripts/assert.{s,t,exp}: New.
diff --git a/ld/testsuite/ld-scripts/data.d b/ld/testsuite/ld-scripts/data.d
new file mode 100644 (file)
index 0000000..6284686
--- /dev/null
@@ -0,0 +1,9 @@
+#source: data.s
+#ld: -T data.t
+#objdump: -s -j .text
+
+.*:     file format .*
+
+Contents of section .text:
+ 1000 (0410)?0000(1004)? (0810)?0000(1008)? +........ *
+#pass
diff --git a/ld/testsuite/ld-scripts/data.exp b/ld/testsuite/ld-scripts/data.exp
new file mode 100644 (file)
index 0000000..9cca01a
--- /dev/null
@@ -0,0 +1,20 @@
+# Test DATA STATEMENT in a linker script.
+# By Nathan Sidwell, CodeSourcery LLC
+#   Copyright 2004
+#   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+run_dump_test data
diff --git a/ld/testsuite/ld-scripts/data.s b/ld/testsuite/ld-scripts/data.s
new file mode 100644 (file)
index 0000000..0517ffe
--- /dev/null
@@ -0,0 +1 @@
+#nothing here
diff --git a/ld/testsuite/ld-scripts/data.t b/ld/testsuite/ld-scripts/data.t
new file mode 100644 (file)
index 0000000..359a02f
--- /dev/null
@@ -0,0 +1,10 @@
+SECTIONS
+{
+  .text 0x1000 :
+   {
+     LONG (label)
+     label = .;
+     LONG (ADDR (.other))
+   }
+   .other : {}
+}