int cu_index;
 };
 
-/* A helper function that writes a single signatured_type to an
-   obstack.  */
-
-static int
-write_one_signatured_type (void **slot, void *d)
-{
-  struct signatured_type_index_data *info
-    = (struct signatured_type_index_data *) d;
-  struct signatured_type *entry = (struct signatured_type *) *slot;
-  partial_symtab *psymtab = entry->v.psymtab;
-
-  if (psymtab == nullptr)
-    {
-      /* We can end up here when processing a skeleton CU referring to a
-        .dwo file that hasn't been found.  There's not much we can do in
-        such a case, so skip this CU.  */
-      return 1;
-    }
-
-  write_psymbols (info->symtab, info->psyms_seen,
-                 psymtab->global_psymbols, info->cu_index,
-                 0);
-  write_psymbols (info->symtab, info->psyms_seen,
-                 psymtab->static_psymbols, info->cu_index,
-                 1);
-
-  info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
-                               to_underlying (entry->sect_off));
-  info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
-                               to_underlying (entry->type_offset_in_tu));
-  info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, entry->signature);
-
-  ++info->cu_index;
-
-  return 1;
-}
-
 /* Recurse into all "included" dependencies and count their symbols as
    if they appeared in this psymtab.  */
 
   psym_index_map cu_index_htab;
   cu_index_htab.reserve (per_objfile->per_bfd->all_comp_units.size ());
 
+  /* Store out the .debug_type CUs, if any.  */
+  data_buf types_cu_list;
+
   /* The CU list is already sorted, so we don't need to do additional
      work here.  Also, the debug_types entries do not appear in
      all_comp_units, but only in their own hash table.  */
   std::unordered_set<partial_symbol *> psyms_seen
     (psyms_seen_size (per_objfile));
   int counter = 0;
+  int types_counter = 0;
   for (int i = 0; i < per_objfile->per_bfd->all_comp_units.size (); ++i)
     {
       dwarf2_per_cu_data *per_cu
        = per_objfile->per_bfd->all_comp_units[i].get ();
-      if (per_cu->is_debug_types)
-       continue;
-
       partial_symtab *psymtab = per_cu->v.psymtab;
 
+      int &this_counter = per_cu->is_debug_types ? types_counter : counter;
+
       if (psymtab != NULL)
        {
          if (psymtab->user == NULL)
            recursively_write_psymbols (objfile, psymtab, &symtab,
-                                       psyms_seen, counter);
+                                       psyms_seen, this_counter);
 
-         const auto insertpair = cu_index_htab.emplace (psymtab, counter);
+         const auto insertpair = cu_index_htab.emplace (psymtab,
+                                                        this_counter);
          gdb_assert (insertpair.second);
        }
 
       /* The all_comp_units list contains CUs read from the objfile as well as
         from the eventual dwz file.  We need to place the entry in the
         corresponding index.  */
-      data_buf &cu_list = per_cu->is_dwz ? dwz_cu_list : objfile_cu_list;
+      data_buf &cu_list = (per_cu->is_debug_types
+                          ? types_cu_list
+                          : per_cu->is_dwz ? dwz_cu_list : objfile_cu_list);
       cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
                           to_underlying (per_cu->sect_off));
-      cu_list.append_uint (8, BFD_ENDIAN_LITTLE, per_cu->length);
-      ++counter;
+      if (per_cu->is_debug_types)
+       {
+         signatured_type *sig_type = (signatured_type *) per_cu;
+         cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
+                              to_underlying (sig_type->type_offset_in_tu));
+         cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
+                              sig_type->signature);
+       }
+      else
+       cu_list.append_uint (8, BFD_ENDIAN_LITTLE, per_cu->length);
+
+      ++this_counter;
     }
 
   /* Dump the address map.  */
   data_buf addr_vec;
   write_address_map (per_objfile->per_bfd, addr_vec, cu_index_htab);
 
-  /* Write out the .debug_type entries, if any.  */
-  data_buf types_cu_list;
-  if (per_objfile->per_bfd->signatured_types)
-    {
-      signatured_type_index_data sig_data (types_cu_list,
-                                          psyms_seen);
-
-      sig_data.objfile = objfile;
-      sig_data.symtab = &symtab;
-      sig_data.cu_index = (per_objfile->per_bfd->all_comp_units.size ()
-                          - per_objfile->per_bfd->tu_stats.nr_tus);
-      htab_traverse_noresize (per_objfile->per_bfd->signatured_types.get (),
-                             write_one_signatured_type, &sig_data);
-    }
-
   /* Now that we've processed all symbols we can shrink their cu_indices
      lists.  */
   uniquify_cu_indices (&symtab);