[PATCH] D36993: [llvm-dwarfdump] Print type names in DW_AT_type DIEs

David Blaikie via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 1 11:50:40 PDT 2017


dblaikie added a comment.

In https://reviews.llvm.org/D36993#858768, @JDevlieghere wrote:

> In https://reviews.llvm.org/D36993#858121, @dblaikie wrote:
>
> > In https://reviews.llvm.org/D36993#858093, @JDevlieghere wrote:
> >
> > > David, apologies for missing your e-mail. I really hate that it doesn't automatically show up in Phabricator! 🙁
> > >
> > > If the tag doesn't have a name attribute, everything will go through this function except: `DW_TAG_pointer_type`, `DW_TAG_ptr_to_member_type`, `DW_TAG_reference_type`, `DW_TAG_rvalue_reference_type`. The first part explains why `class` and `struct` don't show up. I prefer this approach because it's guaranteed to be robust. Every `DW_TAG_*_type` encountered without a name will have something meaningful printed.
> > >
> > > IIRC, the original switch had between 20 and 25 cases.
> >
> >
> > I'm curious what those 20-25 cases were - do you have a copy/roughly describe their contents? Because while 'const' does print nicely, (& volatile would be similar) I'm not sure what the other 10 or so cases might be and whether that's a reasonable way to print them.
>
>
> Here's the list of cases I had originally:
>
>   case DW_TAG_array_type:
>   case DW_TAG_base_type:
>   case DW_TAG_class_type:
>   case DW_TAG_const_type:
>   case DW_TAG_enumeration_type:
>   case DW_TAG_file_type:
>   case DW_TAG_interface_type:
>   case DW_TAG_packed_type:
>   case DW_TAG_pointer_type:
>   case DW_TAG_ptr_to_member_type:
>   case DW_TAG_reference_type:
>   case DW_TAG_restrict_type:
>   case DW_TAG_set_type:
>   case DW_TAG_shared_type:
>   case DW_TAG_string_type
>   case DW_TAG_structure_type:
>   case DW_TAG_subrange_type:
>   case DW_TAG_subroutine_type:
>   case DW_TAG_thrown_type:
>   case DW_TAG_union_type:
>   case DW_TAG_unspecified_type:
>   case DW_TAG_volatile_type:
>


Ah, thanks!

I feel like maybe this should be examined more closely (an example of how each of these would be printed would be ideal, though that might be a bit much) - for example I don't think it makes sense to print out subroutine types like "int subroutine" (rather than "int(float, double)", say) which I /think/ is how they might look based on the current code)



================
Comment at: lib/DebugInfo/DWARF/DWARFDie.cpp:91-95
+static void dumpTypeName(raw_ostream &OS, const DWARFDie &Die) {
+  DWARFDie D = Die.getAttributeValueAsReferencedDie(DW_AT_type);
+
+  if (!D.isValid())
+    return;
----------------
This might be the wrong approach for, for example, DW_AT_thrown_type - that's an attribute that refers to a type, but isn't itself a DW_AT_type (it should probably still print the type name)

Should this logic maybe work based on the type of the DIE being referenced, rather than the attribute type used to reference it? (or maybe some of both? Not sure - maybe there's only a couple of tags that can refer to types so a short list might suffice, I'm not sure)


Repository:
  rL LLVM

https://reviews.llvm.org/D36993





More information about the llvm-commits mailing list