# Copyright 2019-2020 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 whether GDB's gcore/generate-core-file command can dump memory
# mappings with ELF headers, containing a build-id note.
#
# Due to the fact that we don't have an easy way to process a corefile
# and look for specific notes using GDB/dejagnu, we rely on an
# external tool, eu-unstrip, to verify if the corefile contains
# build-ids.

standard_testfile "normal.c"

# This test is Linux x86_64 only.
if { ![istarget *-*-linux*] } {
    untested "$testfile.exp"
    return -1
}
if { ![istarget "x86_64-*-*"] || ![is_lp64_target] } {
    untested "$testfile.exp"
    return -1
}

if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
    return -1
}

if { ![runto_main] } {
    untested "could not run to main"
    return -1
}

# First we need to generate a corefile.
set corefilename "[standard_output_file gcore.test]"
if { ![gdb_gcore_cmd "$corefilename" "save corefile"] } {
    verbose -log "Could not save corefile"
    untested "$testfile.exp"
    return -1
}

# Determine if GDB dumped the mapping containing the build-id.  This
# is done by invoking an external program (eu-unstrip).
if { [catch "exec [gdb_find_eu-unstrip] -n --core $corefilename" output] == 0 } {
    set line [lindex [split $output "\n"] 0]
    set test "gcore dumped mapping with build-id"

    verbose -log "First line of eu-unstrip: $line"

    if { [regexp "^${hex}\\+${hex} \[a-f0-9\]+@${hex}.*[string_to_regexp $binfile]$" $line] } {
	pass "$test"
    } else {
	fail "$test"
    }
} else {
    verbose -log "Could not execute eu-unstrip program"
    untested "$testfile.exp"
}
