# Copyright 2014-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 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.
if {![dwarf2_support]} {
    return 0
}

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\\+\\+"
