---
 gcc/pdbout.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 78 insertions(+), 1 deletion(-)

diff --git a/gcc/pdbout.c b/gcc/pdbout.c
index 0cae4d33469..dae5c1ef679 100644
--- a/gcc/pdbout.c
+++ b/gcc/pdbout.c
@@ -3344,6 +3344,8 @@ alias_hasher::equal (const value_type type, compare_type 
tree)
 static void
 pdbout_type_decl (tree t, int local ATTRIBUTE_UNUSED)
 {
+  struct pdb_type *type;
+
   /* We need to record the typedefs to ensure e.g. that Windows'
    * LPWSTR gets mapped to wchar_t* rather than uint16_t*.
    * There is a LF_ALIAS / lfAlias in Microsoft's header files, but
@@ -3365,6 +3367,47 @@ pdbout_type_decl (tree t, int local ATTRIBUTE_UNUSED)
          && !strcmp (IDENTIFIER_POINTER (DECL_NAME (t)), "HRESULT"))
        a->type = hresult_type;
 
+      // give name if previously anonymous
+
+      if (a->type)
+       {
+         switch (a->type->cv_type)
+           {
+           case LF_STRUCTURE:
+           case LF_CLASS:
+           case LF_UNION:
+             {
+               struct pdb_struct *str = (struct pdb_struct *) a->type->data;
+
+               if (!str->name)
+                 {
+                   struct pdb_type **slot;
+
+                   str->name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+
+                   slot =
+                     struct_hash_table.find_slot_with_hash (str->name,
+                                                            struct_hasher::
+                                                            hash (str->name),
+                                                            INSERT);
+                   *slot = a->type;
+                 }
+
+               break;
+             }
+
+           case LF_ENUM:
+             {
+               struct pdb_enum *en = (struct pdb_enum *) a->type->data;
+
+               if (!en->name)
+                 en->name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+
+               break;
+             }
+           }
+       }
+
       slot =
        alias_hash_table.find_slot_with_hash (TREE_TYPE (t),
                                              htab_hash_pointer (TREE_TYPE
@@ -3377,7 +3420,41 @@ pdbout_type_decl (tree t, int local ATTRIBUTE_UNUSED)
       return;
     }
 
-  find_type (TREE_TYPE (t));
+  type = find_type (TREE_TYPE (t));
+
+  if (!type || type->id != 0)
+    return;
+
+  if (DECL_NAME (t) && IDENTIFIER_POINTER (DECL_NAME (t))
+      && IDENTIFIER_POINTER (DECL_NAME (t))[0] != '.')
+    {
+      // give name if previously anonymous
+
+      switch (type->cv_type)
+       {
+       case LF_STRUCTURE:
+       case LF_CLASS:
+       case LF_UNION:
+         {
+           struct pdb_struct *str = (struct pdb_struct *) type->data;
+
+           if (!str->name)
+             str->name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+
+           break;
+         }
+
+       case LF_ENUM:
+         {
+           struct pdb_enum *en = (struct pdb_enum *) type->data;
+
+           if (!en->name)
+             en->name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+
+           break;
+         }
+       }
+    }
 }
 
 #ifndef _WIN32
-- 
2.26.2

Reply via email to