# Test literal coaslescing for Xtensa targets.
# By David Heine, Tensilica, Inc.
#   Copyright 2002, 2003, 2005, 2007, 2008
#   Free Software Foundation, Inc.
#
# 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.

if ![istarget "xtensa*-*-*"] {
    return
}

set testname "COALESCE"

set OBJDUMPFLAGS "-dr"

#
# default_ld_objdump
#	run objdump on a file
#
proc default_ld_objdump { objdump object outputfile } {
    global OBJDUMPFLAGS
    global objdump_output
    global host_triplet

    if {[which $objdump] == 0} then {
	perror "$objdump does not exist"
	return 0
    }

    if ![info exists OBJDUMPFLAGS] { set OBJDUMPFLAGS "" }

    verbose -log "$objdump $OBJDUMPFLAGS $object >$outputfile"

    catch "exec $objdump $OBJDUMPFLAGS $object >$outputfile" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
	return 1
    } else {
	verbose -log "$exec_output"
	perror "$object: objdump failed"
	return 0
    }
}


if ![ld_assemble $as $srcdir/$subdir/coalesce1.s tmpdir/coalesce1.o] {
    unresolved $testname
    return
}
if ![ld_assemble $as $srcdir/$subdir/coalesce2.s tmpdir/coalesce2.o] {
    unresolved $testname
    return
}

set object "tmpdir/coalesce"
set outputfile "$object.txt"

if ![ld_simple_link $ld $object "-T $srcdir/$subdir/coalesce.t tmpdir/coalesce1.o tmpdir/coalesce2.o"] {
    verbose -log "failure in ld"
    fail $testname
    return
} 

if ![default_ld_objdump $objdump $object $outputfile ] {
    verbose -log "failure in objdump"
    fail $testname
    return
} 

set file [open $outputfile r]
set found 0

while { [gets $file line] != -1 } {
    #	verbose "$line" 2
    if [regexp "^0000000c <main>:" $line] {
	set found 1
    }
}
close $file
if  $found  {
   pass $testname
} else {
   fail $testname
}

