Make dwarf2_per_objfile::all_type_units an std::vector
[external/binutils.git] / gdb / dwarf-index-write.c
1 /* DWARF index writing support for GDB.
2
3    Copyright (C) 1994-2018 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21
22 #include "addrmap.h"
23 #include "cli/cli-decode.h"
24 #include "common/byte-vector.h"
25 #include "common/filestuff.h"
26 #include "common/gdb_unlinker.h"
27 #include "complaints.h"
28 #include "dwarf-index-common.h"
29 #include "dwarf2.h"
30 #include "dwarf2read.h"
31 #include "gdb/gdb-index.h"
32 #include "gdbcmd.h"
33 #include "objfiles.h"
34 #include "psympriv.h"
35
36 #include <algorithm>
37 #include <cmath>
38 #include <set>
39 #include <unordered_map>
40 #include <unordered_set>
41
42 /* The suffix for an index file.  */
43 #define INDEX4_SUFFIX ".gdb-index"
44 #define INDEX5_SUFFIX ".debug_names"
45 #define DEBUG_STR_SUFFIX ".debug_str"
46
47 /* Ensure only legit values are used.  */
48 #define DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE(cu_index, value) \
49   do { \
50     gdb_assert ((unsigned int) (value) <= 1); \
51     GDB_INDEX_SYMBOL_STATIC_SET_VALUE((cu_index), (value)); \
52   } while (0)
53
54 /* Ensure only legit values are used.  */
55 #define DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE(cu_index, value) \
56   do { \
57     gdb_assert ((value) >= GDB_INDEX_SYMBOL_KIND_TYPE \
58                 && (value) <= GDB_INDEX_SYMBOL_KIND_OTHER); \
59     GDB_INDEX_SYMBOL_KIND_SET_VALUE((cu_index), (value)); \
60   } while (0)
61
62 /* Ensure we don't use more than the alloted nuber of bits for the CU.  */
63 #define DW2_GDB_INDEX_CU_SET_VALUE(cu_index, value) \
64   do { \
65     gdb_assert (((value) & ~GDB_INDEX_CU_MASK) == 0); \
66     GDB_INDEX_CU_SET_VALUE((cu_index), (value)); \
67   } while (0)
68
69 /* The "save gdb-index" command.  */
70
71 /* Write SIZE bytes from the buffer pointed to by DATA to FILE, with
72    error checking.  */
73
74 static void
75 file_write (FILE *file, const void *data, size_t size)
76 {
77   if (fwrite (data, 1, size, file) != size)
78     error (_("couldn't data write to file"));
79 }
80
81 /* Write the contents of VEC to FILE, with error checking.  */
82
83 template<typename Elem, typename Alloc>
84 static void
85 file_write (FILE *file, const std::vector<Elem, Alloc> &vec)
86 {
87   file_write (file, vec.data (), vec.size () * sizeof (vec[0]));
88 }
89
90 /* In-memory buffer to prepare data to be written later to a file.  */
91 class data_buf
92 {
93 public:
94   /* Copy DATA to the end of the buffer.  */
95   template<typename T>
96   void append_data (const T &data)
97   {
98     std::copy (reinterpret_cast<const gdb_byte *> (&data),
99                reinterpret_cast<const gdb_byte *> (&data + 1),
100                grow (sizeof (data)));
101   }
102
103   /* Copy CSTR (a zero-terminated string) to the end of buffer.  The
104      terminating zero is appended too.  */
105   void append_cstr0 (const char *cstr)
106   {
107     const size_t size = strlen (cstr) + 1;
108     std::copy (cstr, cstr + size, grow (size));
109   }
110
111   /* Store INPUT as ULEB128 to the end of buffer.  */
112   void append_unsigned_leb128 (ULONGEST input)
113   {
114     for (;;)
115       {
116         gdb_byte output = input & 0x7f;
117         input >>= 7;
118         if (input)
119           output |= 0x80;
120         append_data (output);
121         if (input == 0)
122           break;
123       }
124   }
125
126   /* Accept a host-format integer in VAL and append it to the buffer
127      as a target-format integer which is LEN bytes long.  */
128   void append_uint (size_t len, bfd_endian byte_order, ULONGEST val)
129   {
130     ::store_unsigned_integer (grow (len), len, byte_order, val);
131   }
132
133   /* Return the size of the buffer.  */
134   size_t size () const
135   {
136     return m_vec.size ();
137   }
138
139   /* Return true iff the buffer is empty.  */
140   bool empty () const
141   {
142     return m_vec.empty ();
143   }
144
145   /* Write the buffer to FILE.  */
146   void file_write (FILE *file) const
147   {
148     ::file_write (file, m_vec);
149   }
150
151 private:
152   /* Grow SIZE bytes at the end of the buffer.  Returns a pointer to
153      the start of the new block.  */
154   gdb_byte *grow (size_t size)
155   {
156     m_vec.resize (m_vec.size () + size);
157     return &*m_vec.end () - size;
158   }
159
160   gdb::byte_vector m_vec;
161 };
162
163 /* An entry in the symbol table.  */
164 struct symtab_index_entry
165 {
166   /* The name of the symbol.  */
167   const char *name;
168   /* The offset of the name in the constant pool.  */
169   offset_type index_offset;
170   /* A sorted vector of the indices of all the CUs that hold an object
171      of this name.  */
172   std::vector<offset_type> cu_indices;
173 };
174
175 /* The symbol table.  This is a power-of-2-sized hash table.  */
176 struct mapped_symtab
177 {
178   mapped_symtab ()
179   {
180     data.resize (1024);
181   }
182
183   offset_type n_elements = 0;
184   std::vector<symtab_index_entry> data;
185 };
186
187 /* Find a slot in SYMTAB for the symbol NAME.  Returns a reference to
188    the slot.
189
190    Function is used only during write_hash_table so no index format backward
191    compatibility is needed.  */
192
193 static symtab_index_entry &
194 find_slot (struct mapped_symtab *symtab, const char *name)
195 {
196   offset_type index, step, hash = mapped_index_string_hash (INT_MAX, name);
197
198   index = hash & (symtab->data.size () - 1);
199   step = ((hash * 17) & (symtab->data.size () - 1)) | 1;
200
201   for (;;)
202     {
203       if (symtab->data[index].name == NULL
204           || strcmp (name, symtab->data[index].name) == 0)
205         return symtab->data[index];
206       index = (index + step) & (symtab->data.size () - 1);
207     }
208 }
209
210 /* Expand SYMTAB's hash table.  */
211
212 static void
213 hash_expand (struct mapped_symtab *symtab)
214 {
215   auto old_entries = std::move (symtab->data);
216
217   symtab->data.clear ();
218   symtab->data.resize (old_entries.size () * 2);
219
220   for (auto &it : old_entries)
221     if (it.name != NULL)
222       {
223         auto &ref = find_slot (symtab, it.name);
224         ref = std::move (it);
225       }
226 }
227
228 /* Add an entry to SYMTAB.  NAME is the name of the symbol.
229    CU_INDEX is the index of the CU in which the symbol appears.
230    IS_STATIC is one if the symbol is static, otherwise zero (global).  */
231
232 static void
233 add_index_entry (struct mapped_symtab *symtab, const char *name,
234                  int is_static, gdb_index_symbol_kind kind,
235                  offset_type cu_index)
236 {
237   offset_type cu_index_and_attrs;
238
239   ++symtab->n_elements;
240   if (4 * symtab->n_elements / 3 >= symtab->data.size ())
241     hash_expand (symtab);
242
243   symtab_index_entry &slot = find_slot (symtab, name);
244   if (slot.name == NULL)
245     {
246       slot.name = name;
247       /* index_offset is set later.  */
248     }
249
250   cu_index_and_attrs = 0;
251   DW2_GDB_INDEX_CU_SET_VALUE (cu_index_and_attrs, cu_index);
252   DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE (cu_index_and_attrs, is_static);
253   DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE (cu_index_and_attrs, kind);
254
255   /* We don't want to record an index value twice as we want to avoid the
256      duplication.
257      We process all global symbols and then all static symbols
258      (which would allow us to avoid the duplication by only having to check
259      the last entry pushed), but a symbol could have multiple kinds in one CU.
260      To keep things simple we don't worry about the duplication here and
261      sort and uniqufy the list after we've processed all symbols.  */
262   slot.cu_indices.push_back (cu_index_and_attrs);
263 }
264
265 /* Sort and remove duplicates of all symbols' cu_indices lists.  */
266
267 static void
268 uniquify_cu_indices (struct mapped_symtab *symtab)
269 {
270   for (auto &entry : symtab->data)
271     {
272       if (entry.name != NULL && !entry.cu_indices.empty ())
273         {
274           auto &cu_indices = entry.cu_indices;
275           std::sort (cu_indices.begin (), cu_indices.end ());
276           auto from = std::unique (cu_indices.begin (), cu_indices.end ());
277           cu_indices.erase (from, cu_indices.end ());
278         }
279     }
280 }
281
282 /* A form of 'const char *' suitable for container keys.  Only the
283    pointer is stored.  The strings themselves are compared, not the
284    pointers.  */
285 class c_str_view
286 {
287 public:
288   c_str_view (const char *cstr)
289     : m_cstr (cstr)
290   {}
291
292   bool operator== (const c_str_view &other) const
293   {
294     return strcmp (m_cstr, other.m_cstr) == 0;
295   }
296
297   /* Return the underlying C string.  Note, the returned string is
298      only a reference with lifetime of this object.  */
299   const char *c_str () const
300   {
301     return m_cstr;
302   }
303
304 private:
305   friend class c_str_view_hasher;
306   const char *const m_cstr;
307 };
308
309 /* A std::unordered_map::hasher for c_str_view that uses the right
310    hash function for strings in a mapped index.  */
311 class c_str_view_hasher
312 {
313 public:
314   size_t operator () (const c_str_view &x) const
315   {
316     return mapped_index_string_hash (INT_MAX, x.m_cstr);
317   }
318 };
319
320 /* A std::unordered_map::hasher for std::vector<>.  */
321 template<typename T>
322 class vector_hasher
323 {
324 public:
325   size_t operator () (const std::vector<T> &key) const
326   {
327     return iterative_hash (key.data (),
328                            sizeof (key.front ()) * key.size (), 0);
329   }
330 };
331
332 /* Write the mapped hash table SYMTAB to the data buffer OUTPUT, with
333    constant pool entries going into the data buffer CPOOL.  */
334
335 static void
336 write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool)
337 {
338   {
339     /* Elements are sorted vectors of the indices of all the CUs that
340        hold an object of this name.  */
341     std::unordered_map<std::vector<offset_type>, offset_type,
342                        vector_hasher<offset_type>>
343       symbol_hash_table;
344
345     /* We add all the index vectors to the constant pool first, to
346        ensure alignment is ok.  */
347     for (symtab_index_entry &entry : symtab->data)
348       {
349         if (entry.name == NULL)
350           continue;
351         gdb_assert (entry.index_offset == 0);
352
353         /* Finding before inserting is faster than always trying to
354            insert, because inserting always allocates a node, does the
355            lookup, and then destroys the new node if another node
356            already had the same key.  C++17 try_emplace will avoid
357            this.  */
358         const auto found
359           = symbol_hash_table.find (entry.cu_indices);
360         if (found != symbol_hash_table.end ())
361           {
362             entry.index_offset = found->second;
363             continue;
364           }
365
366         symbol_hash_table.emplace (entry.cu_indices, cpool.size ());
367         entry.index_offset = cpool.size ();
368         cpool.append_data (MAYBE_SWAP (entry.cu_indices.size ()));
369         for (const auto index : entry.cu_indices)
370           cpool.append_data (MAYBE_SWAP (index));
371       }
372   }
373
374   /* Now write out the hash table.  */
375   std::unordered_map<c_str_view, offset_type, c_str_view_hasher> str_table;
376   for (const auto &entry : symtab->data)
377     {
378       offset_type str_off, vec_off;
379
380       if (entry.name != NULL)
381         {
382           const auto insertpair = str_table.emplace (entry.name, cpool.size ());
383           if (insertpair.second)
384             cpool.append_cstr0 (entry.name);
385           str_off = insertpair.first->second;
386           vec_off = entry.index_offset;
387         }
388       else
389         {
390           /* While 0 is a valid constant pool index, it is not valid
391              to have 0 for both offsets.  */
392           str_off = 0;
393           vec_off = 0;
394         }
395
396       output.append_data (MAYBE_SWAP (str_off));
397       output.append_data (MAYBE_SWAP (vec_off));
398     }
399 }
400
401 typedef std::unordered_map<partial_symtab *, unsigned int> psym_index_map;
402
403 /* Helper struct for building the address table.  */
404 struct addrmap_index_data
405 {
406   addrmap_index_data (data_buf &addr_vec_, psym_index_map &cu_index_htab_)
407     : addr_vec (addr_vec_), cu_index_htab (cu_index_htab_)
408   {}
409
410   struct objfile *objfile;
411   data_buf &addr_vec;
412   psym_index_map &cu_index_htab;
413
414   /* Non-zero if the previous_* fields are valid.
415      We can't write an entry until we see the next entry (since it is only then
416      that we know the end of the entry).  */
417   int previous_valid;
418   /* Index of the CU in the table of all CUs in the index file.  */
419   unsigned int previous_cu_index;
420   /* Start address of the CU.  */
421   CORE_ADDR previous_cu_start;
422 };
423
424 /* Write an address entry to ADDR_VEC.  */
425
426 static void
427 add_address_entry (struct objfile *objfile, data_buf &addr_vec,
428                    CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
429 {
430   CORE_ADDR baseaddr;
431
432   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
433
434   addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start - baseaddr);
435   addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end - baseaddr);
436   addr_vec.append_data (MAYBE_SWAP (cu_index));
437 }
438
439 /* Worker function for traversing an addrmap to build the address table.  */
440
441 static int
442 add_address_entry_worker (void *datap, CORE_ADDR start_addr, void *obj)
443 {
444   struct addrmap_index_data *data = (struct addrmap_index_data *) datap;
445   struct partial_symtab *pst = (struct partial_symtab *) obj;
446
447   if (data->previous_valid)
448     add_address_entry (data->objfile, data->addr_vec,
449                        data->previous_cu_start, start_addr,
450                        data->previous_cu_index);
451
452   data->previous_cu_start = start_addr;
453   if (pst != NULL)
454     {
455       const auto it = data->cu_index_htab.find (pst);
456       gdb_assert (it != data->cu_index_htab.cend ());
457       data->previous_cu_index = it->second;
458       data->previous_valid = 1;
459     }
460   else
461     data->previous_valid = 0;
462
463   return 0;
464 }
465
466 /* Write OBJFILE's address map to ADDR_VEC.
467    CU_INDEX_HTAB is used to map addrmap entries to their CU indices
468    in the index file.  */
469
470 static void
471 write_address_map (struct objfile *objfile, data_buf &addr_vec,
472                    psym_index_map &cu_index_htab)
473 {
474   struct addrmap_index_data addrmap_index_data (addr_vec, cu_index_htab);
475
476   /* When writing the address table, we have to cope with the fact that
477      the addrmap iterator only provides the start of a region; we have to
478      wait until the next invocation to get the start of the next region.  */
479
480   addrmap_index_data.objfile = objfile;
481   addrmap_index_data.previous_valid = 0;
482
483   addrmap_foreach (objfile->psymtabs_addrmap, add_address_entry_worker,
484                    &addrmap_index_data);
485
486   /* It's highly unlikely the last entry (end address = 0xff...ff)
487      is valid, but we should still handle it.
488      The end address is recorded as the start of the next region, but that
489      doesn't work here.  To cope we pass 0xff...ff, this is a rare situation
490      anyway.  */
491   if (addrmap_index_data.previous_valid)
492     add_address_entry (objfile, addr_vec,
493                        addrmap_index_data.previous_cu_start, (CORE_ADDR) -1,
494                        addrmap_index_data.previous_cu_index);
495 }
496
497 /* Return the symbol kind of PSYM.  */
498
499 static gdb_index_symbol_kind
500 symbol_kind (struct partial_symbol *psym)
501 {
502   domain_enum domain = PSYMBOL_DOMAIN (psym);
503   enum address_class aclass = PSYMBOL_CLASS (psym);
504
505   switch (domain)
506     {
507     case VAR_DOMAIN:
508       switch (aclass)
509         {
510         case LOC_BLOCK:
511           return GDB_INDEX_SYMBOL_KIND_FUNCTION;
512         case LOC_TYPEDEF:
513           return GDB_INDEX_SYMBOL_KIND_TYPE;
514         case LOC_COMPUTED:
515         case LOC_CONST_BYTES:
516         case LOC_OPTIMIZED_OUT:
517         case LOC_STATIC:
518           return GDB_INDEX_SYMBOL_KIND_VARIABLE;
519         case LOC_CONST:
520           /* Note: It's currently impossible to recognize psyms as enum values
521              short of reading the type info.  For now punt.  */
522           return GDB_INDEX_SYMBOL_KIND_VARIABLE;
523         default:
524           /* There are other LOC_FOO values that one might want to classify
525              as variables, but dwarf2read.c doesn't currently use them.  */
526           return GDB_INDEX_SYMBOL_KIND_OTHER;
527         }
528     case STRUCT_DOMAIN:
529       return GDB_INDEX_SYMBOL_KIND_TYPE;
530     default:
531       return GDB_INDEX_SYMBOL_KIND_OTHER;
532     }
533 }
534
535 /* Add a list of partial symbols to SYMTAB.  */
536
537 static void
538 write_psymbols (struct mapped_symtab *symtab,
539                 std::unordered_set<partial_symbol *> &psyms_seen,
540                 struct partial_symbol **psymp,
541                 int count,
542                 offset_type cu_index,
543                 int is_static)
544 {
545   for (; count-- > 0; ++psymp)
546     {
547       struct partial_symbol *psym = *psymp;
548
549       if (SYMBOL_LANGUAGE (psym) == language_ada)
550         error (_("Ada is not currently supported by the index"));
551
552       /* Only add a given psymbol once.  */
553       if (psyms_seen.insert (psym).second)
554         {
555           gdb_index_symbol_kind kind = symbol_kind (psym);
556
557           add_index_entry (symtab, SYMBOL_SEARCH_NAME (psym),
558                            is_static, kind, cu_index);
559         }
560     }
561 }
562
563 /* A helper struct used when iterating over debug_types.  */
564 struct signatured_type_index_data
565 {
566   signatured_type_index_data (data_buf &types_list_,
567                               std::unordered_set<partial_symbol *> &psyms_seen_)
568     : types_list (types_list_), psyms_seen (psyms_seen_)
569   {}
570
571   struct objfile *objfile;
572   struct mapped_symtab *symtab;
573   data_buf &types_list;
574   std::unordered_set<partial_symbol *> &psyms_seen;
575   int cu_index;
576 };
577
578 /* A helper function that writes a single signatured_type to an
579    obstack.  */
580
581 static int
582 write_one_signatured_type (void **slot, void *d)
583 {
584   struct signatured_type_index_data *info
585     = (struct signatured_type_index_data *) d;
586   struct signatured_type *entry = (struct signatured_type *) *slot;
587   struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
588
589   write_psymbols (info->symtab,
590                   info->psyms_seen,
591                   &info->objfile->global_psymbols[psymtab->globals_offset],
592                   psymtab->n_global_syms, info->cu_index,
593                   0);
594   write_psymbols (info->symtab,
595                   info->psyms_seen,
596                   &info->objfile->static_psymbols[psymtab->statics_offset],
597                   psymtab->n_static_syms, info->cu_index,
598                   1);
599
600   info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
601                                 to_underlying (entry->per_cu.sect_off));
602   info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
603                                 to_underlying (entry->type_offset_in_tu));
604   info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, entry->signature);
605
606   ++info->cu_index;
607
608   return 1;
609 }
610
611 /* Recurse into all "included" dependencies and count their symbols as
612    if they appeared in this psymtab.  */
613
614 static void
615 recursively_count_psymbols (struct partial_symtab *psymtab,
616                             size_t &psyms_seen)
617 {
618   for (int i = 0; i < psymtab->number_of_dependencies; ++i)
619     if (psymtab->dependencies[i]->user != NULL)
620       recursively_count_psymbols (psymtab->dependencies[i],
621                                   psyms_seen);
622
623   psyms_seen += psymtab->n_global_syms;
624   psyms_seen += psymtab->n_static_syms;
625 }
626
627 /* Recurse into all "included" dependencies and write their symbols as
628    if they appeared in this psymtab.  */
629
630 static void
631 recursively_write_psymbols (struct objfile *objfile,
632                             struct partial_symtab *psymtab,
633                             struct mapped_symtab *symtab,
634                             std::unordered_set<partial_symbol *> &psyms_seen,
635                             offset_type cu_index)
636 {
637   int i;
638
639   for (i = 0; i < psymtab->number_of_dependencies; ++i)
640     if (psymtab->dependencies[i]->user != NULL)
641       recursively_write_psymbols (objfile, psymtab->dependencies[i],
642                                   symtab, psyms_seen, cu_index);
643
644   write_psymbols (symtab,
645                   psyms_seen,
646                   &objfile->global_psymbols[psymtab->globals_offset],
647                   psymtab->n_global_syms, cu_index,
648                   0);
649   write_psymbols (symtab,
650                   psyms_seen,
651                   &objfile->static_psymbols[psymtab->statics_offset],
652                   psymtab->n_static_syms, cu_index,
653                   1);
654 }
655
656 /* DWARF-5 .debug_names builder.  */
657 class debug_names
658 {
659 public:
660   debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, bool is_dwarf64,
661                bfd_endian dwarf5_byte_order)
662     : m_dwarf5_byte_order (dwarf5_byte_order),
663       m_dwarf32 (dwarf5_byte_order),
664       m_dwarf64 (dwarf5_byte_order),
665       m_dwarf (is_dwarf64
666                ? static_cast<dwarf &> (m_dwarf64)
667                : static_cast<dwarf &> (m_dwarf32)),
668       m_name_table_string_offs (m_dwarf.name_table_string_offs),
669       m_name_table_entry_offs (m_dwarf.name_table_entry_offs),
670       m_debugstrlookup (dwarf2_per_objfile)
671   {}
672
673   int dwarf5_offset_size () const
674   {
675     const bool dwarf5_is_dwarf64 = &m_dwarf == &m_dwarf64;
676     return dwarf5_is_dwarf64 ? 8 : 4;
677   }
678
679   /* Is this symbol from DW_TAG_compile_unit or DW_TAG_type_unit?  */
680   enum class unit_kind { cu, tu };
681
682   /* Insert one symbol.  */
683   void insert (const partial_symbol *psym, int cu_index, bool is_static,
684                unit_kind kind)
685   {
686     const int dwarf_tag = psymbol_tag (psym);
687     if (dwarf_tag == 0)
688       return;
689     const char *const name = SYMBOL_SEARCH_NAME (psym);
690     const auto insertpair
691       = m_name_to_value_set.emplace (c_str_view (name),
692                                      std::set<symbol_value> ());
693     std::set<symbol_value> &value_set = insertpair.first->second;
694     value_set.emplace (symbol_value (dwarf_tag, cu_index, is_static, kind));
695   }
696
697   /* Build all the tables.  All symbols must be already inserted.
698      This function does not call file_write, caller has to do it
699      afterwards.  */
700   void build ()
701   {
702     /* Verify the build method has not be called twice.  */
703     gdb_assert (m_abbrev_table.empty ());
704     const size_t name_count = m_name_to_value_set.size ();
705     m_bucket_table.resize
706       (std::pow (2, std::ceil (std::log2 (name_count * 4 / 3))));
707     m_hash_table.reserve (name_count);
708     m_name_table_string_offs.reserve (name_count);
709     m_name_table_entry_offs.reserve (name_count);
710
711     /* Map each hash of symbol to its name and value.  */
712     struct hash_it_pair
713     {
714       uint32_t hash;
715       decltype (m_name_to_value_set)::const_iterator it;
716     };
717     std::vector<std::forward_list<hash_it_pair>> bucket_hash;
718     bucket_hash.resize (m_bucket_table.size ());
719     for (decltype (m_name_to_value_set)::const_iterator it
720            = m_name_to_value_set.cbegin ();
721          it != m_name_to_value_set.cend ();
722          ++it)
723       {
724         const char *const name = it->first.c_str ();
725         const uint32_t hash = dwarf5_djb_hash (name);
726         hash_it_pair hashitpair;
727         hashitpair.hash = hash;
728         hashitpair.it = it;
729         auto &slot = bucket_hash[hash % bucket_hash.size()];
730         slot.push_front (std::move (hashitpair));
731       }
732     for (size_t bucket_ix = 0; bucket_ix < bucket_hash.size (); ++bucket_ix)
733       {
734         const std::forward_list<hash_it_pair> &hashitlist
735           = bucket_hash[bucket_ix];
736         if (hashitlist.empty ())
737           continue;
738         uint32_t &bucket_slot = m_bucket_table[bucket_ix];
739         /* The hashes array is indexed starting at 1.  */
740         store_unsigned_integer (reinterpret_cast<gdb_byte *> (&bucket_slot),
741                                 sizeof (bucket_slot), m_dwarf5_byte_order,
742                                 m_hash_table.size () + 1);
743         for (const hash_it_pair &hashitpair : hashitlist)
744           {
745             m_hash_table.push_back (0);
746             store_unsigned_integer (reinterpret_cast<gdb_byte *>
747                                                         (&m_hash_table.back ()),
748                                     sizeof (m_hash_table.back ()),
749                                     m_dwarf5_byte_order, hashitpair.hash);
750             const c_str_view &name = hashitpair.it->first;
751             const std::set<symbol_value> &value_set = hashitpair.it->second;
752             m_name_table_string_offs.push_back_reorder
753               (m_debugstrlookup.lookup (name.c_str ()));
754             m_name_table_entry_offs.push_back_reorder (m_entry_pool.size ());
755             gdb_assert (!value_set.empty ());
756             for (const symbol_value &value : value_set)
757               {
758                 int &idx = m_indexkey_to_idx[index_key (value.dwarf_tag,
759                                                         value.is_static,
760                                                         value.kind)];
761                 if (idx == 0)
762                   {
763                     idx = m_idx_next++;
764                     m_abbrev_table.append_unsigned_leb128 (idx);
765                     m_abbrev_table.append_unsigned_leb128 (value.dwarf_tag);
766                     m_abbrev_table.append_unsigned_leb128
767                               (value.kind == unit_kind::cu ? DW_IDX_compile_unit
768                                                            : DW_IDX_type_unit);
769                     m_abbrev_table.append_unsigned_leb128 (DW_FORM_udata);
770                     m_abbrev_table.append_unsigned_leb128 (value.is_static
771                                                            ? DW_IDX_GNU_internal
772                                                            : DW_IDX_GNU_external);
773                     m_abbrev_table.append_unsigned_leb128 (DW_FORM_flag_present);
774
775                     /* Terminate attributes list.  */
776                     m_abbrev_table.append_unsigned_leb128 (0);
777                     m_abbrev_table.append_unsigned_leb128 (0);
778                   }
779
780                 m_entry_pool.append_unsigned_leb128 (idx);
781                 m_entry_pool.append_unsigned_leb128 (value.cu_index);
782               }
783
784             /* Terminate the list of CUs.  */
785             m_entry_pool.append_unsigned_leb128 (0);
786           }
787       }
788     gdb_assert (m_hash_table.size () == name_count);
789
790     /* Terminate tags list.  */
791     m_abbrev_table.append_unsigned_leb128 (0);
792   }
793
794   /* Return .debug_names bucket count.  This must be called only after
795      calling the build method.  */
796   uint32_t bucket_count () const
797   {
798     /* Verify the build method has been already called.  */
799     gdb_assert (!m_abbrev_table.empty ());
800     const uint32_t retval = m_bucket_table.size ();
801
802     /* Check for overflow.  */
803     gdb_assert (retval == m_bucket_table.size ());
804     return retval;
805   }
806
807   /* Return .debug_names names count.  This must be called only after
808      calling the build method.  */
809   uint32_t name_count () const
810   {
811     /* Verify the build method has been already called.  */
812     gdb_assert (!m_abbrev_table.empty ());
813     const uint32_t retval = m_hash_table.size ();
814
815     /* Check for overflow.  */
816     gdb_assert (retval == m_hash_table.size ());
817     return retval;
818   }
819
820   /* Return number of bytes of .debug_names abbreviation table.  This
821      must be called only after calling the build method.  */
822   uint32_t abbrev_table_bytes () const
823   {
824     gdb_assert (!m_abbrev_table.empty ());
825     return m_abbrev_table.size ();
826   }
827
828   /* Recurse into all "included" dependencies and store their symbols
829      as if they appeared in this psymtab.  */
830   void recursively_write_psymbols
831     (struct objfile *objfile,
832      struct partial_symtab *psymtab,
833      std::unordered_set<partial_symbol *> &psyms_seen,
834      int cu_index)
835   {
836     for (int i = 0; i < psymtab->number_of_dependencies; ++i)
837       if (psymtab->dependencies[i]->user != NULL)
838         recursively_write_psymbols (objfile, psymtab->dependencies[i],
839                                     psyms_seen, cu_index);
840
841     write_psymbols (psyms_seen,
842                     &objfile->global_psymbols[psymtab->globals_offset],
843                     psymtab->n_global_syms, cu_index, false, unit_kind::cu);
844     write_psymbols (psyms_seen,
845                     &objfile->static_psymbols[psymtab->statics_offset],
846                     psymtab->n_static_syms, cu_index, true, unit_kind::cu);
847   }
848
849   /* Return number of bytes the .debug_names section will have.  This
850      must be called only after calling the build method.  */
851   size_t bytes () const
852   {
853     /* Verify the build method has been already called.  */
854     gdb_assert (!m_abbrev_table.empty ());
855     size_t expected_bytes = 0;
856     expected_bytes += m_bucket_table.size () * sizeof (m_bucket_table[0]);
857     expected_bytes += m_hash_table.size () * sizeof (m_hash_table[0]);
858     expected_bytes += m_name_table_string_offs.bytes ();
859     expected_bytes += m_name_table_entry_offs.bytes ();
860     expected_bytes += m_abbrev_table.size ();
861     expected_bytes += m_entry_pool.size ();
862     return expected_bytes;
863   }
864
865   /* Write .debug_names to FILE_NAMES and .debug_str addition to
866      FILE_STR.  This must be called only after calling the build
867      method.  */
868   void file_write (FILE *file_names, FILE *file_str) const
869   {
870     /* Verify the build method has been already called.  */
871     gdb_assert (!m_abbrev_table.empty ());
872     ::file_write (file_names, m_bucket_table);
873     ::file_write (file_names, m_hash_table);
874     m_name_table_string_offs.file_write (file_names);
875     m_name_table_entry_offs.file_write (file_names);
876     m_abbrev_table.file_write (file_names);
877     m_entry_pool.file_write (file_names);
878     m_debugstrlookup.file_write (file_str);
879   }
880
881   /* A helper user data for write_one_signatured_type.  */
882   class write_one_signatured_type_data
883   {
884   public:
885     write_one_signatured_type_data (debug_names &nametable_,
886                                     signatured_type_index_data &&info_)
887     : nametable (nametable_), info (std::move (info_))
888     {}
889     debug_names &nametable;
890     struct signatured_type_index_data info;
891   };
892
893   /* A helper function to pass write_one_signatured_type to
894      htab_traverse_noresize.  */
895   static int
896   write_one_signatured_type (void **slot, void *d)
897   {
898     write_one_signatured_type_data *data = (write_one_signatured_type_data *) d;
899     struct signatured_type_index_data *info = &data->info;
900     struct signatured_type *entry = (struct signatured_type *) *slot;
901
902     data->nametable.write_one_signatured_type (entry, info);
903
904     return 1;
905   }
906
907 private:
908
909   /* Storage for symbol names mapping them to their .debug_str section
910      offsets.  */
911   class debug_str_lookup
912   {
913   public:
914
915     /* Object costructor to be called for current DWARF2_PER_OBJFILE.
916        All .debug_str section strings are automatically stored.  */
917     debug_str_lookup (struct dwarf2_per_objfile *dwarf2_per_objfile)
918       : m_abfd (dwarf2_per_objfile->objfile->obfd),
919         m_dwarf2_per_objfile (dwarf2_per_objfile)
920     {
921       dwarf2_read_section (dwarf2_per_objfile->objfile,
922                            &dwarf2_per_objfile->str);
923       if (dwarf2_per_objfile->str.buffer == NULL)
924         return;
925       for (const gdb_byte *data = dwarf2_per_objfile->str.buffer;
926            data < (dwarf2_per_objfile->str.buffer
927                    + dwarf2_per_objfile->str.size);)
928         {
929           const char *const s = reinterpret_cast<const char *> (data);
930           const auto insertpair
931             = m_str_table.emplace (c_str_view (s),
932                                    data - dwarf2_per_objfile->str.buffer);
933           if (!insertpair.second)
934             complaint (&symfile_complaints,
935                        _("Duplicate string \"%s\" in "
936                          ".debug_str section [in module %s]"),
937                        s, bfd_get_filename (m_abfd));
938           data += strlen (s) + 1;
939         }
940     }
941
942     /* Return offset of symbol name S in the .debug_str section.  Add
943        such symbol to the section's end if it does not exist there
944        yet.  */
945     size_t lookup (const char *s)
946     {
947       const auto it = m_str_table.find (c_str_view (s));
948       if (it != m_str_table.end ())
949         return it->second;
950       const size_t offset = (m_dwarf2_per_objfile->str.size
951                              + m_str_add_buf.size ());
952       m_str_table.emplace (c_str_view (s), offset);
953       m_str_add_buf.append_cstr0 (s);
954       return offset;
955     }
956
957     /* Append the end of the .debug_str section to FILE.  */
958     void file_write (FILE *file) const
959     {
960       m_str_add_buf.file_write (file);
961     }
962
963   private:
964     std::unordered_map<c_str_view, size_t, c_str_view_hasher> m_str_table;
965     bfd *const m_abfd;
966     struct dwarf2_per_objfile *m_dwarf2_per_objfile;
967
968     /* Data to add at the end of .debug_str for new needed symbol names.  */
969     data_buf m_str_add_buf;
970   };
971
972   /* Container to map used DWARF tags to their .debug_names abbreviation
973      tags.  */
974   class index_key
975   {
976   public:
977     index_key (int dwarf_tag_, bool is_static_, unit_kind kind_)
978       : dwarf_tag (dwarf_tag_), is_static (is_static_), kind (kind_)
979     {
980     }
981
982     bool
983     operator== (const index_key &other) const
984     {
985       return (dwarf_tag == other.dwarf_tag && is_static == other.is_static
986               && kind == other.kind);
987     }
988
989     const int dwarf_tag;
990     const bool is_static;
991     const unit_kind kind;
992   };
993
994   /* Provide std::unordered_map::hasher for index_key.  */
995   class index_key_hasher
996   {
997   public:
998     size_t
999     operator () (const index_key &key) const
1000     {
1001       return (std::hash<int>() (key.dwarf_tag) << 1) | key.is_static;
1002     }
1003   };
1004
1005   /* Parameters of one symbol entry.  */
1006   class symbol_value
1007   {
1008   public:
1009     const int dwarf_tag, cu_index;
1010     const bool is_static;
1011     const unit_kind kind;
1012
1013     symbol_value (int dwarf_tag_, int cu_index_, bool is_static_,
1014                   unit_kind kind_)
1015       : dwarf_tag (dwarf_tag_), cu_index (cu_index_), is_static (is_static_),
1016         kind (kind_)
1017     {}
1018
1019     bool
1020     operator< (const symbol_value &other) const
1021     {
1022 #define X(n) \
1023   do \
1024     { \
1025       if (n < other.n) \
1026         return true; \
1027       if (n > other.n) \
1028         return false; \
1029     } \
1030   while (0)
1031       X (dwarf_tag);
1032       X (is_static);
1033       X (kind);
1034       X (cu_index);
1035 #undef X
1036       return false;
1037     }
1038   };
1039
1040   /* Abstract base class to unify DWARF-32 and DWARF-64 name table
1041      output.  */
1042   class offset_vec
1043   {
1044   protected:
1045     const bfd_endian dwarf5_byte_order;
1046   public:
1047     explicit offset_vec (bfd_endian dwarf5_byte_order_)
1048       : dwarf5_byte_order (dwarf5_byte_order_)
1049     {}
1050
1051     /* Call std::vector::reserve for NELEM elements.  */
1052     virtual void reserve (size_t nelem) = 0;
1053
1054     /* Call std::vector::push_back with store_unsigned_integer byte
1055        reordering for ELEM.  */
1056     virtual void push_back_reorder (size_t elem) = 0;
1057
1058     /* Return expected output size in bytes.  */
1059     virtual size_t bytes () const = 0;
1060
1061     /* Write name table to FILE.  */
1062     virtual void file_write (FILE *file) const = 0;
1063   };
1064
1065   /* Template to unify DWARF-32 and DWARF-64 output.  */
1066   template<typename OffsetSize>
1067   class offset_vec_tmpl : public offset_vec
1068   {
1069   public:
1070     explicit offset_vec_tmpl (bfd_endian dwarf5_byte_order_)
1071       : offset_vec (dwarf5_byte_order_)
1072     {}
1073
1074     /* Implement offset_vec::reserve.  */
1075     void reserve (size_t nelem) override
1076     {
1077       m_vec.reserve (nelem);
1078     }
1079
1080     /* Implement offset_vec::push_back_reorder.  */
1081     void push_back_reorder (size_t elem) override
1082     {
1083       m_vec.push_back (elem);
1084       /* Check for overflow.  */
1085       gdb_assert (m_vec.back () == elem);
1086       store_unsigned_integer (reinterpret_cast<gdb_byte *> (&m_vec.back ()),
1087                               sizeof (m_vec.back ()), dwarf5_byte_order, elem);
1088     }
1089
1090     /* Implement offset_vec::bytes.  */
1091     size_t bytes () const override
1092     {
1093       return m_vec.size () * sizeof (m_vec[0]);
1094     }
1095
1096     /* Implement offset_vec::file_write.  */
1097     void file_write (FILE *file) const override
1098     {
1099       ::file_write (file, m_vec);
1100     }
1101
1102   private:
1103     std::vector<OffsetSize> m_vec;
1104   };
1105
1106   /* Base class to unify DWARF-32 and DWARF-64 .debug_names output
1107      respecting name table width.  */
1108   class dwarf
1109   {
1110   public:
1111     offset_vec &name_table_string_offs, &name_table_entry_offs;
1112
1113     dwarf (offset_vec &name_table_string_offs_,
1114            offset_vec &name_table_entry_offs_)
1115       : name_table_string_offs (name_table_string_offs_),
1116         name_table_entry_offs (name_table_entry_offs_)
1117     {
1118     }
1119   };
1120
1121   /* Template to unify DWARF-32 and DWARF-64 .debug_names output
1122      respecting name table width.  */
1123   template<typename OffsetSize>
1124   class dwarf_tmpl : public dwarf
1125   {
1126   public:
1127     explicit dwarf_tmpl (bfd_endian dwarf5_byte_order_)
1128       : dwarf (m_name_table_string_offs, m_name_table_entry_offs),
1129         m_name_table_string_offs (dwarf5_byte_order_),
1130         m_name_table_entry_offs (dwarf5_byte_order_)
1131     {}
1132
1133   private:
1134     offset_vec_tmpl<OffsetSize> m_name_table_string_offs;
1135     offset_vec_tmpl<OffsetSize> m_name_table_entry_offs;
1136   };
1137
1138   /* Try to reconstruct original DWARF tag for given partial_symbol.
1139      This function is not DWARF-5 compliant but it is sufficient for
1140      GDB as a DWARF-5 index consumer.  */
1141   static int psymbol_tag (const struct partial_symbol *psym)
1142   {
1143     domain_enum domain = PSYMBOL_DOMAIN (psym);
1144     enum address_class aclass = PSYMBOL_CLASS (psym);
1145
1146     switch (domain)
1147       {
1148       case VAR_DOMAIN:
1149         switch (aclass)
1150           {
1151           case LOC_BLOCK:
1152             return DW_TAG_subprogram;
1153           case LOC_TYPEDEF:
1154             return DW_TAG_typedef;
1155           case LOC_COMPUTED:
1156           case LOC_CONST_BYTES:
1157           case LOC_OPTIMIZED_OUT:
1158           case LOC_STATIC:
1159             return DW_TAG_variable;
1160           case LOC_CONST:
1161             /* Note: It's currently impossible to recognize psyms as enum values
1162                short of reading the type info.  For now punt.  */
1163             return DW_TAG_variable;
1164           default:
1165             /* There are other LOC_FOO values that one might want to classify
1166                as variables, but dwarf2read.c doesn't currently use them.  */
1167             return DW_TAG_variable;
1168           }
1169       case STRUCT_DOMAIN:
1170         return DW_TAG_structure_type;
1171       default:
1172         return 0;
1173       }
1174   }
1175
1176   /* Call insert for all partial symbols and mark them in PSYMS_SEEN.  */
1177   void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen,
1178                        struct partial_symbol **psymp, int count, int cu_index,
1179                        bool is_static, unit_kind kind)
1180   {
1181     for (; count-- > 0; ++psymp)
1182       {
1183         struct partial_symbol *psym = *psymp;
1184
1185         if (SYMBOL_LANGUAGE (psym) == language_ada)
1186           error (_("Ada is not currently supported by the index"));
1187
1188         /* Only add a given psymbol once.  */
1189         if (psyms_seen.insert (psym).second)
1190           insert (psym, cu_index, is_static, kind);
1191       }
1192   }
1193
1194   /* A helper function that writes a single signatured_type
1195      to a debug_names.  */
1196   void
1197   write_one_signatured_type (struct signatured_type *entry,
1198                              struct signatured_type_index_data *info)
1199   {
1200     struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
1201
1202     write_psymbols (info->psyms_seen,
1203                     &info->objfile->global_psymbols[psymtab->globals_offset],
1204                     psymtab->n_global_syms, info->cu_index, false,
1205                     unit_kind::tu);
1206     write_psymbols (info->psyms_seen,
1207                     &info->objfile->static_psymbols[psymtab->statics_offset],
1208                     psymtab->n_static_syms, info->cu_index, true,
1209                     unit_kind::tu);
1210
1211     info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
1212                                   to_underlying (entry->per_cu.sect_off));
1213
1214     ++info->cu_index;
1215   }
1216
1217   /* Store value of each symbol.  */
1218   std::unordered_map<c_str_view, std::set<symbol_value>, c_str_view_hasher>
1219     m_name_to_value_set;
1220
1221   /* Tables of DWARF-5 .debug_names.  They are in object file byte
1222      order.  */
1223   std::vector<uint32_t> m_bucket_table;
1224   std::vector<uint32_t> m_hash_table;
1225
1226   const bfd_endian m_dwarf5_byte_order;
1227   dwarf_tmpl<uint32_t> m_dwarf32;
1228   dwarf_tmpl<uint64_t> m_dwarf64;
1229   dwarf &m_dwarf;
1230   offset_vec &m_name_table_string_offs, &m_name_table_entry_offs;
1231   debug_str_lookup m_debugstrlookup;
1232
1233   /* Map each used .debug_names abbreviation tag parameter to its
1234      index value.  */
1235   std::unordered_map<index_key, int, index_key_hasher> m_indexkey_to_idx;
1236
1237   /* Next unused .debug_names abbreviation tag for
1238      m_indexkey_to_idx.  */
1239   int m_idx_next = 1;
1240
1241   /* .debug_names abbreviation table.  */
1242   data_buf m_abbrev_table;
1243
1244   /* .debug_names entry pool.  */
1245   data_buf m_entry_pool;
1246 };
1247
1248 /* Return iff any of the needed offsets does not fit into 32-bit
1249    .debug_names section.  */
1250
1251 static bool
1252 check_dwarf64_offsets (struct dwarf2_per_objfile *dwarf2_per_objfile)
1253 {
1254   for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1255     {
1256       if (to_underlying (per_cu->sect_off) >= (static_cast<uint64_t> (1) << 32))
1257         return true;
1258     }
1259   for (const signatured_type *sigtype : dwarf2_per_objfile->all_type_units)
1260     {
1261       const dwarf2_per_cu_data &per_cu = sigtype->per_cu;
1262
1263       if (to_underlying (per_cu.sect_off) >= (static_cast<uint64_t> (1) << 32))
1264         return true;
1265     }
1266   return false;
1267 }
1268
1269 /* The psyms_seen set is potentially going to be largish (~40k
1270    elements when indexing a -g3 build of GDB itself).  Estimate the
1271    number of elements in order to avoid too many rehashes, which
1272    require rebuilding buckets and thus many trips to
1273    malloc/free.  */
1274
1275 static size_t
1276 psyms_seen_size (struct dwarf2_per_objfile *dwarf2_per_objfile)
1277 {
1278   size_t psyms_count = 0;
1279   for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1280     {
1281       struct partial_symtab *psymtab = per_cu->v.psymtab;
1282
1283       if (psymtab != NULL && psymtab->user == NULL)
1284         recursively_count_psymbols (psymtab, psyms_count);
1285     }
1286   /* Generating an index for gdb itself shows a ratio of
1287      TOTAL_SEEN_SYMS/UNIQUE_SYMS or ~5.  4 seems like a good bet.  */
1288   return psyms_count / 4;
1289 }
1290
1291 /* Write new .gdb_index section for OBJFILE into OUT_FILE.
1292    Return how many bytes were expected to be written into OUT_FILE.  */
1293
1294 static size_t
1295 write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file)
1296 {
1297   struct objfile *objfile = dwarf2_per_objfile->objfile;
1298   mapped_symtab symtab;
1299   data_buf cu_list;
1300
1301   /* While we're scanning CU's create a table that maps a psymtab pointer
1302      (which is what addrmap records) to its index (which is what is recorded
1303      in the index file).  This will later be needed to write the address
1304      table.  */
1305   psym_index_map cu_index_htab;
1306   cu_index_htab.reserve (dwarf2_per_objfile->all_comp_units.size ());
1307
1308   /* The CU list is already sorted, so we don't need to do additional
1309      work here.  Also, the debug_types entries do not appear in
1310      all_comp_units, but only in their own hash table.  */
1311
1312   std::unordered_set<partial_symbol *> psyms_seen
1313     (psyms_seen_size (dwarf2_per_objfile));
1314   for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1315     {
1316       struct dwarf2_per_cu_data *per_cu
1317         = dwarf2_per_objfile->all_comp_units[i];
1318       struct partial_symtab *psymtab = per_cu->v.psymtab;
1319
1320       /* CU of a shared file from 'dwz -m' may be unused by this main file.
1321          It may be referenced from a local scope but in such case it does not
1322          need to be present in .gdb_index.  */
1323       if (psymtab == NULL)
1324         continue;
1325
1326       if (psymtab->user == NULL)
1327         recursively_write_psymbols (objfile, psymtab, &symtab,
1328                                     psyms_seen, i);
1329
1330       const auto insertpair = cu_index_htab.emplace (psymtab, i);
1331       gdb_assert (insertpair.second);
1332
1333       cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
1334                            to_underlying (per_cu->sect_off));
1335       cu_list.append_uint (8, BFD_ENDIAN_LITTLE, per_cu->length);
1336     }
1337
1338   /* Dump the address map.  */
1339   data_buf addr_vec;
1340   write_address_map (objfile, addr_vec, cu_index_htab);
1341
1342   /* Write out the .debug_type entries, if any.  */
1343   data_buf types_cu_list;
1344   if (dwarf2_per_objfile->signatured_types)
1345     {
1346       signatured_type_index_data sig_data (types_cu_list,
1347                                            psyms_seen);
1348
1349       sig_data.objfile = objfile;
1350       sig_data.symtab = &symtab;
1351       sig_data.cu_index = dwarf2_per_objfile->all_comp_units.size ();
1352       htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1353                               write_one_signatured_type, &sig_data);
1354     }
1355
1356   /* Now that we've processed all symbols we can shrink their cu_indices
1357      lists.  */
1358   uniquify_cu_indices (&symtab);
1359
1360   data_buf symtab_vec, constant_pool;
1361   write_hash_table (&symtab, symtab_vec, constant_pool);
1362
1363   data_buf contents;
1364   const offset_type size_of_contents = 6 * sizeof (offset_type);
1365   offset_type total_len = size_of_contents;
1366
1367   /* The version number.  */
1368   contents.append_data (MAYBE_SWAP (8));
1369
1370   /* The offset of the CU list from the start of the file.  */
1371   contents.append_data (MAYBE_SWAP (total_len));
1372   total_len += cu_list.size ();
1373
1374   /* The offset of the types CU list from the start of the file.  */
1375   contents.append_data (MAYBE_SWAP (total_len));
1376   total_len += types_cu_list.size ();
1377
1378   /* The offset of the address table from the start of the file.  */
1379   contents.append_data (MAYBE_SWAP (total_len));
1380   total_len += addr_vec.size ();
1381
1382   /* The offset of the symbol table from the start of the file.  */
1383   contents.append_data (MAYBE_SWAP (total_len));
1384   total_len += symtab_vec.size ();
1385
1386   /* The offset of the constant pool from the start of the file.  */
1387   contents.append_data (MAYBE_SWAP (total_len));
1388   total_len += constant_pool.size ();
1389
1390   gdb_assert (contents.size () == size_of_contents);
1391
1392   contents.file_write (out_file);
1393   cu_list.file_write (out_file);
1394   types_cu_list.file_write (out_file);
1395   addr_vec.file_write (out_file);
1396   symtab_vec.file_write (out_file);
1397   constant_pool.file_write (out_file);
1398
1399   return total_len;
1400 }
1401
1402 /* DWARF-5 augmentation string for GDB's DW_IDX_GNU_* extension.  */
1403 static const gdb_byte dwarf5_gdb_augmentation[] = { 'G', 'D', 'B', 0 };
1404
1405 /* Write a new .debug_names section for OBJFILE into OUT_FILE, write
1406    needed addition to .debug_str section to OUT_FILE_STR.  Return how
1407    many bytes were expected to be written into OUT_FILE.  */
1408
1409 static size_t
1410 write_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile,
1411                    FILE *out_file, FILE *out_file_str)
1412 {
1413   const bool dwarf5_is_dwarf64 = check_dwarf64_offsets (dwarf2_per_objfile);
1414   struct objfile *objfile = dwarf2_per_objfile->objfile;
1415   const enum bfd_endian dwarf5_byte_order
1416     = gdbarch_byte_order (get_objfile_arch (objfile));
1417
1418   /* The CU list is already sorted, so we don't need to do additional
1419      work here.  Also, the debug_types entries do not appear in
1420      all_comp_units, but only in their own hash table.  */
1421   data_buf cu_list;
1422   debug_names nametable (dwarf2_per_objfile, dwarf5_is_dwarf64,
1423                          dwarf5_byte_order);
1424   std::unordered_set<partial_symbol *>
1425     psyms_seen (psyms_seen_size (dwarf2_per_objfile));
1426   for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1427     {
1428       const dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->all_comp_units[i];
1429       partial_symtab *psymtab = per_cu->v.psymtab;
1430
1431       /* CU of a shared file from 'dwz -m' may be unused by this main
1432          file.  It may be referenced from a local scope but in such
1433          case it does not need to be present in .debug_names.  */
1434       if (psymtab == NULL)
1435         continue;
1436
1437       if (psymtab->user == NULL)
1438         nametable.recursively_write_psymbols (objfile, psymtab, psyms_seen, i);
1439
1440       cu_list.append_uint (nametable.dwarf5_offset_size (), dwarf5_byte_order,
1441                            to_underlying (per_cu->sect_off));
1442     }
1443
1444   /* Write out the .debug_type entries, if any.  */
1445   data_buf types_cu_list;
1446   if (dwarf2_per_objfile->signatured_types)
1447     {
1448       debug_names::write_one_signatured_type_data sig_data (nametable,
1449                         signatured_type_index_data (types_cu_list, psyms_seen));
1450
1451       sig_data.info.objfile = objfile;
1452       /* It is used only for gdb_index.  */
1453       sig_data.info.symtab = nullptr;
1454       sig_data.info.cu_index = 0;
1455       htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1456                               debug_names::write_one_signatured_type,
1457                               &sig_data);
1458     }
1459
1460   nametable.build ();
1461
1462   /* No addr_vec - DWARF-5 uses .debug_aranges generated by GCC.  */
1463
1464   const offset_type bytes_of_header
1465     = ((dwarf5_is_dwarf64 ? 12 : 4)
1466        + 2 + 2 + 7 * 4
1467        + sizeof (dwarf5_gdb_augmentation));
1468   size_t expected_bytes = 0;
1469   expected_bytes += bytes_of_header;
1470   expected_bytes += cu_list.size ();
1471   expected_bytes += types_cu_list.size ();
1472   expected_bytes += nametable.bytes ();
1473   data_buf header;
1474
1475   if (!dwarf5_is_dwarf64)
1476     {
1477       const uint64_t size64 = expected_bytes - 4;
1478       gdb_assert (size64 < 0xfffffff0);
1479       header.append_uint (4, dwarf5_byte_order, size64);
1480     }
1481   else
1482     {
1483       header.append_uint (4, dwarf5_byte_order, 0xffffffff);
1484       header.append_uint (8, dwarf5_byte_order, expected_bytes - 12);
1485     }
1486
1487   /* The version number.  */
1488   header.append_uint (2, dwarf5_byte_order, 5);
1489
1490   /* Padding.  */
1491   header.append_uint (2, dwarf5_byte_order, 0);
1492
1493   /* comp_unit_count - The number of CUs in the CU list.  */
1494   header.append_uint (4, dwarf5_byte_order,
1495                       dwarf2_per_objfile->all_comp_units.size ());
1496
1497   /* local_type_unit_count - The number of TUs in the local TU
1498      list.  */
1499   header.append_uint (4, dwarf5_byte_order,
1500                       dwarf2_per_objfile->all_type_units.size ());
1501
1502   /* foreign_type_unit_count - The number of TUs in the foreign TU
1503      list.  */
1504   header.append_uint (4, dwarf5_byte_order, 0);
1505
1506   /* bucket_count - The number of hash buckets in the hash lookup
1507      table.  */
1508   header.append_uint (4, dwarf5_byte_order, nametable.bucket_count ());
1509
1510   /* name_count - The number of unique names in the index.  */
1511   header.append_uint (4, dwarf5_byte_order, nametable.name_count ());
1512
1513   /* abbrev_table_size - The size in bytes of the abbreviations
1514      table.  */
1515   header.append_uint (4, dwarf5_byte_order, nametable.abbrev_table_bytes ());
1516
1517   /* augmentation_string_size - The size in bytes of the augmentation
1518      string.  This value is rounded up to a multiple of 4.  */
1519   static_assert (sizeof (dwarf5_gdb_augmentation) % 4 == 0, "");
1520   header.append_uint (4, dwarf5_byte_order, sizeof (dwarf5_gdb_augmentation));
1521   header.append_data (dwarf5_gdb_augmentation);
1522
1523   gdb_assert (header.size () == bytes_of_header);
1524
1525   header.file_write (out_file);
1526   cu_list.file_write (out_file);
1527   types_cu_list.file_write (out_file);
1528   nametable.file_write (out_file, out_file_str);
1529
1530   return expected_bytes;
1531 }
1532
1533 /* Assert that FILE's size is EXPECTED_SIZE.  Assumes file's seek
1534    position is at the end of the file.  */
1535
1536 static void
1537 assert_file_size (FILE *file, const char *filename, size_t expected_size)
1538 {
1539   const auto file_size = ftell (file);
1540   if (file_size == -1)
1541     error (_("Can't get `%s' size"), filename);
1542   gdb_assert (file_size == expected_size);
1543 }
1544
1545 /* Create an index file for OBJFILE in the directory DIR.  */
1546
1547 static void
1548 write_psymtabs_to_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
1549                          const char *dir,
1550                          dw_index_kind index_kind)
1551 {
1552   struct objfile *objfile = dwarf2_per_objfile->objfile;
1553
1554   if (dwarf2_per_objfile->using_index)
1555     error (_("Cannot use an index to create the index"));
1556
1557   if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) > 1)
1558     error (_("Cannot make an index when the file has multiple .debug_types sections"));
1559
1560   if (!objfile->psymtabs || !objfile->psymtabs_addrmap)
1561     return;
1562
1563   struct stat st;
1564   if (stat (objfile_name (objfile), &st) < 0)
1565     perror_with_name (objfile_name (objfile));
1566
1567   std::string filename (std::string (dir) + SLASH_STRING
1568                         + lbasename (objfile_name (objfile))
1569                         + (index_kind == dw_index_kind::DEBUG_NAMES
1570                            ? INDEX5_SUFFIX : INDEX4_SUFFIX));
1571
1572   FILE *out_file = gdb_fopen_cloexec (filename.c_str (), "wb").release ();
1573   if (!out_file)
1574     error (_("Can't open `%s' for writing"), filename.c_str ());
1575
1576   /* Order matters here; we want FILE to be closed before FILENAME is
1577      unlinked, because on MS-Windows one cannot delete a file that is
1578      still open.  (Don't call anything here that might throw until
1579      file_closer is created.)  */
1580   gdb::unlinker unlink_file (filename.c_str ());
1581   gdb_file_up close_out_file (out_file);
1582
1583   if (index_kind == dw_index_kind::DEBUG_NAMES)
1584     {
1585       std::string filename_str (std::string (dir) + SLASH_STRING
1586                                 + lbasename (objfile_name (objfile))
1587                                 + DEBUG_STR_SUFFIX);
1588       FILE *out_file_str
1589         = gdb_fopen_cloexec (filename_str.c_str (), "wb").release ();
1590       if (!out_file_str)
1591         error (_("Can't open `%s' for writing"), filename_str.c_str ());
1592       gdb::unlinker unlink_file_str (filename_str.c_str ());
1593       gdb_file_up close_out_file_str (out_file_str);
1594
1595       const size_t total_len
1596         = write_debug_names (dwarf2_per_objfile, out_file, out_file_str);
1597       assert_file_size (out_file, filename.c_str (), total_len);
1598
1599       /* We want to keep the file .debug_str file too.  */
1600       unlink_file_str.keep ();
1601     }
1602   else
1603     {
1604       const size_t total_len
1605         = write_gdbindex (dwarf2_per_objfile, out_file);
1606       assert_file_size (out_file, filename.c_str (), total_len);
1607     }
1608
1609   /* We want to keep the file.  */
1610   unlink_file.keep ();
1611 }
1612
1613 /* Implementation of the `save gdb-index' command.
1614
1615    Note that the .gdb_index file format used by this command is
1616    documented in the GDB manual.  Any changes here must be documented
1617    there.  */
1618
1619 static void
1620 save_gdb_index_command (const char *arg, int from_tty)
1621 {
1622   struct objfile *objfile;
1623   const char dwarf5space[] = "-dwarf-5 ";
1624   dw_index_kind index_kind = dw_index_kind::GDB_INDEX;
1625
1626   if (!arg)
1627     arg = "";
1628
1629   arg = skip_spaces (arg);
1630   if (strncmp (arg, dwarf5space, strlen (dwarf5space)) == 0)
1631     {
1632       index_kind = dw_index_kind::DEBUG_NAMES;
1633       arg += strlen (dwarf5space);
1634       arg = skip_spaces (arg);
1635     }
1636
1637   if (!*arg)
1638     error (_("usage: save gdb-index [-dwarf-5] DIRECTORY"));
1639
1640   ALL_OBJFILES (objfile)
1641   {
1642     struct stat st;
1643
1644     /* If the objfile does not correspond to an actual file, skip it.  */
1645     if (stat (objfile_name (objfile), &st) < 0)
1646       continue;
1647
1648     struct dwarf2_per_objfile *dwarf2_per_objfile
1649       = get_dwarf2_per_objfile (objfile);
1650
1651     if (dwarf2_per_objfile != NULL)
1652       {
1653         TRY
1654           {
1655             write_psymtabs_to_index (dwarf2_per_objfile, arg, index_kind);
1656           }
1657         CATCH (except, RETURN_MASK_ERROR)
1658           {
1659             exception_fprintf (gdb_stderr, except,
1660                                _("Error while writing index for `%s': "),
1661                                objfile_name (objfile));
1662           }
1663         END_CATCH
1664       }
1665
1666   }
1667 }
1668
1669 void
1670 _initialize_dwarf_index_write ()
1671 {
1672   cmd_list_element *c = add_cmd ("gdb-index", class_files,
1673                                  save_gdb_index_command, _("\
1674 Save a gdb-index file.\n\
1675 Usage: save gdb-index [-dwarf-5] DIRECTORY\n\
1676 \n\
1677 No options create one file with .gdb-index extension for pre-DWARF-5\n\
1678 compatible .gdb_index section.  With -dwarf-5 creates two files with\n\
1679 extension .debug_names and .debug_str for DWARF-5 .debug_names section."),
1680                &save_cmdlist);
1681   set_cmd_completer (c, filename_completer);
1682 }