forked from Imagelibrary/binutils-gdb
A name for BLOCK DATA in Fortran is optional. If no name has been
assigned, GDB crashes during read-in of DWARF when BLOCK DATA is
represented via DW_TAG_module. BLOCK DATA is used for one-time
initialization of non-pointer variables in named common blocks.
As of now there is no issue when gfortran is used as DW_TAG_module is
not emitted. However, with Intel ifort the nameless DW_TAG_module is
present and has the following form:
...
<1><dd>: Abbrev Number: 7 (DW_TAG_module)
<de> DW_AT_decl_line : 46
<df> DW_AT_decl_file : 1
<e0> DW_AT_description : (indirect string, offset: 0x110): block
data
<e4> DW_AT_high_pc : 0x402bb7
<ec> DW_AT_low_pc : 0x402bb7
...
The missing name leads to a crash in add_partial_symbol, during length
calculation.
gdb/ChangeLog:
2019-06-11 Bernhard Heckel <bernhard.heckel@intel.com>
* dwarf2read.c (add_partial_symbol): Skip nameless modules.
gdb/testsuite/Changelog:
2019-06-11 Bernhard Heckel <bernhard.heckel@intel.com>
* gdb.fortran/block-data.f: New.
* gdb.fortran/block-data.exp: New.
57 lines
1.6 KiB
Fortran
57 lines
1.6 KiB
Fortran
! Copyright 2016-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 <http://www.gnu.org/licenses/>.
|
|
!
|
|
! Check that GDB can handle block data with no global name.
|
|
!
|
|
! MAIN
|
|
PROGRAM bdata
|
|
DOUBLE PRECISION doub1, doub2
|
|
CHARACTER*6 char1, char2
|
|
|
|
COMMON /BLK1/ doub1, char1
|
|
COMMON /BLK2/ doub2, char2
|
|
|
|
doub1 = 11.111
|
|
doub2 = 22.222
|
|
char1 = 'ABCDEF'
|
|
char2 = 'GHIJKL'
|
|
CALL sub_block_data ! BP_BEFORE_SUB
|
|
STOP
|
|
END
|
|
|
|
! BLOCK DATA
|
|
BLOCK DATA
|
|
|
|
DOUBLE PRECISION doub1, doub2
|
|
CHARACTER*6 char1, char2
|
|
|
|
COMMON /BLK1/ doub1, char1
|
|
COMMON /BLK2/ doub2, char2
|
|
DATA doub1, doub2 /1.111, 2.222/
|
|
DATA char1, char2 /'abcdef', 'ghijkl'/
|
|
END
|
|
|
|
! SUBROUTINE
|
|
SUBROUTINE sub_block_data
|
|
|
|
DOUBLE PRECISION doub1, doub2
|
|
CHARACTER*6 char1, char2
|
|
|
|
COMMON /BLK1/ doub1, char1
|
|
COMMON /BLK2/ doub2, char2
|
|
|
|
char1 = char2; ! BP_SUB
|
|
END
|