# Copyright 2020-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 that a backtrace is shown correctly for an objfile that uses partial
# symtabs created by another objfile sharing the same BFD.
#
# It mimics how a bug with psymtab sharing was initially found:
#
#  1. Load the test file twice, such that the second objfile re-uses the
#     per_bfd object created for the first objfile.
#  2. Run to some point where in the backtrace there is a frame for a
#     function that's in a CU that's not yet read in.
#  3. Check that this frame's information is complete in the "backtrace"
#     output.

standard_testfile .c share-psymtabs-bt-2.c

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

# Load $binfile a second time.  The second created objfile will re-use the
# partial symtabs created by the first one.
if { [gdb_file_cmd $binfile] != 0 } {
    fail "file command failed"
    return -1
}

gdb_breakpoint "bar"
if { ![runto "bar"] } {
    return -1
}

# A buggy GDB would fail to find the full symbol associated to this frame's
# address, so would just show "foo ()" (from the minimal symbol).
gdb_test "bt" "foo \\(x=12345\\).*"
