| # Copyright 2019-2020 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/>. | |
| # A test of multi-language dictionaries, a solution to symtab/23010 et al. | |
| load_lib dwarf.exp | |
| # This test can only be run on targets which support DWARF. | |
| if {![dwarf2_support]} { | |
| return 0 | |
| } | |
| standard_testfile main.c .S | |
| # Create the DWARF. This is derived from the reproducer in the bug | |
| # mentioned above. This DIE tree is typical of compilations wtih | |
| # LTO enabled. | |
| set asm_file [standard_output_file $srcfile2] | |
| Dwarf::assemble $asm_file { | |
| declare_labels D45d9 D5079 D5080 D50a9 D50af D5ab2 D5ac2 D5ace D5acf | |
| declare_labels D2135f D2216a D22171 D226c4 D226ca D244ca \ | |
| D245da D245e6 | |
| declare_labels D41c21 D42025 D42045 D42038 D42045 D420b5 | |
| cu {} { | |
| D45d9: compile_unit { | |
| {language @DW_LANG_C_plus_plus} | |
| {name "SerialPortUtils.cpp"} | |
| } { | |
| D5079: base_type { | |
| {byte_size 1 sdata} | |
| {encoding @DW_ATE_unsigned} | |
| {name "char"} | |
| } | |
| D5080: const_type { | |
| {type :$D5079} | |
| } | |
| D50a9: pointer_type { | |
| {byte_size 4 sdata} | |
| {type :$D5080} | |
| } | |
| D50af: const_type { | |
| {type :$D50a9} | |
| } | |
| D5ab2: subprogram { | |
| {external 1 flag} | |
| {linkage_name "_Z18SerialSyncWriteStrPKc"} | |
| } { | |
| D5ac2: formal_parameter { | |
| {name "msg"} | |
| {type :$D50af} | |
| } | |
| D5ace: lexical_block {} { | |
| D5acf: DW_TAG_variable { | |
| {name "p"} | |
| {type :$D50a9} | |
| } | |
| } | |
| } | |
| } | |
| } | |
| cu {} { | |
| D2135f: compile_unit { | |
| {language @DW_LANG_C_plus_plus} | |
| {name "Main.cpp"} | |
| } { | |
| D2216a: base_type { | |
| {byte_size 1 sdata} | |
| {encoding @DW_ATE_unsigned_char} | |
| {name "char"} | |
| } | |
| D22171: const_type { | |
| {type :$D2216a} | |
| } | |
| D226c4: pointer_type { | |
| {byte_size 4 sdata} | |
| {type :$D22171} | |
| } | |
| D226ca: const_type { | |
| {type :$D226c4} | |
| } | |
| D245da: subprogram { | |
| {name "PrintPanicMsg"} | |
| } { | |
| D245e6: formal_parameter { | |
| {name "msg"} | |
| {type :$D226ca} | |
| } | |
| } | |
| } | |
| } | |
| cu {} { | |
| D41c21: compile_unit { | |
| {language @DW_LANG_C99} | |
| {name "<artificial>"} | |
| } { | |
| D42025: subprogram { | |
| {abstract_origin %$D245da} | |
| {low_pc 0x80b60 addr} | |
| {high_pc 0x6c data4} | |
| } { | |
| D42038: formal_parameter { | |
| {abstract_origin %$D245e6} | |
| } | |
| D42045: inlined_subroutine { | |
| {abstract_origin %$D5ab2} | |
| {low_pc 0x8060 addr} | |
| {high_pc 0xc data4} | |
| } { | |
| D420b5: formal_parameter { | |
| {abstract_origin %$D5ac2} | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| # Build the test executable. | |
| if {[build_executable $testfile.exp $testfile [list $asm_file $srcfile] {}] \ | |
| == -1} { | |
| return -1 | |
| } | |
| # We force the DIEs above to be read in via "-readnow". | |
| gdb_spawn_with_cmdline_opts "-readnow" | |
| set test "initial prompt" | |
| gdb_test_multiple "" $test { | |
| -re ".*$gdb_prompt $" { | |
| pass "$test" | |
| } | |
| } | |
| gdb_load $binfile | |
| # All we need to do is check whether GDB is alive. Without | |
| # multidictionaries, it will either crash, assert, or throw an | |
| # internal_error. | |
| gdb_test "p 1" "= 1" "GDB is alive" | |