#   Copyright (C) 2000 Free Software Foundation, Inc.

# 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Various utilities for scanning assembler output, used by gcc-dg.exp and
# g++-dg.exp.

# Utility for scanning compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
proc scan-assembler { testcase pattern args } {
    global subdir

    set fd [open [file rootname $testcase].s r]
    set text [read $fd]
    close $fd

    set vmessage [concat $args]
    if { $vmessage == ""} {
	set vmessage $pattern
    }

    if [regexp -- $pattern $text] {
	pass "$subdir/$testcase scan-assembler $vmessage"
    } else {
	fail "$subdir/$testcase scan-assembler $vmessage"
    }
}

# Call pass if pattern is not present, otherwise fail.
proc scan-assembler-not { testcase pattern args } {
    global subdir

    set fd [open [file rootname $testcase].s r]
    set text [read $fd]
    close $fd

    set vmessage [concat $args]
    if { $vmessage == ""} {
	set vmessage $pattern
    }

    if ![regexp -- $pattern $text] {
	pass "$subdir/$testcase scan-assembler-not $vmessage"
    } else {
	fail "$subdir/$testcase scan-assembler-not $vmessage"
    }
}

# Utility for scanning demangled compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
proc scan-assembler-dem { testcase pattern args } {
    global subdir
    global cxxfilt
    global base_dir

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../c++filt $base_dir/../c++filt \
		     [findfile $base_dir/c++filt $base_dir/c++filt \
		      [transform c++filt]]]
	verbose -log "c++filt is $cxxfilt"
    }

    set fd [open "| $cxxfilt < [file rootname $testcase].s" r]
    set text [read $fd]
    close $fd

    set vmessage [concat $args]
    if { $vmessage == ""} {
	set vmessage $pattern
    }

    if [regexp -- $pattern $text] {
	pass "$subdir/$testcase scan-assembler $vmessage"
    } else {
	fail "$subdir/$testcase scan-assembler $vmessage"
    }
}

# Call pass if demangled pattern is not present, otherwise fail.
proc scan-assembler-dem-not { testcase pattern args } {
    global subdir
    global cxxfilt
    global base_dir

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../c++filt $base_dir/../c++filt \
		     [findfile $base_dir/c++filt $base_dir/c++filt \
		      [transform c++filt]]]
	verbose -log "c++filt is $cxxfilt"
    }

    set fd [open "| $cxxfilt < [file rootname $testcase].s" r]
    set text [read $fd]
    close $fd

    set vmessage [concat $args]
    if { $vmessage == ""} {
	set vmessage $pattern
    }

    if ![regexp -- $pattern $text] {
	pass "$subdir/$testcase scan-assembler-not $vmessage"
    } else {
	fail "$subdir/$testcase scan-assembler-not $vmessage"
    }
}
