# Copyright 2019-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 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] } {
    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"

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