Add `set print array-indexes' tests for C/C++ arrays
[binutils-gdb.git] / gdb / dwarf2 / cu.c
1 /* DWARF CU data structure
2
3 Copyright (C) 2021-2022 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 #include "dwarf2/cu.h"
22 #include "dwarf2/read.h"
23
24 /* Initialize dwarf2_cu to read PER_CU, in the context of PER_OBJFILE. */
25
26 dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu,
27 dwarf2_per_objfile *per_objfile)
28 : per_cu (per_cu),
29 per_objfile (per_objfile),
30 m_mark (false),
31 has_loclist (false),
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),
39 load_all_dies (false)
40 {
41 }
42
43 /* See cu.h. */
44
45 struct type *
46 dwarf2_cu::addr_sized_int_type (bool unsigned_p) const
47 {
48 int addr_size = this->per_cu->addr_size ();
49 return objfile_int_type (this->per_objfile->objfile, addr_size, unsigned_p);
50 }
51
52 /* Start a symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to the
53 buildsym_compunit constructor. */
54
55 struct compunit_symtab *
56 dwarf2_cu::start_symtab (const char *name, const char *comp_dir,
57 CORE_ADDR low_pc)
58 {
59 gdb_assert (m_builder == nullptr);
60
61 m_builder.reset (new struct buildsym_compunit
62 (this->per_objfile->objfile,
63 name, comp_dir, per_cu->lang, low_pc));
64
65 list_in_scope = get_builder ()->get_file_symbols ();
66
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[] = {
71 "DWARF 2",
72 "DWARF 3",
73 "DWARF 4",
74 "DWARF 5",
75 };
76 const char *debugformat = debugformat_strings[this->header.version - 2];
77
78 get_builder ()->record_debugformat (debugformat);
79 get_builder ()->record_producer (producer);
80
81 processing_has_namespace_info = false;
82
83 return get_builder ()->get_compunit_symtab ();
84 }
85
86 /* See read.h. */
87
88 struct type *
89 dwarf2_cu::addr_type () const
90 {
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 ();
95
96 if (TYPE_LENGTH (addr_type) == addr_size)
97 return addr_type;
98
99 addr_type = addr_sized_int_type (addr_type->is_unsigned ());
100 return addr_type;
101 }
102
103 /* A hashtab traversal function that marks the dependent CUs. */
104
105 static int
106 dwarf2_mark_helper (void **slot, void *data)
107 {
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);
111
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
115 cleanups. */
116 if (cu != nullptr)
117 cu->mark ();
118 return 1;
119 }
120
121 /* See dwarf2/cu.h. */
122
123 void
124 dwarf2_cu::mark ()
125 {
126 if (!m_mark)
127 {
128 m_mark = true;
129 if (m_dependencies != nullptr)
130 htab_traverse (m_dependencies, dwarf2_mark_helper, per_objfile);
131 }
132 }
133
134 /* See dwarf2/cu.h. */
135
136 void
137 dwarf2_cu::add_dependence (struct dwarf2_per_cu_data *ref_per_cu)
138 {
139 void **slot;
140
141 if (m_dependencies == nullptr)
142 m_dependencies
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);
147
148 slot = htab_find_slot (m_dependencies, ref_per_cu, INSERT);
149 if (*slot == nullptr)
150 *slot = ref_per_cu;
151 }
152
153 /* See dwarf2/cu.h. */
154
155 buildsym_compunit *
156 dwarf2_cu::get_builder ()
157 {
158 /* If this CU has a builder associated with it, use that. */
159 if (m_builder != nullptr)
160 return m_builder.get ();
161
162 if (per_objfile->sym_cu != nullptr)
163 return per_objfile->sym_cu->m_builder.get ();
164
165 gdb_assert_not_reached ("");
166 }