binutils-gdb/gdb/testsuite/gdb.dwarf2/dw2-cu-size.S
Tom de Vries b953e70356 [gdb/testsuite] Add missing .debug_abbrev terminator in dw2-cu-size.S
Since commit 27012aba8a "Remove Irix 6 workaround from DWARF abbrev reader"
we have:
...
(gdb) file dw2-cu-size^M
Reading symbols from dw2-cu-size...^M
DW_FORM_strp pointing outside of .debug_str section [in module dw2-cu-size]^M
(No debugging symbols found in dw2-cu-size)^M
(gdb) ptype noloc^M
No symbol table is loaded.  Use the "file" command.^M
(gdb) FAIL: gdb.dwarf2/dw2-cu-size.exp: ptype noloc
...

The problem is a missing .debug_abbrev terminator in dw2-cu-size.S, which
causes the .debug_abbrev contribution to be merged with the next:
...
 Number TAG (0x9b)
   1      DW_TAG_compile_unit    [has children]
    DW_AT_name         DW_FORM_string
    DW_AT_producer     DW_FORM_string
    DW_AT_language     DW_FORM_data1
    DW_AT value: 0     DW_FORM value: 0
   2      DW_TAG_variable    [no children]
    DW_AT_name         DW_FORM_string
    DW_AT_type         DW_FORM_ref4
    DW_AT_external     DW_FORM_flag
    DW_AT value: 0     DW_FORM value: 0
   3      DW_TAG_base_type    [no children]
    DW_AT_name         DW_FORM_string
    DW_AT_byte_size    DW_FORM_data1
    DW_AT_encoding     DW_FORM_data1
    DW_AT value: 0     DW_FORM value: 0
   4      DW_TAG_const_type    [no children]
    DW_AT_type         DW_FORM_ref_udata
    DW_AT value: 0     DW_FORM value: 0
   1      DW_TAG_compile_unit    [has children]
    DW_AT_producer     DW_FORM_strp
    DW_AT_language     DW_FORM_data1
    DW_AT_name         DW_FORM_strp
    DW_AT_comp_dir     DW_FORM_strp
    DW_AT_low_pc       DW_FORM_addr
    DW_AT_high_pc      DW_FORM_data8
    DW_AT_stmt_list    DW_FORM_sec_offset
    DW_AT value: 0     DW_FORM value: 0
...
and consequently, abbreviation code 1 no longer refers to a unique entry.

The eventually causes us to access the first attribute of this DIE:
...
 <0><124>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <125>   DW_AT_name        : file1.txt
    <12f>   DW_AT_producer    : GNU C 3.3.3
    <13b>   DW_AT_language    : 1       (ANSI C)
...
which has form DW_FORM_string, using DW_FORM_strp.

Fix this by adding the missing .debug_abbrev terminator in dw2-cu-size.S.

gdb/testsuite/ChangeLog:

2021-03-30  Tom de Vries  <tdevries@suse.de>

	PR testsuite/27604
	* gdb.dwarf2/dw2-cu-size.S: Add missing .debug_abbrev terminator.
2021-03-30 15:16:26 +02:00

110 lines
3.5 KiB
ArmAsm

/* This testcase is part of GDB, the GNU debugger.
Copyright 2008-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 inter-cu reference support where the referenced DIE is within
initial_length_size bytes of the end of the CU, but GDB doesn't take
into account initial_length_size.
GDB still gets the correct answer because it goes looking for the
correct CU, but the search is unnecessary. */
/* Debug information */
.section .debug_info
.Lcu1_begin:
/* CU header */
.4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
.Lcu1_start:
.2byte 2 /* DWARF Version */
.4byte .Labbrev1_begin /* Offset into abbrev section */
.byte 4 /* Pointer size */
/* CU die */
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
.ascii "file1.txt\0" /* DW_AT_name */
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
.byte 1 /* DW_AT_language (C) */
.uleb128 2 /* Abbrev: DW_TAG_variable */
.ascii "noloc\0" /* DW_AT_name */
.4byte .Ltype_const_int-.Lcu1_begin /* DW_AT_type */
.byte 1 /* DW_AT_external */
.Ltype_int:
.uleb128 3 /* Abbrev: DW_TAG_base_type */
.ascii "int\0" /* DW_AT_name */
.byte 4 /* DW_AT_byte_size */
.byte 5 /* DW_AT_encoding */
.Ltype_const_int:
.uleb128 4 /* Abbrev: DW_TAG_const_type */
.uleb128 .Ltype_int - .Lcu1_begin /* DW_AT_type */
.byte 0 /* End of children of CU */
.Lcu1_end:
/* Abbrev table */
.section .debug_abbrev
.Labbrev1_begin:
.uleb128 1 /* Abbrev code */
.uleb128 0x11 /* DW_TAG_compile_unit */
.byte 1 /* has_children */
.uleb128 0x3 /* DW_AT_name */
.uleb128 0x8 /* DW_FORM_string */
.uleb128 0x25 /* DW_AT_producer */
.uleb128 0x8 /* DW_FORM_string */
.uleb128 0x13 /* DW_AT_language */
.uleb128 0xb /* DW_FORM_data1 */
.byte 0x0 /* Terminator */
.byte 0x0 /* Terminator */
.uleb128 2 /* Abbrev code */
.uleb128 0x34 /* DW_TAG_variable */
.byte 0 /* has_children */
.uleb128 0x3 /* DW_AT_name */
.uleb128 0x8 /* DW_FORM_string */
.uleb128 0x49 /* DW_AT_type */
.uleb128 0x13 /* DW_FORM_ref4 */
.uleb128 0x3f /* DW_AT_external */
.uleb128 0xc /* DW_FORM_flag */
.byte 0x0 /* Terminator */
.byte 0x0 /* Terminator */
.uleb128 3 /* Abbrev code */
.uleb128 0x24 /* DW_TAG_base_type */
.byte 0 /* has_children */
.uleb128 0x3 /* DW_AT_name */
.uleb128 0x8 /* DW_FORM_string */
.uleb128 0xb /* DW_AT_byte_size */
.uleb128 0xb /* DW_FORM_data1 */
.uleb128 0x3e /* DW_AT_encoding */
.uleb128 0xb /* DW_FORM_data1 */
.byte 0x0 /* Terminator */
.byte 0x0 /* Terminator */
.uleb128 4 /* Abbrev code */
.uleb128 0x26 /* DW_TAG_const_type */
.byte 0 /* has_children */
.uleb128 0x49 /* DW_AT_type */
.uleb128 0x15 /* DW_FORM_ref_udata */
.byte 0x0 /* Terminator */
.byte 0x0 /* Terminator */
.byte 0x0 /* Terminator .debug_abbrev
section. */