https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84620
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Comment on attachment 43539 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43539 candidate patch >[IEPM] [PR debug/84620] use constant form for DW_AT_GNU_entry_view > >When outputting entry views in symbolic mode, we used to use a lbl_id, >but was output as an addr, perhaps even in an indirect one, which is >all excessive and undesirable for a small assembler-computed constant. >Introduce a new value class for symbolic views, so that we can output >the labels as constant data, using small forms that should suffice for >any symbolic views. Ideally, we'd use uleb128, but then the compiler >would have to defer .debug_info offset computation to the assembler: a >symbolic uleb128 assembler constant in an attribute is not something >GCC can deal with ATM. > >for gcc/ChangeLog > > PR debug/84620 > * dwarf2out.h (dw_val_class): Add dw_val_class_symview. > (dw_val_node): Add val_symbolic_view. > * dwarf2out.c (dw_val_equal_p): Handle symview. > (add_AT_symview): New. > (print_dw_val): Handle symview. > (attr_checksum, attr_checksum_ordered): Likewise. > (same_dw_val_p, size_of_die): Likewise. > (value_format, output_die): Likewise. > (add_high_low_attributes): Use add_AT_symview for entry_view. >--- > gcc/dwarf2out.c | 40 +++++++++++++++++++++++++++++++++++++++- > gcc/dwarf2out.h | 4 +++- > 2 files changed, 42 insertions(+), 2 deletions(-) > >diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c >index 41bb11558f69..b52edee845f2 100644 >--- a/gcc/dwarf2out.c >+++ b/gcc/dwarf2out.c >@@ -1434,6 +1434,8 @@ dw_val_equal_p (dw_val_node *a, dw_val_node *b) > return a->v.val_die_ref.die == b->v.val_die_ref.die; > case dw_val_class_fde_ref: > return a->v.val_fde_index == b->v.val_fde_index; >+ case dw_val_class_symview: >+ return strcmp (a->v.val_symbolic_view, b->v.val_symbolic_view) == 0; > case dw_val_class_lbl_id: > case dw_val_class_lineptr: > case dw_val_class_macptr: >@@ -3600,6 +3602,7 @@ static addr_table_entry *add_addr_table_entry (void *, >enum ate_kind); > static void remove_addr_table_entry (addr_table_entry *); > static void add_AT_addr (dw_die_ref, enum dwarf_attribute, rtx, bool); > static inline rtx AT_addr (dw_attr_node *); >+static void add_AT_symview (dw_die_ref, enum dwarf_attribute, const char *); > static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *); > static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *); > static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *); >@@ -5114,6 +5117,21 @@ add_AT_vms_delta (dw_die_ref die, enum dwarf_attribute >attr_kind, > add_dwarf_attr (die, &attr); > } > >+/* Add a symbolic view identifier attribute value to a DIE. */ >+ >+static inline void >+add_AT_symview (dw_die_ref die, enum dwarf_attribute attr_kind, >+ const char *view_label) >+{ >+ dw_attr_node attr; >+ >+ attr.dw_attr = attr_kind; >+ attr.dw_attr_val.val_class = dw_val_class_symview; >+ attr.dw_attr_val.val_entry = NULL; >+ attr.dw_attr_val.v.val_symbolic_view = xstrdup (view_label); >+ add_dwarf_attr (die, &attr); >+} >+ > /* Add a label identifier attribute value to a DIE. */ > > static inline void >@@ -6457,6 +6475,9 @@ print_dw_val (dw_val_node *val, bool recurse, FILE >*outfile) > fprintf (outfile, "delta: @slotcount(%s-%s)", > val->v.val_vms_delta.lbl2, val->v.val_vms_delta.lbl1); > break; >+ case dw_val_class_symview: >+ fprintf (outfile, "view: %s", val->v.val_symbolic_view); >+ break; > case dw_val_class_lbl_id: > case dw_val_class_lineptr: > case dw_val_class_macptr: >@@ -6828,6 +6849,7 @@ attr_checksum (dw_attr_node *at, struct md5_ctx *ctx, >int *mark) > > case dw_val_class_fde_ref: > case dw_val_class_vms_delta: >+ case dw_val_class_symview: > case dw_val_class_lbl_id: > case dw_val_class_lineptr: > case dw_val_class_macptr: >@@ -7124,6 +7146,7 @@ attr_checksum_ordered (enum dwarf_tag tag, dw_attr_node >*at, > break; > > case dw_val_class_fde_ref: >+ case dw_val_class_symview: > case dw_val_class_lbl_id: > case dw_val_class_lineptr: > case dw_val_class_macptr: >@@ -7624,6 +7647,9 @@ same_dw_val_p (const dw_val_node *v1, const dw_val_node >*v2, int *mark) > case dw_val_class_die_ref: > return same_die_p (v1->v.val_die_ref.die, v2->v.val_die_ref.die, mark); > >+ case dw_val_class_symview: >+ return strcmp (v1->v.val_symbolic_view, v2->v.val_symbolic_view) == 0; >+ > case dw_val_class_fde_ref: > case dw_val_class_vms_delta: > case dw_val_class_lbl_id: >@@ -9284,6 +9310,10 @@ size_of_die (dw_die_ref die) > size += csize; > } > break; >+ case dw_val_class_symview: >+ /* FIXME: Use uleb128 rather than data2. */ >+ size += 2; >+ break; > case dw_val_class_const_implicit: > case dw_val_class_unsigned_const_implicit: > case dw_val_class_file_implicit: >@@ -9732,6 +9762,9 @@ value_format (dw_attr_node *a) > default: > return DW_FORM_block1; > } >+ case dw_val_class_symview: >+ /* FIXME: Use uleb128 rather than data2. */ >+ return DW_FORM_data2; > case dw_val_class_vec: > switch (constant_size (a->dw_attr_val.v.val_vec.length > * a->dw_attr_val.v.val_vec.elt_size)) >@@ -10497,6 +10530,11 @@ output_die (dw_die_ref die) > } > break; > >+ case dw_val_class_symview: >+ /* FIXME: Use uleb128 rather than data2. */ >+ dw2_asm_output_addr (2, a->dw_attr_val.v.val_symbolic_view, "%s", >name); >+ break; >+ > case dw_val_class_const_implicit: > if (flag_debug_asm) > fprintf (asm_out_file, "\t\t\t%s %s (" >@@ -23809,7 +23847,7 @@ add_high_low_attributes (tree stmt, dw_die_ref die) > indirecting them through a table might make things > easier, but even that would be more wasteful, > space-wise, than what we have now. */ >- add_AT_lbl_id (die, DW_AT_GNU_entry_view, label); >+ add_AT_symview (die, DW_AT_GNU_entry_view, label); > } > } > >diff --git a/gcc/dwarf2out.h b/gcc/dwarf2out.h >index a1856a5185e2..f2240af85375 100644 >--- a/gcc/dwarf2out.h >+++ b/gcc/dwarf2out.h >@@ -161,7 +161,8 @@ enum dw_val_class > dw_val_class_const_implicit, > dw_val_class_unsigned_const_implicit, > dw_val_class_file_implicit, >- dw_val_class_view_list >+ dw_val_class_view_list, >+ dw_val_class_symview > }; > > /* Describe a floating point constant value, or a vector constant value. */ >@@ -209,6 +210,7 @@ struct GTY(()) dw_val_node { > HOST_WIDE_INT GTY ((default)) val_int; > unsigned HOST_WIDE_INT > GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned; >+ char * GTY ((tag ("dw_val_class_symview"))) val_symbolic_view; > double_int GTY ((tag ("dw_val_class_const_double"))) val_double; > wide_int_ptr GTY ((tag ("dw_val_class_wide_int"))) val_wide; > dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;