# Copyright 2015-2021 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/>.

# Test ability to load an elf64-i386 core file.  The provided core file was
# elf64-x8664 one but it got binary patched to i386:
# Elf32_Ehdr.e_machine @0x12..0x13
# Elf64_Ehdr.e_machine @0x12..0x13
# #define EM_386           3              /* Intel 80386 */
# #define EM_X86_64       62              /* AMD x86-64 architecture */
# patch @0x12: 0x3E -> 0x03

if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } then {
    verbose "Skipping i386 biarch core test."
    return
}

standard_testfile

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

set test "complete set gnutarget"
gdb_test_multiple "complete set gnutarget " $test {
    -re "set gnutarget elf64-little\r\n(.*\r\n)?$gdb_prompt $" {
	pass $test
    }
    -re "\r\n$gdb_prompt $" {
	pass $test
	untested ".text is readable"
	return
    }
}

set corebz2file ${srcdir}/${subdir}/${testfile}.core.bz2
set corefile [standard_output_file ${testfile}.core]
# Entry point of the original executable.
set address 0x400078

if {[catch "system \"bzip2 -dc ${corebz2file} >${corefile}\""] != 0} {
    untested "failed bzip2"
    return -1
}
file stat ${corefile} corestat
if {$corestat(size) != 102400} {
    untested "bzip2 produces invalid result"
    return -1
}

# First check if this particular GDB supports i386, otherwise we should not
# expect the i386 core file to be loaded successfully.
set supports_arch_i386 1
set test "complete set architecture i386"
gdb_test_multiple $test $test {
    -re "\r\nset architecture i386\r\n(.*\r\n)?$gdb_prompt $" {
    }
    -re "\r\n$gdb_prompt $" {
        set supports_arch_i386 0
    }
}

# Wrongly built GDB complains by:
# "..." is not a core dump: File format not recognized
# As the provided test core has 64bit PRSTATUS i386 built GDB cannot parse it.
# This is just a problem of the test case, real-world elf64-i386 file will have
# 32bit PRSTATUS.  One cannot prepare elf64-i386 core file from elf32-i386 by
# objcopy as it corrupts the core file beyond all recognition.
# The output therefore does not matter much, just we should not get GDB
# internal error.
#
# If this particular GDB does not support i386, it is expected GDB will not
# recognize the core file.  If it does anyway, it should not crash.
set test "load core file"
gdb_test_multiple "core-file ${corefile}" $test {
    -re "no core file handler recognizes format.*\r\n$gdb_prompt $" {
	if { $supports_arch_i386 } {
	    fail $test
	} else {
	    pass $test
	    untested ".text is readable (core file unrecognized)"
	    return
	}
    }
    -re "\r\n$gdb_prompt $" {
	pass $test
    }
}

# Test if at least the core file segments memory has been loaded.
# https://bugzilla.redhat.com/show_bug.cgi?id=457187
gdb_test "x/bx $address" "\r\n\[ \t\]*$address:\[ \t\]*0xf4\[ \t\]*" ".text is readable"
