Make dwarf2_per_objfile::all_type_units an std::vector
[deliverable/binutils-gdb.git] / gdb / dwarf-index-write.c
CommitLineData
cd4fb1b2
SM
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>
608219fb 37#include <cmath>
cd4fb1b2
SM
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
74static void
75file_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
83template<typename Elem, typename Alloc>
84static void
85file_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. */
91class data_buf
92{
93public:
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
151private:
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. */
164struct 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. */
176struct 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
193static symtab_index_entry &
194find_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
212static void
213hash_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
232static void
233add_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
267static void
268uniquify_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. */
285class c_str_view
286{
287public:
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
304private:
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. */
311class c_str_view_hasher
312{
313public:
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<>. */
321template<typename T>
322class vector_hasher
323{
324public:
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
335static void
336write_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
401typedef std::unordered_map<partial_symtab *, unsigned int> psym_index_map;
402
403/* Helper struct for building the address table. */
404struct 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
426static void
427add_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
441static int
442add_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
470static void
471write_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
499static gdb_index_symbol_kind
500symbol_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
537static void
538write_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. */
564struct 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
581static int
582write_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
614static void
615recursively_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
630static void
631recursively_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. */
657class debug_names
658{
659public:
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
907private:
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
1251static bool
1252check_dwarf64_offsets (struct dwarf2_per_objfile *dwarf2_per_objfile)
1253{
b76e467d 1254 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
cd4fb1b2 1255 {
b76e467d 1256 if (to_underlying (per_cu->sect_off) >= (static_cast<uint64_t> (1) << 32))
cd4fb1b2
SM
1257 return true;
1258 }
b2bdb8cf 1259 for (const signatured_type *sigtype : dwarf2_per_objfile->all_type_units)
cd4fb1b2 1260 {
b2bdb8cf 1261 const dwarf2_per_cu_data &per_cu = sigtype->per_cu;
cd4fb1b2
SM
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
1275static size_t
1276psyms_seen_size (struct dwarf2_per_objfile *dwarf2_per_objfile)
1277{
1278 size_t psyms_count = 0;
b76e467d 1279 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
cd4fb1b2 1280 {
cd4fb1b2
SM
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
1294static size_t
1295write_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;
b76e467d 1306 cu_index_htab.reserve (dwarf2_per_objfile->all_comp_units.size ());
cd4fb1b2
SM
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));
b76e467d 1314 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
cd4fb1b2
SM
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;
b76e467d 1351 sig_data.cu_index = dwarf2_per_objfile->all_comp_units.size ();
cd4fb1b2
SM
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. */
1403static 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
1409static size_t
1410write_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));
b76e467d 1426 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
cd4fb1b2
SM
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. */
b76e467d
SM
1494 header.append_uint (4, dwarf5_byte_order,
1495 dwarf2_per_objfile->all_comp_units.size ());
cd4fb1b2
SM
1496
1497 /* local_type_unit_count - The number of TUs in the local TU
1498 list. */
b2bdb8cf
SM
1499 header.append_uint (4, dwarf5_byte_order,
1500 dwarf2_per_objfile->all_type_units.size ());
cd4fb1b2
SM
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
1536static void
1537assert_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
1547static void
1548write_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
1619static void
1620save_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
1669void
1670_initialize_dwarf_index_write ()
1671{
1672 cmd_list_element *c = add_cmd ("gdb-index", class_files,
1673 save_gdb_index_command, _("\
1674Save a gdb-index file.\n\
1675Usage: save gdb-index [-dwarf-5] DIRECTORY\n\
1676\n\
1677No options create one file with .gdb-index extension for pre-DWARF-5\n\
1678compatible .gdb_index section. With -dwarf-5 creates two files with\n\
1679extension .debug_names and .debug_str for DWARF-5 .debug_names section."),
1680 &save_cmdlist);
1681 set_cmd_completer (c, filename_completer);
1682}
This page took 0.093749 seconds and 4 git commands to generate.