* ld-elf/sec-to-seg.exp: New test: Checks the assignment of
authorNick Clifton <nickc@redhat.com>
Wed, 30 Jul 2008 10:28:31 +0000 (10:28 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 30 Jul 2008 10:28:31 +0000 (10:28 +0000)
        sections to segments.
        * ld-elf/sec-to-seg1.s: Test source file.
        * ld-elf/sec-to-seg2.s: Test source file.
        * ld-elf/sec-to-seg-script-same-page.t: Test linker script.
        * ld-elf/sec-to-seg-script-adjoining-pages.t: Test linker script.
        * ld-elf/sec-to-seg-script-disjoint-pages.t: Test linker script.

ld/testsuite/ChangeLog
ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t [new file with mode: 0644]
ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t [new file with mode: 0644]
ld/testsuite/ld-elf/sec-to-seg-script-same-page.t [new file with mode: 0644]
ld/testsuite/ld-elf/sec-to-seg.exp [new file with mode: 0644]
ld/testsuite/ld-elf/sec-to-seg1.s [new file with mode: 0644]
ld/testsuite/ld-elf/sec-to-seg2.s [new file with mode: 0644]

index 6d881ca..93a5e41 100644 (file)
@@ -1,3 +1,13 @@
+2008-07-30  Nick Clifton  <nickc@redhat.com>
+
+       * ld-elf/sec-to-seg.exp: New test: Checks the assignment of
+       sections to segments.
+       * ld-elf/sec-to-seg1.s: Test source file.
+       * ld-elf/sec-to-seg2.s: Test source file.
+       * ld-elf/sec-to-seg-script-same-page.t: Test linker script.
+       * ld-elf/sec-to-seg-script-adjoining-pages.t: Test linker script.
+       * ld-elf/sec-to-seg-script-disjoint-pages.t: Test linker script.
+
 2008-07-28  Alexandre Oliva  <aoliva@redhat.com>
 
        * ld-i386/tlsbindesc.dd: Adjust incorrect expectations for LD to
diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t b/ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t
new file mode 100644 (file)
index 0000000..763fcb7
--- /dev/null
@@ -0,0 +1,11 @@
+SECTIONS
+{
+  . = 0x1000;
+  .sec1 : { *sec-to-seg1.o(.rodata) }
+  . += CONSTANT(MAXPAGESIZE);
+  .sec2  : { *sec-to-seg2.o(.rodata) }
+
+  .data : { *(.data) } /* For hppa64.  */
+  
+  /DISCARD/    : {*(*) }
+}
diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t b/ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t
new file mode 100644 (file)
index 0000000..25023cc
--- /dev/null
@@ -0,0 +1,11 @@
+SECTIONS
+{
+  . = 0x1000;
+  .sec1 : { *sec-to-seg1.o(.rodata) }
+  . += CONSTANT(MAXPAGESIZE) * 2;
+  .sec2  : { *sec-to-seg2.o(.rodata) }
+
+  .data : { *(.data) } /* For hppa64.  */
+  
+  /DISCARD/    : {*(*) }
+}
diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-same-page.t b/ld/testsuite/ld-elf/sec-to-seg-script-same-page.t
new file mode 100644 (file)
index 0000000..2b50f7e
--- /dev/null
@@ -0,0 +1,10 @@
+SECTIONS
+{
+  . = 0x1000;
+  .sec1 : { *sec-to-seg1.o(.rodata) }
+  .sec2 : { *sec-to-seg2.o(.rodata) }
+
+  .data : { *(.data) } /* For hppa64.  */
+
+  /DISCARD/ : {*(*) }
+}
diff --git a/ld/testsuite/ld-elf/sec-to-seg.exp b/ld/testsuite/ld-elf/sec-to-seg.exp
new file mode 100644 (file)
index 0000000..a576fce
--- /dev/null
@@ -0,0 +1,97 @@
+# Test the assigment of sections to segments.
+#
+# Copyright 2008   Free Software Foundation, Inc.
+# Contributed by Red Hat.
+#
+# This file is part of the GNU Binutils.
+#
+# This program 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 3 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 "assignment of ELF sections to segments"
+
+if {! [is_elf_format] } {
+    unsupported $testname
+    return
+}
+
+if {   ! [ld_assemble $as $srcdir/$subdir/sec-to-seg1.s tmpdir/sec-to-seg1.o]
+    || ! [ld_assemble $as $srcdir/$subdir/sec-to-seg2.s tmpdir/sec-to-seg2.o]} then {
+    unresolved $testname
+    return
+}
+
+proc sec_to_seg_test { testname scriptname same_seg } {
+    global srcdir
+    global subdir
+    global ld
+    global exec_output
+    global READELF
+    
+    if {! [ld_simple_link $ld tmpdir/sec-to-seg "-T $srcdir/$subdir/$scriptname tmpdir/sec-to-seg1.o tmpdir/sec-to-seg2.o"] } then {
+       fail $testname
+       return 0
+    }
+
+    send_log "$READELF --program-headers --section-headers tmpdir/sec-to-seg\n"
+    set exec_output [run_host_cmd "$READELF" "--program-headers --section-headers tmpdir/sec-to-seg"]
+
+    if { $same_seg == 1 } {
+      if {! [regexp ".*.sec1 .sec2" $exec_output] } {
+         fail $testname
+         return 0
+      }
+    } else {
+      if {  [regexp ".*.sec1 .sec2" $exec_output] } {
+         fail $testname
+         return 0
+      }
+    }
+
+    pass $testname
+    return 1
+}
+
+# Assuming a pagesize of 0x1000 then:
+#
+# Test  Sec1 End  Sec 2 Start    Expected Result
+# ----  --------  -----------    ---------------
+#  A    00001042   00001043      Both sections on same page: assign to same segment.
+#  B    00001042   00002044      Sections on adjacent pages: assign to same segment.
+#  C    00001042   00003044      Sections on disjoint pages: assign to separate segments.
+
+# These targets have a pagesize of 1, so they will always end up
+# placing the two sections in separate segments in the B test.
+if {    [istarget avr-*-*]
+     || [istarget cr16-*-*]
+     || [istarget crx-*-*]
+     || [istarget dlx-*-*]
+     || [istarget h8300-*-*]
+     || [istarget ip2k-*-*]
+     || [istarget m32r-*-*]
+     || [istarget m88k-*-*]
+     || [istarget msp430-*-*]
+    } {
+    set B_test_same_seg 0
+} else {
+    set B_test_same_seg 1
+}
+
+sec_to_seg_test "assignment of ELF sections to segments (same page)"      "sec-to-seg-script-same-page.t" 1
+sec_to_seg_test "assignment of ELF sections to segments (adjacent pages)" "sec-to-seg-script-adjoining-pages.t" $B_test_same_seg
+sec_to_seg_test "assignment of ELF sections to segments (disjoint pages)" "sec-to-seg-script-disjoint-pages.t" 0
+
+
+# FIXME: Add more tests to check other rules of section to segment assignment.
diff --git a/ld/testsuite/ld-elf/sec-to-seg1.s b/ld/testsuite/ld-elf/sec-to-seg1.s
new file mode 100644 (file)
index 0000000..7c9f479
--- /dev/null
@@ -0,0 +1,9 @@
+       .file   "sec-to-seg1.s"
+
+       .section        .rodata
+       .align  2
+       .ascii  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\000"
+       .align  2
+       .ascii  "00000000000000000000000000000000\000"
+
+
diff --git a/ld/testsuite/ld-elf/sec-to-seg2.s b/ld/testsuite/ld-elf/sec-to-seg2.s
new file mode 100644 (file)
index 0000000..b1dd078
--- /dev/null
@@ -0,0 +1,13 @@
+       .file   "sec-to-seg2.s"
+
+       .section        .rodata
+       .align  2
+       .ascii  "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\000"
+       .align  2
+       .ascii  "55555555555555555555555555555555\000"
+       .align  2
+       .ascii  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\000"
+       .align  2
+       .ascii  "99999999999999999999999999999999\000"
+
+