# Copyright (C) 2000-2014 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 assembler output, used by gcc-dg.exp and
# g++-dg.exp.

# Utility for scanning compiler result, invoked via dg-final.

# Transform newline and similar characters into their escaped form.
proc make_pattern_printable { pattern } {
    return [string map {\t \\t \n \\n \r \\r \\ \\\\} $pattern]
}

# Scan the OUTPUT_FILE for a pattern.  If it is present and POSITIVE
# is non-zero, or it is not present and POSITIVE is zero, the test
# passes.  The ORIG_ARGS is the list of arguments provided by dg-final
# to scan-assembler.  The first element in ORIG_ARGS is the regular
# expression to look for in the file.  The second element, if present,
# is a DejaGNU target selector.

proc dg-scan { name positive testcase output_file orig_args } {
    if { [llength $orig_args] < 1 } {
	error "$name: too few arguments"
        return
    }
    if { [llength $orig_args] > 2 } {
	error "$name: too many arguments"
	return
    }
    if { [llength $orig_args] >= 2 } {
	switch [dg-process-target [lindex $orig_args 1]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    set pattern [lindex $orig_args 0]
    set printable_pattern [make_pattern_printable $pattern]

    if { [is_remote host] } {
	remote_upload host "$output_file"
    } 
    set files [glob -nocomplain $output_file]
    if { $files == "" } {
	verbose -log "$testcase: output file does not exist"
	unresolved "$testcase $name $printable_pattern"
	return
    }
    set fd [open $output_file r]
    set text [read $fd]
    close $fd

    set match [regexp -- $pattern $text]
    if { $match == $positive } {
	pass "$testcase $name $printable_pattern"
    } else {
	fail "$testcase $name $printable_pattern"
    }
}

# Look for a pattern in the .s file produced by the compiler.  See
# dg-scan for details.

proc scan-assembler { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].s"
    dg-scan "scan-assembler" 1 $testcase $output_file $args
}

force_conventional_output_for scan-assembler

# Check that a pattern is not present in the .s file produced by the
# compiler.  See dg-scan for details.

proc scan-assembler-not { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].s"

    dg-scan "scan-assembler-not" 0 $testcase $output_file $args
}

force_conventional_output_for scan-assembler-not

# Return the scan for the assembly for hidden visibility. 

proc hidden-scan-for { symbol } {

    set objformat [gcc_target_object_format]

    switch $objformat {
        elf      { return "hidden\[ \t_\]*$symbol" }
        mach-o   { return "private_extern\[ \t_\]*_?$symbol" }
        default  { return "" }
    }

}


# Check that a symbol is defined as a hidden symbol in the .s file
# produced by the compiler.

proc scan-hidden { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].s"

    set symbol [lindex $args 0]

    set hidden_scan [hidden-scan-for $symbol]

    set args [lreplace $args 0 0 "$hidden_scan"]

    dg-scan "scan-hidden" 1 $testcase $output_file $args
}

# Check that a symbol is not defined as a hidden symbol in the .s file
# produced by the compiler.

proc scan-not-hidden { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].s"

    set symbol [lindex $args 0]
    set hidden_scan [hidden-scan-for $symbol]

    set args [lreplace $args 0 0 "$hidden_scan"]

    dg-scan "scan-not-hidden" 0 $testcase $output_file $args
}

# Look for a pattern in OUTPUT_FILE.  See dg-scan for details.

proc scan-file { output_file args } {
    set testcase [testname-for-summary]
    dg-scan "scan-file" 1 $testcase $output_file $args
}

# Check that a pattern is not present in the OUTPUT_FILE.  See dg-scan
# for details.

proc scan-file-not { output_file args } {
    set testcase [testname-for-summary]
    dg-scan "scan-file-not" 0 $testcase $output_file $args
}

# Look for a pattern in the .su file produced by the compiler.  See
# dg-scan for details.

proc scan-stack-usage { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].su"

    dg-scan "scan-file" 1 $testcase $output_file $args
}

# Check that a pattern is not present in the .su file produced by the
# compiler.  See dg-scan for details.

proc scan-stack-usage-not { args } {
    set testcase [testname-for-summary]
    set output_file "[file rootname [file tail $testcase]].su"

    dg-scan "scan-file-not" 0 $testcase $output_file $args
}

# Return the filename of the Ada spec corresponding to the argument.

proc get_ada_spec_filename { testcase } {
    # The name might include a list of options; extract the file name.
    set filename  [lindex $testcase 0]
    set tailname  [file tail $filename]
    set extension [string trimleft [file extension $tailname] {.}]
    regsub -all {\-} [file rootname $tailname] {_} rootname

    return [string tolower "${rootname}_${extension}.ads"]
}

# Look for a pattern in the .ads file produced by the compiler.  See
# dg-scan for details.

proc scan-ada-spec { args } {
    set testcase  [testname-for-summary]
    set output_file "[get_ada_spec_filename $testcase]"

    dg-scan "scan-file" 1 $testcase $output_file $args
}

# Check that a pattern is not present in the .ads file produced by the
# compiler.  See dg-scan for details.

proc scan-ada-spec-not { args } {
    set testcase  [testname-for-summary]
    set output_file "[get_ada_spec_filename $testcase]"

    dg-scan "scan-file-not" 0 $testcase $output_file $args
}

# Call pass if pattern is present given number of times, otherwise fail.
proc scan-assembler-times { args } {
    if { [llength $args] < 2 } {
	error "scan-assembler: too few arguments"
        return
    }
    if { [llength $args] > 3 } {
	error "scan-assembler: too many arguments"
	return
    }
    if { [llength $args] >= 3 } {
	switch [dg-process-target [lindex $args 2]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    set testcase [testname-for-summary]
    set pattern [lindex $args 0]
    set pp_pattern [make_pattern_printable $pattern]

    # This must match the rule in gcc-dg.exp.
    set output_file "[file rootname [file tail $testcase]].s"

    set files [glob -nocomplain $output_file]
    if { $files == "" } {
	verbose -log "$testcase: output file does not exist"
	unresolved "$testcase scan-assembler-times $pp_pattern [lindex $args 1]"
	return
    }

    set fd [open $output_file r]
    set text [read $fd]
    close $fd

    if { [llength [regexp -inline -all -- $pattern $text]] == [lindex $args 1]} {
	pass "$testcase scan-assembler-times $pp_pattern [lindex $args 1]"
    } else {
	fail "$testcase scan-assembler-times $pp_pattern [lindex $args 1]"
    }
}

force_conventional_output_for scan-assembler-times

# Utility for scanning demangled compiler result, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
proc scan-assembler-dem { args } {
    global cxxfilt
    global base_dir

    if { [llength $args] < 1 } {
	error "scan-assembler-dem: too few arguments"
        return
    }
    if { [llength $args] > 2 } {
	error "scan-assembler-dem: too many arguments"
	return
    }
    if { [llength $args] >= 2 } {
	switch [dg-process-target [lindex $args 1]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../../../binutils/cxxfilt \
		     $base_dir/../../../binutils/cxxfilt \
	             [findfile $base_dir/../../c++filt $base_dir/../../c++filt \
		      [findfile $base_dir/c++filt $base_dir/c++filt \
		       [transform c++filt]]]]
	verbose -log "c++filt is $cxxfilt"
    }

    set testcase [testname-for-summary]
    set pattern [lindex $args 0]
    set pp_pattern [make_pattern_printable $pattern]
    set output_file "[file rootname [file tail $testcase]].s"

    set files [glob -nocomplain $output_file]
    if { $files == "" } {
	verbose -log "$testcase: output file does not exist"
	unresolved "$testcase scan-assembler-dem $pp_pattern"
	return
    }

    set output [remote_exec host "$cxxfilt" "" "$output_file"]
    set text [lindex $output 1]

    if [regexp -- $pattern $text] {
	pass "$testcase scan-assembler-dem $pp_pattern"
    } else {
	fail "$testcase scan-assembler-dem $pp_pattern"
    }
}

# Call pass if demangled pattern is not present, otherwise fail.
proc scan-assembler-dem-not { args } {
    global cxxfilt
    global base_dir

    if { [llength $args] < 1 } {
	error "scan-assembler-dem-not: too few arguments"
        return
    }
    if { [llength $args] > 2 } {
	error "scan-assembler-dem-not: too many arguments"
	return
    }
    if { [llength $args] >= 2 } {
	switch [dg-process-target [lindex $args 1]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find c++filt like we find g++ in g++.exp.
    if ![info exists cxxfilt]  {
	set cxxfilt [findfile $base_dir/../../../binutils/cxxfilt \
		     $base_dir/../../../binutils/cxxfilt \
		     [findfile $base_dir/../../c++filt $base_dir/../../c++filt \
		      [findfile $base_dir/c++filt $base_dir/c++filt \
		       [transform c++filt]]]]
	verbose -log "c++filt is $cxxfilt"
    }

    set testcase [testname-for-summary]
    set pattern [lindex $args 0]
    set pp_pattern [make_pattern_printable $pattern]
    set output_file "[file rootname [file tail $testcase]].s"

    set files [glob -nocomplain $output_file]
    if { $files == "" } {
	verbose -log "$testcase: output file does not exist"
	unresolved "$testcase scan-assembler-dem-not $pp_pattern"
	return
    }

    set output [remote_exec host "$cxxfilt" "" "$output_file"]
    set text [lindex $output 1]

    if ![regexp -- $pattern $text] {
	pass "$testcase scan-assembler-dem-not $pp_pattern"
    } else {
	fail "$testcase scan-assembler-dem-not $pp_pattern"
    }
}

# Call pass if object size is ok, otherwise fail.
# example: /* { dg-final { object-size text <= 54 } } */
proc object-size { args } {
    global size
    global base_dir

    if { [llength $args] < 3 } {
	error "object-size: too few arguments"
        return
    }
    if { [llength $args] > 4 } {
	error "object-size: too many arguments"
	return
    }
    if { [llength $args] >= 4 } {
	switch [dg-process-target [lindex $args 3]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find size like we find g++ in g++.exp.
    if ![info exists size]  {
	set size [findfile $base_dir/../../../binutils/size \
		  $base_dir/../../../binutils/size \
		  [findfile $base_dir/../../size $base_dir/../../size \
		   [findfile $base_dir/size $base_dir/size \
		    [transform size]]]]
	verbose -log "size is $size"
    }

    set testcase [testname-for-summary]
    set what [lindex $args 0]
    set where [lsearch { text data bss total } $what]
    if { $where == -1 } {
        error "object-size: illegal argument: $what"
        return
    }
    set cmp [lindex $args 1]
    if { [lsearch { < > <= >= == != } $cmp] == -1 } {
        error "object-size: illegal argument: $cmp"
        return
    }
    set with [lindex $args 2]
    if ![string is integer $with ] {
        error "object-size: illegal argument: $with"
        return
    }

    set output_file "[file rootname [file tail $testcase]].o"
    if ![file_on_host exists $output_file] {
	verbose -log "$testcase: $output_file does not exist"
	unresolved "$testcase object-size $what $cmp $with"
	return
    }
    set output [remote_exec host "$size" "$output_file"]
    set status [lindex $output 0]
    if { $status != 0 } {
        verbose -log "$testcase object-size: $size failed"
        unresolved "$testcase object-size $what $cmp $with"
        return
    }

    set text [lindex $output 1]
    set lines [split $text "\n"]

    set line0 [lindex $lines 0]
    if ![regexp {^\s*text\s+data\s+bss\s+dec\s+hex\s+filename\s*$} $line0] {
        verbose -log "$testcase object-size: $size did not produce expected first line: $line0"
        unresolved "$testcase object-size $what $cmp $with"
        return
    }

    set line1 [lindex $lines 1]
    if ![regexp {^\s*\d+\s+\d+\s+\d+\s+\d+\s+[\da-fA-F]+\s+} $line1] {
        verbose -log "$testcase object-size: $size did not produce expected second line: $line1"
        unresolved "$testcase object-size $what $cmp $with"
        return
    }

    set actual [lindex $line1 $where]
    verbose -log "$what size is $actual"

    if [expr $actual $cmp $with] {
	pass "$testcase object-size $what $cmp $with"
    } else {
	fail "$testcase object-size $what $cmp $with"
    }
}

# Utility for testing that a function is defined on the current line.
# Call pass if so, otherwise fail.  Invoked directly; the file must
# have been compiled with -g -dA.
#
# Argument 0 is the current line, passed implicitly by dejagnu
# Argument 1 is the function to check
# Argument 2 handles expected failures and the like
# Argument 3 is "." to match the current line, or an integer to match
# an explicit line.
proc dg-function-on-line { args } {
    # Upvar from dg-final:
    upvar dg-final-code final-code

    set line [lindex $args 0]
    set symbol [lindex $args 1]
    set failures [lindex $args 2]

    if { [llength $args] >= 4 } {
	switch [lindex $args 3] {
	    "." { }
	    "default" { set line [lindex $args 3] }
	}
    }

    if { [istarget hppa*-*-*] } {
	set pattern [format {\t;[^:]+:%d\n(\t[^\t]+\n)+%s:\n\t.PROC} \
                     $line $symbol]
    } elseif { [istarget mips*-*-*] } {
	set pattern [format {\t\.loc [0-9]+ %d 0( [^\n]*)?\n(\t.cfi_startproc[^\t]*\n)*\t\.set\t(no)?mips16\n\t(\.set\t(no)?micromips\n\t)?\.ent\t%s\n\t\.type\t%s, @function\n%s:\n} \
		     $line $symbol $symbol $symbol]
    } else {
	set pattern [format {%s:[^\t]*(\t.(fnstart|frame|mask|file)[^\t]*)*\t[^:]+:%d\n} \
                     $symbol $line]
    }

    # The lack of spaces around $pattern is important, since they'd
    # become part of the regex scan-assembler tries to match.
    set cmd "scan-assembler {$pattern}"
    if { [llength $args] >= 3 } {
        set cmd "$cmd {$failures}"
    }

    append final-code "$cmd\n"
}
