1 /* DWARF CU data structure
3 Copyright (C) 2021-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "dwarf2/cu.h"
22 #include "dwarf2/read.h"
24 /* Initialize dwarf2_cu to read PER_CU, in the context of PER_OBJFILE. */
26 dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data
*per_cu
,
27 dwarf2_per_objfile
*per_objfile
)
29 per_objfile (per_objfile
),
32 checked_producer (false),
33 producer_is_gxx_lt_4_6 (false),
34 producer_is_gcc_lt_4_3 (false),
35 producer_is_icc (false),
36 producer_is_icc_lt_14 (false),
37 producer_is_codewarrior (false),
38 processing_has_namespace_info (false),
46 dwarf2_cu::addr_sized_int_type (bool unsigned_p
) const
48 int addr_size
= this->per_cu
->addr_size ();
49 return objfile_int_type (this->per_objfile
->objfile
, addr_size
, unsigned_p
);
52 /* Start a symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to the
53 buildsym_compunit constructor. */
55 struct compunit_symtab
*
56 dwarf2_cu::start_symtab (const char *name
, const char *comp_dir
,
59 gdb_assert (m_builder
== nullptr);
61 m_builder
.reset (new struct buildsym_compunit
62 (this->per_objfile
->objfile
,
63 name
, comp_dir
, per_cu
->lang
, low_pc
));
65 list_in_scope
= get_builder ()->get_file_symbols ();
67 /* DWARF versions are restricted to [2, 5], thanks to the check in
68 read_comp_unit_head. */
69 gdb_assert (this->header
.version
>= 2 && this->header
.version
<= 5);
70 static const char *debugformat_strings
[] = {
76 const char *debugformat
= debugformat_strings
[this->header
.version
- 2];
78 get_builder ()->record_debugformat (debugformat
);
79 get_builder ()->record_producer (producer
);
81 processing_has_namespace_info
= false;
83 return get_builder ()->get_compunit_symtab ();
89 dwarf2_cu::addr_type () const
91 struct objfile
*objfile
= this->per_objfile
->objfile
;
92 struct type
*void_type
= objfile_type (objfile
)->builtin_void
;
93 struct type
*addr_type
= lookup_pointer_type (void_type
);
94 int addr_size
= this->per_cu
->addr_size ();
96 if (TYPE_LENGTH (addr_type
) == addr_size
)
99 addr_type
= addr_sized_int_type (addr_type
->is_unsigned ());
103 /* A hashtab traversal function that marks the dependent CUs. */
106 dwarf2_mark_helper (void **slot
, void *data
)
108 dwarf2_per_cu_data
*per_cu
= (dwarf2_per_cu_data
*) *slot
;
109 dwarf2_per_objfile
*per_objfile
= (dwarf2_per_objfile
*) data
;
110 dwarf2_cu
*cu
= per_objfile
->get_cu (per_cu
);
112 /* cu->m_dependencies references may not yet have been ever read if
113 QUIT aborts reading of the chain. As such dependencies remain
114 valid it is not much useful to track and undo them during QUIT
121 /* See dwarf2/cu.h. */
129 if (m_dependencies
!= nullptr)
130 htab_traverse (m_dependencies
, dwarf2_mark_helper
, per_objfile
);
134 /* See dwarf2/cu.h. */
137 dwarf2_cu::add_dependence (struct dwarf2_per_cu_data
*ref_per_cu
)
141 if (m_dependencies
== nullptr)
143 = htab_create_alloc_ex (5, htab_hash_pointer
, htab_eq_pointer
,
144 NULL
, &comp_unit_obstack
,
145 hashtab_obstack_allocate
,
146 dummy_obstack_deallocate
);
148 slot
= htab_find_slot (m_dependencies
, ref_per_cu
, INSERT
);
149 if (*slot
== nullptr)
153 /* See dwarf2/cu.h. */
156 dwarf2_cu::get_builder ()
158 /* If this CU has a builder associated with it, use that. */
159 if (m_builder
!= nullptr)
160 return m_builder
.get ();
162 if (per_objfile
->sym_cu
!= nullptr)
163 return per_objfile
->sym_cu
->m_builder
.get ();
165 gdb_assert_not_reached ("");