#   Copyright (C) 2000, 2002, 2003, 2005 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 ipa 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 ipa pass
# Argument 2 handles expected failures and the like
proc scan-ipa-dump { args } {

    if { [llength $args] < 2 } {
	error "scan-ipa-dump: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-ipa-dump: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump "ipa" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump "ipa" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]"
    }
}

# 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 ipa pass
# Argument 3 handles expected failures and the like
proc scan-ipa-dump-times { args } {

    if { [llength $args] < 3 } {
	error "scan-ipa-dump: too few arguments"
	return
    }
    if { [llength $args] > 4 } {
	error "scan-ipa-dump: too many arguments"
	return
    }
    if { [llength $args] >= 4 } {
	scan-dump-times "ipa" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 2]" [lindex $args 3]
    } else {
	scan-dump-times "ipa" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 2]"
    }
}

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

    if { [llength $args] < 2 } {
	error "scan-ipa-dump-not: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-ipa-dump-not: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump-not "ipa" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-not "ipa" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]"
    }
}

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

    if { [llength $args] < 2 } {
	error "scan-ipa-dump-dem: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-ipa-dump-dem: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump-dem "ipa" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-dem "ipa" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]"
    }
}

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

    if { [llength $args] < 2 } {
	error "scan-ipa-dump-dem-not: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-ipa-dump-dem-not: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump-dem-not "ipa" [lindex $args 0] \
			  "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]" \
			  [lindex $args 2]
    } else {
	scan-dump-dem-not "ipa" [lindex $args 0] \
			  "\[0-9\]\[0-9\]\[0-9\]i.[lindex $args 1]"
    }
}
