#   Copyright (C) 2006-2022 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]" ""
    }
}

force_conventional_output_for scan-rtl-dump

# 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-times: too few arguments"
	return
    }
    if { [llength $args] > 4 } {
	error "scan-rtl-dump-times: 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]" ""
    }
}

force_conventional_output_for scan-rtl-dump-times

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

force_conventional_output_for scan-rtl-dump-not

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

force_conventional_output_for scan-rtl-dump-dem

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

force_conventional_output_for scan-rtl-dump-dem-not
