#   Copyright (C) 2000, 2002, 2003 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 tree dump output, used by gcc-dg.exp and
# g++-dg.exp.
#
# This is largely borrowed from scanasm.exp.

# APPLE LOCAL begin lno
# Utility for diffing compiler result against an expected output file.
# Invoked via dg-final.  Call pass if there are no differences between
# the output of the compiler and the expected output file, otherwise
# fail.  The expected output file has the same name as the output
# file, and is stored in the same directory as the testcase.  
#
# Argument 0 is the suffix for the tree dump file
# Argument 1 handles expected failures and the like
proc diff-tree-dumps { args } {
    if { [llength $args] < 1 } {
	error "diff-tree-dumps: too few arguments"
        return
    }
    if { [llength $args] > 2 } {
	error "diff-tree-dumps:: too many arguments"
	return
    }
    if { [llength $args] >= 2 } {
	switch [dg-process-target [lindex $args 1]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # This assumes that we are two frames down from dg-test, and that
    # it still stores the filename of the testcase in a local variable "name".
    # A cleaner solution would require a new dejagnu release.
    upvar 2 prog testcase
    
    # This must match the rule in gcc-dg.exp.
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set new_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 0]]"
    set reference_file "[glob $testcase.[lindex $args 0]]"
    
    set test_result [diff $reference_file $new_file]
    
    if { $test_result == 1 } {
	pass "$testcase diff-tree-dumps [lindex $args 0]"
    } else {
	fail "$testcase diff-tree-dumps [lindex $args 0]"
	local_exec (diff $reference_file $new_file 0);
    }
}
# APPLE LOCAL end lno

# Utility for scanning compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 is the suffix for the tree dump file
# Argument 2 handles expected failures and the like
proc scan-tree-dump { args } {
    if { [llength $args] < 2 } {
	error "scan-tree-dump: too few arguments"
        return
    }
    if { [llength $args] > 3 } {
	error "scan-tree-dump: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	switch [dg-process-target [lindex $args 2]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # This assumes that we are two frames down from dg-test, and that
    # it still stores the filename of the testcase in a local variable "name".
    # A cleaner solution would require a new dejagnu release.
    upvar 2 name testcase

    # This must match the rule in gcc-dg.exp.
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set output_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 1]]"

    set fd [open $output_file r]
    set text [read $fd]
    close $fd

    if [regexp -- [lindex $args 0] $text] {
	pass "$testcase scan-tree-dump [lindex $args 0]"
    } else {
	fail "$testcase scan-tree-dump [lindex $args 0]"
    }
}

# Call pass if pattern is present given number of times, otherwise fail.
# Argument 0 is the regexp to match.
# Argument 1 is number of times the regexp must be found
# Argument 2 is the suffix for the tree dump file
# Argument 3 handles expected failures and the like
proc scan-tree-dump-times { args } {
    if { [llength $args] < 3 } {
	error "scan-tree-dump: too few arguments"
        return
    }
    if { [llength $args] > 4 } {
	error "scan-tree-dump: too many arguments"
	return
    }
    if { [llength $args] >= 4 } {
	switch [dg-process-target [lindex $args 3]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # This assumes that we are two frames down from dg-test, and that
    # it still stores the filename of the testcase in a local variable "name".
    # A cleaner solution would require a new dejagnu release.
    upvar 2 name testcase

    # This must match the rule in gcc-dg.exp.
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set output_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 2]]"

    set fd [open $output_file r]
    set text [read $fd]
    close $fd

    if { [llength [regexp -inline -all -- [lindex $args 0] $text]] == [lindex $args 1]} {
	pass "$testcase scan-tree-dump-times [lindex $args 0] [lindex $args 1]"
    } else {
	fail "$testcase scan-tree-dump-times [lindex $args 0] [lindex $args 1]"
    }
}

# Call pass if pattern is not present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 is the suffix for the tree dump file
# Argument 2 handles expected failures and the like
proc scan-tree-dump-not { args } {
    if { [llength $args] < 2 } {
	error "scan-tree-dump-not: too few arguments"
        return
    }
    if { [llength $args] > 3 } {
	error "scan-tree-dump-not: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	switch [dg-process-target [lindex $args 2]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    upvar 2 name testcase
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set output_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 1]]"

    set fd [open $output_file r]
    set text [read $fd]
    close $fd

    if ![regexp -- [lindex $args 0] $text] {
	pass "$testcase scan-tree-dump-not [lindex $args 0]"
    } else {
	fail "$testcase scan-tree-dump-not [lindex $args 0]"
    }
}

# Utility for scanning demangled compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 is the suffix for the tree dump file
# Argument 2 handles expected failures and the like
proc scan-tree-dump-dem { args } {
    global cxxfilt
    global base_dir

    if { [llength $args] < 2 } {
	error "scan-tree-dump-dem: too few arguments"
        return
    }
    if { [llength $args] > 3 } {
	error "scan-tree-dump-dem: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	switch [dg-process-target [lindex $args 2]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../../binutils/cxxfilt \
		     $base_dir/../../binutils/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"
    }

    upvar 2 name testcase
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set output_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 1]]"

    set fd [open "| $cxxfilt < $output_file" r]
    set text [read $fd]
    close $fd

    if [regexp -- [lindex $args 0] $text] {
	pass "$testcase scan-tree-dump-dem [lindex $args 0]"
    } else {
	fail "$testcase scan-tree-dump-dem [lindex $args 0]"
    }
}

# Call pass if demangled pattern is not present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 is the suffix for the tree dump file
# Argument 2 handles expected failures and the like
proc scan-tree-dump-dem-not { args } {
    global cxxfilt
    global base_dir

    if { [llength $args] < 2 } {
	error "scan-tree-dump-dem-not: too few arguments"
        return
    }
    if { [llength $args] > 3 } {
	error "scan-tree-dump-dem-not: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	switch [dg-process-target [lindex $args 2]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../../binutils/cxxfilt \
		     $base_dir/../../binutils/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"
    }

    upvar 2 name testcase
    # APPLE LOCAL <rdar://problem/3837835> Selective inlining of functions that use Altivec
    set output_file "[glob [file tail $testcase].\[ti\]??.[lindex $args 1]]"

    set fd [open "| $cxxfilt < $output_file" r]
    set text [read $fd]
    close $fd

    if ![regexp -- [lindex $args 0] $text] {
	pass "$testcase scan-tree-dump-dem-not [lindex $args 0]"
    } else {
	fail "$testcase scan-tree-dump-dem-not [lindex $args 0]"
    }
}
