# Copyright 2002-2004, 2007-2012 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 was written by Michael Snyder (msnyder@redhat.com)
# This is a test for the gdb command "generate-core-file".

# Single-threaded test case
standard_testfile pthreads.c
set objfile  $binfile.o
set corefile $binfile.test
set core0file ${binfile}0.test

if [istarget "*-*-linux"] then {
    set target_cflags "-D_MIT_POSIX_THREADS"
} else {
    set target_cflags ""
}

# Attempt to prevent -Wl,-z,relro which happens by default at least on
# Kubuntu-10.10.  Due to PR corefiles/11804 will then GDB be unable to find
# libpthread, therefore libthread_db will not fail as expected
# on the test `zeroed-threads cannot be listed'.

set opts [list debug]
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${objfile}" object $opts] != ""
    || ([gdb_compile_pthreads "${objfile}" "${binfile}" executable [concat $opts {additional_flags=-Wl,-z,norelro}] ] != ""
        && [gdb_compile_pthreads "${objfile}" "${binfile}" executable $opts] != "") } {
    return -1
}

# Now we can proceed with the real testing.

# Start with a fresh gdb.

clean_restart ${testfile}

# regexp for "horizontal" text (i.e. doesn't include newline or
# carriage return)
set horiz "\[^\n\r\]*"

# regexp for newline
set nl "\[\r\n\]+"

set timeout 30

gdb_test_multiple "help gcore" "help gcore" {
    -re "Undefined command: .gcore.*$gdb_prompt $" {
	# gcore command not supported -- nothing to test here.
	unsupported "gdb does not support gcore on this target"
	return -1;
    }
    -re "Save a core file .*$gdb_prompt $" {
	pass "help gcore"
    }
}

if { ! [ runto_main ] } then {
    untested gcore-thread.exp
    return -1
}

gdb_test_multiple "info threads" "threads are supported" {
    -re ".* main .*$gdb_prompt $" {
	# OK, threads are supported.
    }
    -re "${nl}$gdb_prompt $" {
	unsupported "gdb does not support threads on this target"
	return -1;
    }
}

# Make sure thread 1 is running
delete_breakpoints
gdb_breakpoint "thread1"
gdb_test "continue" "Continuing.*Breakpoint.* thread1 .*" "thread 1 is running"

# Make sure thread 2 is running
delete_breakpoints
gdb_breakpoint "thread2"
gdb_test "continue" "Continuing.*Breakpoint.* thread2 .*" "thread 2 is running"

# Drop corefile
set core_supported [gdb_gcore_cmd "$corefile" "save a corefile"]

if {!$core_supported} {
  return -1
}


# Test the uninitialized thread list.
# Provide the case of glibc td_thr_get_info handling of:
# /* Special case for the main thread before initialization.  */

foreach symbol {__stack_user stack_used} {
    set test "clear ${symbol}.next"
    gdb_test_multiple "p *(void **) &${symbol} = 0" $test {
	-re " = \\(void \\*\\) 0x0\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "No symbol \"${symbol}\" in current context\\.\r\n$gdb_prompt $" {
	    xfail $test
	    # Do not do the verification.
	    set core0file ""
	}
    }
}

if {"$core0file" != ""} {
    gdb_test "gcore $core0file" "Saved corefile .*" "save a zeroed-threads corefile"
}


# Now restart gdb and load the corefile.
clean_restart ${testfile}

proc load_core { corefile } {
    global gdb_prompt
    global libthread_db_seen

    gdb_test_multiple "core $corefile" \
	"re-load generated corefile" {
	    -re "\\\[Thread debugging using \[^ \r\n\]* enabled\\\]\r\n" {
		exp_continue
	    }
	    -re " is not a core dump:.*\r\n$gdb_prompt $" {
		fail "re-load generated corefile (bad file format)"
		# No use proceeding from here.
		return 0;
	    }
	    -re ": No such file or directory.*\r\n$gdb_prompt $" {
		fail "re-load generated corefile (file not found)"
		# No use proceeding from here.
		return 0;
	    }
	    -re "Couldn't find .* registers in core file.*\r\n$gdb_prompt $" {
		fail "re-load generated corefile (incomplete note section)"
	    }
	    -re "Core was generated by .*\r\n$gdb_prompt $" {
		pass "re-load generated corefile"
	    }
	}
    return 1
}

foreach name { corefile core0file } { with_test_prefix $name {
    if ![load_core [subst $$name]] {
	continue
    }

    # FIXME: now what can we test about the thread state?
    # We do not know for certain that there should be at least 
    # three threads, because who knows what kind of many-to-one
    # mapping various OS's may do?  Let's assume that there must
    # be at least two threads:

    gdb_test "info threads" ".*${nl}  2 ${horiz}${nl}\\* 1 .*" \
	    "corefile contains at least two threads"

    # One thread in the corefile should be in the "thread2" function.

    gdb_test "info threads" ".* thread2 .*" \
	    "a corefile thread is executing thread2"

    # The thread2 thread should be marked as the current thread.

    gdb_test "info threads" ".*${nl}\\* ${horiz} thread2 .*" \
	    "thread2 is current thread in corefile"
}}
