aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite')
-rw-r--r--ld/testsuite/ChangeLog8
-rw-r--r--ld/testsuite/ld-scripts/memory.t39
-rw-r--r--ld/testsuite/ld-scripts/script.exp110
3 files changed, 115 insertions, 42 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index ee6081d..c54dd11 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2004-11-19 Nick Clifton <nickc@redhat.com>
+
+ * ld-scripts/script.exp: Add test of memory linker script.
+ Reorganise code to remove unnecessary indentation.
+ Fix target tests to avoid using --image-base with *-nto targets.
+ * ld-scripts/memory.t: New linker script to test the MEMORY
+ section and the ORIGIN and LENGTH operators.
+
2004-11-17 Daniel Jacobowitz <dan@codesourcery.com>
* ld-arm/mixed-app.d, ld-arm/mixed-app.r, ld-arm/mixed-app.s,
diff --git a/ld/testsuite/ld-scripts/memory.t b/ld/testsuite/ld-scripts/memory.t
new file mode 100644
index 0000000..8a73c58
--- /dev/null
+++ b/ld/testsuite/ld-scripts/memory.t
@@ -0,0 +1,39 @@
+MEMORY
+{
+ TEXTMEM (ARX) : ORIGIN = 0x100, LENGTH = 32K
+ DATAMEM (AW) : org = 0x1000, l = (64 * 1024)
+}
+
+SECTIONS
+{
+ . = 0;
+ .text :
+ {
+ /* The value returned by the ORIGIN operator is a constant.
+ However it is being assigned to a symbol declared within
+ a section. Therefore the symbol is section-relative and
+ its value will include the offset of that section from
+ the start of memory. ie the declaration:
+ text_start = ORIGIN (TEXTMEM);
+ here will result in text_start having a value of 0x200.
+ Hence we need to subtract the absolute value of the
+ location counter at this point in order to give text_start
+ a value that is truely absolute, and which coincidentally
+ will allow the tests in script.exp to work. */
+
+ text_start = ORIGIN(TEXTMEM) - ABSOLUTE (.);
+ *(.text)
+ *(.pr)
+ text_end = .;
+ } > TEXTMEM
+
+ data_start = ORIGIN (DATAMEM);
+ .data :
+ {
+ *(.data)
+ *(.rw)
+ data_end = .;
+ } >DATAMEM
+
+ fred = ORIGIN(DATAMEM) + LENGTH(DATAMEM);
+}
diff --git a/ld/testsuite/ld-scripts/script.exp b/ld/testsuite/ld-scripts/script.exp
index 96cf04b..866d128 100644
--- a/ld/testsuite/ld-scripts/script.exp
+++ b/ld/testsuite/ld-scripts/script.exp
@@ -1,6 +1,6 @@
# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
-# Copyright 2001
+# Copyright 2001, 2004
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@@ -31,47 +31,63 @@ proc check_script { } {
if ![ld_nm $nm "" tmpdir/script] {
unresolved $testname
+ return
+ }
+
+ if {![info exists nm_output(text_start)] \
+ || ![info exists nm_output(text_end)] \
+ || ![info exists nm_output(data_start)] \
+ || ![info exists nm_output(data_end)]} {
+ send_log "bad output from nm\n"
+ verbose "bad output from nm"
+ fail $testname
+ return
+ }
+
+ set passes 1
+ set text_end 0x104
+ set data_end 0x1004
+
+ if [istarget *c4x*-*-*] then {
+ set text_end 0x101
+ set data_end 0x1001
+ }
+
+ if [istarget *c54x*-*-*] then {
+ set text_end 0x102
+ set data_end 0x1002
+ }
+
+ if {$nm_output(text_start) != 0x100} {
+ send_log "text_start == $nm_output(text_start)\n"
+ verbose "text_start == $nm_output(text_start)"
+ set passes 0
+ }
+
+ if {$nm_output(text_end) < $text_end \
+ || $nm_output(text_end) > 0x110} {
+ send_log "text_end == $nm_output(text_end)\n"
+ verbose "text_end == $nm_output(text_end)"
+ set passes 0
+ }
+
+ if {$nm_output(data_start) != 0x1000} {
+ send_log "data_start == $nm_output(data_start)\n"
+ verbose "data_start == $nm_output(data_start)"
+ set passes 0
+ }
+
+ if {$nm_output(data_end) < $data_end \
+ || $nm_output(data_end) > 0x1010} {
+ send_log "data_end == $nm_output(data_end)\n"
+ verbose "data_end == $nm_output(data_end)"
+ set passes 0
+ }
+
+ if { $passes } {
+ pass $testname
} else {
- if {![info exists nm_output(text_start)] \
- || ![info exists nm_output(text_end)] \
- || ![info exists nm_output(data_start)] \
- || ![info exists nm_output(data_end)]} {
- send_log "bad output from nm\n"
- verbose "bad output from nm"
- fail $testname
- } else {
- set text_end 0x104
- set data_end 0x1004
- if [istarget *c4x*-*-*] then {
- set text_end 0x101
- set data_end 0x1001
- }
- if [istarget *c54x*-*-*] then {
- set text_end 0x102
- set data_end 0x1002
- }
- if {$nm_output(text_start) != 0x100} {
- send_log "text_start == $nm_output(text_start)\n"
- verbose "text_start == $nm_output(text_start)"
- fail $testname
- } else { if {$nm_output(text_end) < $text_end \
- || $nm_output(text_end) > 0x110} {
- send_log "text_end == $nm_output(text_end)\n"
- verbose "text_end == $nm_output(text_end)"
- fail $testname
- } else { if {$nm_output(data_start) != 0x1000} {
- send_log "data_start == $nm_output(data_start)\n"
- verbose "data_start == $nm_output(data_start)"
- fail $testname
- } else { if {$nm_output(data_end) < $data_end \
- || $nm_output(data_end) > 0x1010} {
- send_log "data_end == $nm_output(data_end)\n"
- verbose "data_end == $nm_output(data_end)"
- fail $testname
- } else {
- pass $testname
- } } } }
- }
+ fail $testname
}
}
@@ -81,7 +97,7 @@ if {[istarget "*-*-pe*"] \
|| [istarget "*-*-cygwin*"] \
|| [istarget "*-*-mingw32*"] \
|| [istarget "*-*-winnt*"] \
- || [istarget "*-*-nt*"] \
+ || [istarget "*-*-nt"] \
|| [istarget "*-*-interix*"] } then {
set flags "--image-base 0"
}
@@ -99,3 +115,13 @@ if ![ld_simple_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t"] {
} else {
check_script
}
+
+set testname "MEMORY"
+
+if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir/script.o"] {
+ fail $testname
+} else {
+ check_script
+}
+
+