diff options
Diffstat (limited to 'ld/testsuite')
-rw-r--r-- | ld/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/memory.t | 39 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/script.exp | 110 |
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 +} + + |