https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79821

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to r...@cebitec.uni-bielefeld.de from comment #6)
> > --- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> > If you up from the ICE case up to gt_pch_nx_die_struct frame, it would be
> > interesting if you can figure out what x is would be print_die (x, stderr)
> 
> I get
> 
> DIE    0: DW_TAG_member (f821cdb0)
>   abbrev id: 0 offset: 0 mark: 0
>   DW_AT_name: "is_specialized"
>   DW_AT_decl_file:
> "/var/gcc/reghunt/pch-segv/36684/sparc-sun-solaris2.12/sparcv9/libstdc++-v3/
> include/limits" (0)
>   DW_AT_decl_line: 385
>   DW_AT_type: die -> 0 (fb6a4c60)
>   DW_AT_external: 1
>   DW_AT_declaration: 1
>   DW_AT_const_value: floating-point or vector constant
>   DW_AT_const_expr: 1
> 
> for the innermost call to gt_pch_nx_die_struct.

Ah, so it will be most likely that
DW_AT_const_value: floating-point or vector constant

We have:
      dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;
and
struct GTY(()) dw_vec_const {
  unsigned char * GTY((atomic)) array;
  unsigned length;
  unsigned elt_size;
};

If we are calling strlen on that array, that is obviously incorrect, because
the array contains random bytes.
We need some way to tell GC that the array has length * elt_size size.

Reply via email to