Use default lower bound for vector types in debug info

Message ID 4409263.LvFx2qVVIh@fomalhaut
State New
Headers
Series Use default lower bound for vector types in debug info |

Commit Message

Eric Botcazou July 4, 2022, 7:52 a.m. UTC
  Hi,

vector types are represented as array types with DW_AT_GNU_vector attribute in 
the debug info and a range [0 .. TYPE_VECTOR_SUBPARTS - 1].  That's obviously 
skewed toward the C family of languages, therefore the attached patch changes 
the lower bound to the default for the language of the CU, if any.

Tested on x86-64/Linux, OK for the mainline?


gcc/
	* dwarf2out.cc (gen_array_type_die): Use the default lower bound of
	the language for vector types.
  

Comments

Richard Biener July 4, 2022, 8:18 a.m. UTC | #1
On Mon, Jul 4, 2022 at 10:03 AM Eric Botcazou via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi,
>
> vector types are represented as array types with DW_AT_GNU_vector attribute in
> the debug info and a range [0 .. TYPE_VECTOR_SUBPARTS - 1].  That's obviously
> skewed toward the C family of languages, therefore the attached patch changes
> the lower bound to the default for the language of the CU, if any.
>
> Tested on x86-64/Linux, OK for the mainline?

For late generated vector types this might result in inconsistencies with
early (user) generated types when using LTO.  Is there context available
somehow so we can do like the is_<LANG> overloads on a decl and
use a default according to that?

>
> gcc/
>         * dwarf2out.cc (gen_array_type_die): Use the default lower bound of
>         the language for vector types.
>
> --
> Eric Botcazou
  
Eric Botcazou July 4, 2022, 8:42 a.m. UTC | #2
> For late generated vector types this might result in inconsistencies with
> early (user) generated types when using LTO.

Is that a problem?  That's no different with regular array types.

> Is there context available somehow so we can do like the is_<LANG> overloads
> on a decl and use a default according to that?

Not sure, the only safe thing to do would be to return -1 as the default lower 
bound if flag_generate_lto.
  
Richard Biener July 4, 2022, 9:08 a.m. UTC | #3
On Mon, Jul 4, 2022 at 10:42 AM Eric Botcazou <botcazou@adacore.com> wrote:
>
> > For late generated vector types this might result in inconsistencies with
> > early (user) generated types when using LTO.
>
> Is that a problem?  That's no different with regular array types.

I'm not sure - almost all types the user can actually inspect should have early
debug info.

> > Is there context available somehow so we can do like the is_<LANG> overloads
> > on a decl and use a default according to that?
>
> Not sure, the only safe thing to do would be to return -1 as the default lower
> bound if flag_generate_lto.

Rather if in_lto_p, but yes, this sounds like a good thing to do.  OTOH if
the used language is uniform LTO will pick that, it will "merge" C/C++
and otherwise use C as fallback in a mixed environment.

So the patch is quite likely OK as-is.

Which means .. OK.

Thanks,
Richard.

> --
> Eric Botcazou
>
>
  

Patch

diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index b468a4b9c0f..149aeaf1a55 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -22539,11 +22539,14 @@  gen_array_type_die (tree type, dw_die_ref context_die)
 
   if (TREE_CODE (type) == VECTOR_TYPE)
     {
-      /* For VECTOR_TYPEs we use an array die with appropriate bounds.  */
+      /* For VECTOR_TYPEs we use an array DIE with appropriate bounds.  */
+      int lb = lower_bound_default ();
+      if (lb == -1)
+	lb = 0;
       dw_die_ref subrange_die = new_die (DW_TAG_subrange_type, array_die, NULL);
-      add_bound_info (subrange_die, DW_AT_lower_bound, size_zero_node, NULL);
+      add_bound_info (subrange_die, DW_AT_lower_bound, size_int (lb), NULL);
       add_bound_info (subrange_die, DW_AT_upper_bound,
-		      size_int (TYPE_VECTOR_SUBPARTS (type) - 1), NULL);
+		      size_int (lb + TYPE_VECTOR_SUBPARTS (type) - 1), NULL);
     }
   else
     add_subscript_info (array_die, type, collapse_nested_arrays);