#   Copyright (C) 2000-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 ltrans 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-ltrans-tree-dump { args } {

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

# 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-ltrans-tree-dump-times { args } {

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

# 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-ltrans-tree-dump-not { args } {

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

# 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-ltrans-tree-dump-dem { args } {

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

# 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-ltrans-tree-dump-dem-not { args } {

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