From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 From: Sergio Durigan Junior Date: Fri, 11 Jan 2019 11:31:59 -0500 Subject: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch ;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' ;; Keith Seitz, RHBZ#1560010. gdb/23712: Test case for multidictionary This is a test derived from one of the reproducers in symtab/23010. The DIE tree used here is typical of compilations with LTO, where an artificial parent DIE of language C99 imports DIEs of other languages. gdb/testsuite/ChangeLog: PR gdb/23712 PR symtab/23010 * gdb.dwarf2/multidictionary.exp: New file. diff --git a/gdb/testsuite/gdb.dwarf2/multidictionary.exp b/gdb/testsuite/gdb.dwarf2/multidictionary.exp new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/multidictionary.exp @@ -0,0 +1,157 @@ +# Copyright 2019 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 . + +# 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 ""} + } { + 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" +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" +