# Copyright (C) 2021-2026 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

require allow_python_tests

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
}

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"
