# Copyright (C) 2021-2022 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 the value of gdb.current_objfile is correct even when one
# auto-load script loads a second objfile, which triggers the
# execution of another (nested) objfile script.

load_lib gdb-python.exp

standard_testfile .c -f1.c -f2.c

# Two additional object files needed for this test.
set f1_o [standard_output_file ${gdb_test_file_name}-f1.o]
set f2_o [standard_output_file ${gdb_test_file_name}-f2.o]

# Now build the object files.
if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" ${f1_o} object {}] != ""} {
  untested "failed to compile object file f1.o"
  return -1
}

if {[gdb_compile "${srcdir}/${subdir}/${srcfile3}" ${f2_o} object {}] != ""} {
  untested "failed to compile object file f2.o"
  return -1
}

# Copy the two Python scripts to where the tests are being run.
set remote_python_file [gdb_remote_download host \
			    ${srcdir}/${subdir}/${testfile}-f1.o-gdb.py]
set remote_python_file [gdb_remote_download host \
			    ${srcdir}/${subdir}/${testfile}-f2.o-gdb.py]

# Build the main test executable and start GDB.
if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
    return -1
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

if ![runto_main] {
   return -1
}

set safe_path [standard_output_file ""]
gdb_test_no_output "set auto-load safe-path ${safe_path}" \
    "set auto-load safe-path"

gdb_breakpoint [gdb_get_line_number "Break Here"]
gdb_continue_to_breakpoint "run to test breakpoint"

gdb_test_no_output "set confirm off"
gdb_test "add-symbol-file ${f1_o} region_1" \
    [multi_line \
	 "Entering f1\\.o auto-load script" \
	 "Current objfile is: \[^\r\n\]+/py-auto-load-chaining-f1\\.o" \
	 "Chain loading f2\\.o\\.\\.\\." \
	 "add symbol table from file \"\[^\r\n\]+/py-auto-load-chaining-f2\\.o\" at" \
	 "\\s+\\.text_addr = $hex" \
	 "Entering f2\\.o auto-load script" \
	 "Current objfile is: \[^\r\n\]+/py-auto-load-chaining-f2\\.o" \
	 "Leaving f2\\.o auto-load script" \
	 "After loading f2\\.o\\.\\.\\." \
	 "Current objfile is: \[^\r\n\]+/py-auto-load-chaining-f1\\.o" \
	 "Leaving f1\\.o auto-load script"] \
    "add-symbol-file f1.o"
