Index: ld/NEWS =================================================================== RCS file: /cvs/src/src/ld/NEWS,v retrieving revision 1.54 diff -c -3 -p -r1.54 NEWS *** ld/NEWS 8 Nov 2004 13:17:24 -0000 1.54 --- ld/NEWS 19 Nov 2004 09:24:01 -0000 *************** *** 1,5 **** --- 1,8 ---- -*- text -*- + * New linker script functions: ORIGIN() and LENGTH() which return information + about a specified memory region. + * Port to MAXQ processor contributed by HCL Tech. * Added SEGMENT_START to the linker script language to permit the user to Index: ld/testsuite/ld-scripts/script.exp =================================================================== RCS file: /cvs/src/src/ld/testsuite/ld-scripts/script.exp,v retrieving revision 1.6 diff -c -3 -p -r1.6 script.exp *** ld/testsuite/ld-scripts/script.exp 18 Nov 2002 08:28:41 -0000 1.6 --- ld/testsuite/ld-scripts/script.exp 19 Nov 2004 09:24:04 -0000 *************** proc check_script { } { *** 31,77 **** if ![ld_nm $nm "" tmpdir/script] { unresolved $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 ! } } } } ! } } } --- 31,93 ---- 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 { ! fail $testname } } *************** if {[istarget "*-*-pe*"] \ *** 81,87 **** || [istarget "*-*-cygwin*"] \ || [istarget "*-*-mingw32*"] \ || [istarget "*-*-winnt*"] \ ! || [istarget "*-*-nt*"] \ || [istarget "*-*-interix*"] } then { set flags "--image-base 0" } --- 97,103 ---- || [istarget "*-*-cygwin*"] \ || [istarget "*-*-mingw32*"] \ || [istarget "*-*-winnt*"] \ ! || [istarget "*-*-nt"] \ || [istarget "*-*-interix*"] } then { set flags "--image-base 0" } *************** if ![ld_simple_link $ld tmpdir/script "$ *** 99,101 **** --- 115,127 ---- } 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 + } + + Index: ld/testsuite/ld-scripts/memory.t =================================================================== 0a1,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); > }