[PATCH] Fix -gdwarf-5 -gsplit-dwarf ICEs (PR debug/89498)

Jakub Jelinek jakub@redhat.com
Wed Mar 6 22:28:00 GMT 2019


On Tue, Mar 05, 2019 at 04:06:59PM -0500, Jason Merrill wrote:
> > Assuming output_view_list_offset is correct, the following patch adjusts
> > size_of_die/value_format accordingly.
> 
> I would guess that omitting the handling from output_view_list_offset was an
> oversight in the view work.  Alex, which is right? :)

I had further look today.  Alex has added multiple modes, with
-gvariable-location-views=incompat5 the location view stuff is emitted
directly into the .debug_loclist section as part of the sequence, like:
        .uleb128 0      # DW_AT_location (*.LLST0)
...
        .section        .debug_loclists.dwo,"e",@progbits
        .long   .Ldebug_loc3-.Ldebug_loc2       # Length of Location Lists
.Ldebug_loc2:
        .value  0x5     # DWARF version number
        .byte   0x8     # Address Size
        .byte   0       # Segment Size
        .long   0x3     # Offset Entry Count
.Ldebug_loc0:
        .long   .LLST0-.Ldebug_loc0
        .long   .LLST1-.Ldebug_loc0
        .long   .LLST2-.Ldebug_loc0
.LLST0:
        .byte   0x9     # DW_LLE_view_pair
        .uleb128 0      # Location view begin
        .uleb128 .LVU6  # Location view end
        .byte   0x3     # DW_LLE_startx_length (*.LLST0)
        .uleb128 0x2    # Location list range start index (*.LVL0)
        .uleb128 .LVL1-.LVL0    # Location list length (*.LLST0)
        .uleb128 0x1    # Location expression size
        .byte   0x61    # DW_OP_reg17
...
        .byte   0       # DW_LLE_end_of_list (*.LLST0)
and in this case we don't ICE, the DW_AT_GNU_locviews attributes aren't
emitted at all.
With just -gvariable-location-views -gdwarf-5 -gsplit-dwarf (and the patch
I've posted so that it doesn't ICE):
        .uleb128 0      # DW_AT_location (*.LLST0)
        .long   .LVUS0-.Ldebug_loc0     # DW_AT_GNU_locviews
...
        .section        .debug_loclists.dwo,"e",@progbits
        .long   .Ldebug_loc3-.Ldebug_loc2       # Length of Location Lists
.Ldebug_loc2:
        .value  0x5     # DWARF version number
        .byte   0x8     # Address Size
        .byte   0       # Segment Size
        .long   0x3     # Offset Entry Count
.Ldebug_loc0:
        .long   .LLST0-.Ldebug_loc0
        .long   .LLST1-.Ldebug_loc0
        .long   .LLST2-.Ldebug_loc0
.LVUS0:
        .uleb128 0      # View list begin (*.LVUS0)
        .uleb128 .LVU6  # View list end (*.LVUS0)
        .uleb128 .LVU6  # View list begin (*.LVUS0)
        .uleb128 0      # View list end (*.LVUS0)
.LLST0:
        .byte   0x3     # DW_LLE_startx_length (*.LLST0)
        .uleb128 0x2    # Location list range start index (*.LVL0)
        .uleb128 .LVL1-.LVL0    # Location list length (*.LLST0)
        .uleb128 0x1    # Location expression size
        .byte   0x61    # DW_OP_reg17
        .byte   0x3     # DW_LLE_startx_length (*.LLST0)
        .uleb128 0      # Location list range start index (*.LVL1)
        .uleb128 .LFE0-.LVL1    # Location list length (*.LLST0)
        .uleb128 0x6    # Location expression size
        .byte   0xa3    # DW_OP_entry_value
        .uleb128 0x3
        .byte   0xa5    # DW_OP_regval_type
        .uleb128 0x11
        .uleb128 0x19
        .byte   0x9f    # DW_OP_stack_value
        .byte   0       # DW_LLE_end_of_list (*.LLST0)
In order to use DW_FORM_loclistx .uleb128 for the DW_AT_GNU_locviews,
we'd need to emit .long	.LVUS0-.Ldebug_loc0 etc. next to the
.LLST0-.Ldebug_loc0 in the section offsets table at .Ldebug_loc0,
but I'd expect debug info consumers to assume that anything listed
in the offset table is actually a valid DW_LLE_* sequence, which is not the
case for the .LVUS* labels.

Note the
        .long   .LVUS0-.Ldebug_loc0     # DW_AT_GNU_locviews
looks weird, at least with the patch it is given DW_FORM_sec_offset, but
because it is a difference between .LVUS0-.Ldebug_loc0, it is actually not a
sec offset.  Shall it use a different form in that case?

Alex?

	Jakub



More information about the Gcc-patches mailing list