#   Copyright (C) 2000, 2002, 2003, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

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

load_lib scandump.exp

# 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 name of the dumped tree pass
# 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 } {
	# APPLE LOCAL begin Selective inlining of functions that use Altivec 3837835
	scan-dump "tree" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump "tree" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]"
	# APPLE LOCAL end Selective inlining of functions that use Altivec 3837835
    }
}

# 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 name of the dumped tree pass
# 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 } {
	# APPLE LOCAL begin Selective inlining of functions that use Altivec 3837835
	scan-dump-times "tree" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 2]" [lindex $args 3]
    } else {
	scan-dump-times "tree" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 2]"
	# APPLE LOCAL end Selective inlining of functions that use Altivec 3837835
    }
}

# Call pass if pattern is not present, otherwise fail.
#
# Argument 0 is the regexp to match
# Argument 1 is the name of the dumped tree pass
# 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 } {
	# APPLE LOCAL begin Selective inlining of functions that use Altivec 3837835
	scan-dump-not "tree" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-not "tree" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]"
	# APPLE LOCAL end Selective inlining of functions that use Altivec 3837835
    }
}

# 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 name of the dumped tree pass
# Argument 2 handles expected failures and the like
proc scan-tree-dump-dem { args } {

    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 } {
	# APPLE LOCAL begin Selective inlining of functions that use Altivec 3837835
	scan-dump-dem "tree" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-dem "tree" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]"
	# APPLE LOCAL end Selective inlining of functions that use Altivec 3837835
    }
}

# Call pass if demangled pattern is not present, otherwise fail.
#
# Argument 0 is the regexp to match
# Argument 1 is the name of the dumped tree pass
# Argument 2 handles expected failures and the like
proc scan-tree-dump-dem-not { args } {

    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 } {
	# APPLE LOCAL begin Selective inlining of functions that use Altivec 3837835
	scan-dump-dem-not "tree" [lindex $args 0] \
			  "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]" \
			  [lindex $args 2]
    } else {
	scan-dump-dem-not "tree" [lindex $args 0] \
			  "\[0-9\]\[0-9\]\[0-9\]\[ti\].[lindex $args 1]"
	# APPLE LOCAL end Selective inlining of functions that use Altivec 3837835
    }
}
