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

    if { [llength $args] < 2 } {
	error "scan-rtl-dump: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-rtl-dump: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump "rtl" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]r.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump "rtl" [lindex $args 0] "\[0-9\]\[0-9\]\[0-9\]r.[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 rtl pass
# Argument 3 handles expected failures and the like
proc scan-rtl-dump-times { args } {

    if { [llength $args] < 3 } {
	error "scan-rtl-dump: too few arguments"
	return
    }
    if { [llength $args] > 4 } {
	error "scan-rtl-dump: too many arguments"
	return
    }
    if { [llength $args] >= 4 } {
	scan-dump-times "rtl" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]r.[lindex $args 2]" [lindex $args 3]
    } else {
	scan-dump-times "rtl" [lindex $args 0] [lindex $args 1] \
			"\[0-9\]\[0-9\]\[0-9\]r.[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 rtl pass
# Argument 2 handles expected failures and the like
proc scan-rtl-dump-not { args } {

    if { [llength $args] < 2 } {
	error "scan-rtl-dump-not: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-rtl-dump-not: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump-not "rtl" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]r.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-not "rtl" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]r.[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 rtl pass
# Argument 2 handles expected failures and the like
proc scan-rtl-dump-dem { args } {

    if { [llength $args] < 2 } {
	error "scan-rtl-dump-dem: too few arguments"
	return
    }
    if { [llength $args] > 3 } {
	error "scan-rtl-dump-dem: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	scan-dump-dem "rtl" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]r.[lindex $args 1]" [lindex $args 2]
    } else {
	scan-dump-dem "rtl" [lindex $args 0] \
		      "\[0-9\]\[0-9\]\[0-9\]r.[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 rtl pass
# Argument 2 handles expected failures and the like
proc scan-rtl-dump-dem-not { args } {

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