#   Copyright (C) 2000, 2002, 2003, 2005, 2007 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 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# 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]"
    }
}
