# Test `info auxv' and related functionality.

# Copyright 1992,1993,1994,1995,1996,1997,1998,1999,2000,2004,2007,2008
#	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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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 prms_id 0
set bug_id 0

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 "set print sevenbit-strings" "" \
	"set print sevenbit-strings; ${testfile}"
gdb_test "set width 0" "" \
	"set width 0; ${testfile}"

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
    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"
