# Copyright 2014-2023 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 GDB determines the frame's language based on the comp
# unit's language, even if the file has an unknown file extension,
# such as ".txt".

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use
# gas.
require dwarf2_support

standard_testfile .c .S

# Assemble the DWARF using CU_LANG as compilation unit's language.
# Run to a function in that compilation unit and check that GDB
# figures out that the language is GDB_LANG.

proc do_test {cu_lang gdb_lang} {
    global testfile srcfile srcfile2

    # Make some DWARF for the test.
    set asm_file [standard_output_file $srcfile2]
    Dwarf::assemble $asm_file {
	upvar cu_lang cu_lang

	# Creating a CU with 4-byte addresses lets this test link on
	# both 32- and 64-bit machines.
	cu { addr_size 4 } {
	    compile_unit {
		{name file1.txt}
		{language @$cu_lang}
		{MACRO_AT_range {func}}
	    } {
		subprogram {
		    {external 1 flag}
		    {MACRO_AT_func {func}}
		} {
		}
	    }
	}
    }

    if { [prepare_for_testing "failed to prepare" ${testfile} \
	      [list $srcfile $asm_file] {nodebug}] } {
	return -1
    }

    if ![runto func] {
	return -1
    }

    gdb_test "show language" "\"auto; currently $gdb_lang\".*"
}

proc do_test_with_prefix {cu_lang gdb_lang} {
    with_test_prefix $gdb_lang {
	do_test $cu_lang $gdb_lang
    }
}

# Some paths in the debugger fall back to C.  Check C++ as well to
# make sure the test doesn't happen to work because of such a
# fallback.
do_test_with_prefix DW_LANG_C "c"
do_test_with_prefix DW_LANG_C_plus_plus "c\\+\\+"
