Hi!

output_view_list_offset does:
  if (dwarf_split_debug_info)
    dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label,
                          "%s", dwarf_attr_name (a->dw_attr));
  else
    dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section,
                           "%s", dwarf_attr_name (a->dw_attr));
while output_loc_list_offset does:
  if (!dwarf_split_debug_info)
    dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section,
                           "%s", dwarf_attr_name (a->dw_attr));
  else if (dwarf_version >= 5)
    {
      gcc_assert (AT_loc_list (a)->num_assigned);
      dw2_asm_output_data_uleb128 (AT_loc_list (a)->hash, "%s (%s)",
                                   dwarf_attr_name (a->dw_attr),
                                   sym);
    }
  else
    dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label,
                          "%s", dwarf_attr_name (a->dw_attr));
but both size_of_die and value_format handle both the same as loc_list,
so for -gdwarf-5 -gsplit-dwarf we just ICE, as e.g. AT_loc_list is not
valid on a view list.

Assuming output_view_list_offset is correct, the following patch adjusts
size_of_die/value_format accordingly.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-03-04  Jakub Jelinek  <ja...@redhat.com>

        PR debug/89498
        * dwarf2out.c (size_of_die): For dw_val_class_view_list always use
        DWARF_OFFSET_SIZE.
        (value_format): For dw_val_class_view_list never use DW_FORM_loclistx.

--- gcc/dwarf2out.c.jj  2019-03-01 09:04:15.440751912 +0100
+++ gcc/dwarf2out.c     2019-03-04 17:58:59.501542373 +0100
@@ -9351,7 +9351,6 @@ size_of_die (dw_die_ref die)
          }
          break;
        case dw_val_class_loc_list:
-       case dw_val_class_view_list:
          if (dwarf_split_debug_info && dwarf_version >= 5)
            {
              gcc_assert (AT_loc_list (a)->num_assigned);
@@ -9360,6 +9359,9 @@ size_of_die (dw_die_ref die)
           else
             size += DWARF_OFFSET_SIZE;
          break;
+       case dw_val_class_view_list:
+         size += DWARF_OFFSET_SIZE;
+         break;
        case dw_val_class_range_list:
          if (value_format (a) == DW_FORM_rnglistx)
            {
@@ -9733,12 +9735,12 @@ value_format (dw_attr_node *a)
          gcc_unreachable ();
        }
     case dw_val_class_loc_list:
-    case dw_val_class_view_list:
       if (dwarf_split_debug_info
          && dwarf_version >= 5
          && AT_loc_list (a)->num_assigned)
        return DW_FORM_loclistx;
       /* FALLTHRU */
+    case dw_val_class_view_list:
     case dw_val_class_range_list:
       /* For range lists in DWARF 5, use DW_FORM_rnglistx from .debug_info.dwo
         but in .debug_info use DW_FORM_sec_offset, which is shorter if we

        Jakub

Reply via email to