# Test `info auxv' and related functionality.

# Copyright
#	1992,1993,1994,1995,1996,1997,1998,1999,2000,2004,2007,2008,2009,2010
#	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 this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is based on corefile.exp which was written by Fred
# Fish. (fnf@cygnus.com)

if { ! [istarget "*-*-linux*"] && ! [istarget "*-*-solaris*"] } {
    verbose "Skipping auxv.exp because of lack of support."
    return
}

if $tracelevel then {
	strace $tracelevel
}


set testfile "auxv"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set corefile ${objdir}/${subdir}/${testfile}.corefile
set gcorefile ${objdir}/${subdir}/${testfile}.gcore

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "couldn't compile ${srcdir}/${subdir}/${srcfile}"
    return -1
}

# Use a fresh directory to confine the native core dumps.
# Make it the working directory for gdb and its child.
set coredir "${objdir}/${subdir}/coredir.[getpid]"
file mkdir $coredir
set core_works [expr [isnative] && ! [is_remote target]]

# Run GDB on the test program up to where it will dump core.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set print sevenbit-strings"
gdb_test_no_output "set width 0"

if {$core_works} {
    if {[gdb_test "cd $coredir" ".*Working directory .*" \
	     "cd to temporary directory for core dumps"]} {
	set core_works 0
    }
}

if { ![runto_main] } then {
    gdb_suppress_tests;
}
set print_core_line [gdb_get_line_number "ABORT;"]
gdb_test "tbreak $print_core_line"
gdb_test continue ".*ABORT;.*"

proc fetch_auxv {test} {
    global gdb_prompt

    set auxv_lines {}
    set bad -1
    # Former trailing `\[\r\n\]+' may eat just \r leaving \n in the buffer
    # corrupting the next matches.
    if {[gdb_test_multiple "info auxv" $test {
	-re "info auxv\r\n" {
	    exp_continue
	}
	-ex "The program has no auxiliary information now" {
	    set bad 1
	    exp_continue
	}
	-ex "Auxiliary vector is empty" {
	    set bad 1
	    exp_continue
	}
	-ex "No auxiliary vector found" {
	    set bad 1
	    exp_continue
	}
	-re "^\[0-9\]+\[ \t\]+(AT_\[^ \t\]+)\[^\r\n\]+\r\n" {
	    lappend auxv_lines $expect_out(0,string)
	    exp_continue
	}
	-re "^\[0-9\]+\[ \t\]+\\?\\?\\?\[^\r\n\]+\r\n" {
	    warning "Unrecognized tag value: $expect_out(0,string)"
	    set bad 1
	    lappend auxv_lines $expect_out(0,string)
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    incr bad
	}
	-re "^\[^\r\n\]+\r\n" {
	    if {!$bad} {
		warning "Unrecognized output: $expect_out(0,string)"
		set bad 1
	    }
	    exp_continue
	}
    }] != 0} {
	return {}
    }

    if {$bad} {
	fail $test
	return {}
    }

    pass $test
    return $auxv_lines
}

set live_data [fetch_auxv "info auxv on live process"]

# Now try gcore.
set gcore_works 0
set escapedfilename [string_to_regexp $gcorefile]
gdb_test_multiple "gcore $gcorefile" "gcore" {
    -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" {
	pass "gcore"
	set gcore_works 1
    }
    -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" {
	unsupported "gcore"
    }
    -re "Undefined command: .*\[\r\n\]+$gdb_prompt $" {
	unsupported "gcore"
    }
}

# Let the program continue and die.
gdb_test continue ".*Program received signal.*"
gdb_test continue ".*Program terminated with signal.*"

# Now collect the core dump it left.
set test "generate native core dump"
if {$core_works} {
    # Find the
    set names [glob -nocomplain -directory $coredir *core*]
    if {[llength $names] == 1} {
	set file [file join $coredir [lindex $names 0]]
	remote_exec build "mv $file $corefile"
	pass $test
    } else {
	set core_works 0
	warning "can't generate a core file - core tests suppressed - check ulimit -c"
	fail $test
    }
} else {
    unsupported $test
}
remote_exec build "rm -rf $coredir"

# Now we can examine the core files and check that their data matches what
# we saw in the process.  Note that the exact data can vary between runs,
# so it's important that the native core dump file and the gcore-created dump
# both be from the same run of the program as we examined live.

proc do_core_test {works corefile test1 test2} {
    if {! $works} {
	unsupported $test1
	unsupported $test2
    } else {
	gdb_test "core $corefile" "Core was generated by.*" \
	    "load core file for $test1" \
	    "A program is being debugged already.*" "y"
	set core_data [fetch_auxv $test1]
	global live_data
	if {$core_data == $live_data} {
	    pass $test2
	} else {
	    fail $test2
	}
    }
}

do_core_test $core_works $corefile \
    "info auxv on native core dump" "matching auxv data from live and core"

do_core_test $gcore_works $gcorefile \
    "info auxv on gcore-created dump" "matching auxv data from live and gcore"
