PR32387 ppc64 TLS optimization bug with -fno-plt code
[binutils-gdb.git] / gdb / dwarf2 / cu.c
blob1029b2426bbaf2a43a12468802c834b38b2c1e37
1 /* DWARF CU data structure
3 Copyright (C) 2021-2024 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/>. */
20 #include "dwarf2/cu.h"
21 #include "dwarf2/read.h"
22 #include "objfiles.h"
23 #include "filenames.h"
24 #include "gdbsupport/pathstuff.h"
26 /* Initialize dwarf2_cu to read PER_CU, in the context of PER_OBJFILE. */
28 dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu,
29 dwarf2_per_objfile *per_objfile)
30 : per_cu (per_cu),
31 per_objfile (per_objfile),
32 m_mark (false),
33 has_loclist (false),
34 checked_producer (false),
35 producer_is_gxx_lt_4_6 (false),
36 producer_is_gcc_lt_4_3 (false),
37 producer_is_gcc_11 (false),
38 producer_is_icc (false),
39 producer_is_icc_lt_14 (false),
40 producer_is_codewarrior (false),
41 producer_is_clang (false),
42 producer_is_gas_lt_2_38 (false),
43 producer_is_gas_2_39 (false),
44 producer_is_gas_ge_2_40 (false),
45 processing_has_namespace_info (false)
49 /* See cu.h. */
51 struct type *
52 dwarf2_cu::addr_sized_int_type (bool unsigned_p) const
54 int addr_size = this->per_cu->addr_size ();
55 return objfile_int_type (this->per_objfile->objfile, addr_size, unsigned_p);
58 /* Start a symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to the
59 buildsym_compunit constructor. */
61 struct compunit_symtab *
62 dwarf2_cu::start_compunit_symtab (const char *name, const char *comp_dir,
63 CORE_ADDR low_pc)
65 gdb_assert (m_builder == nullptr);
67 std::string name_for_id_holder;
68 const char *name_for_id = name;
70 /* Prepend the compilation directory to the filename if needed (if not
71 absolute already) to get the "name for id" for our main symtab. The name
72 for the main file coming from the line table header will be generated using
73 the same logic, so will hopefully match what we pass here. */
74 if (!IS_ABSOLUTE_PATH (name) && comp_dir != nullptr)
76 name_for_id_holder = path_join (comp_dir, name);
77 name_for_id = name_for_id_holder.c_str ();
80 m_builder = std::make_unique<buildsym_compunit> (this->per_objfile->objfile,
81 name,
82 comp_dir,
83 name_for_id,
84 lang (),
85 low_pc);
87 list_in_scope = get_builder ()->get_file_symbols ();
89 /* DWARF versions are restricted to [2, 5], thanks to the check in
90 read_comp_unit_head. */
91 gdb_assert (this->header.version >= 2 && this->header.version <= 5);
92 static const char *debugformat_strings[] = {
93 "DWARF 2",
94 "DWARF 3",
95 "DWARF 4",
96 "DWARF 5",
98 const char *debugformat = debugformat_strings[this->header.version - 2];
100 get_builder ()->record_debugformat (debugformat);
101 get_builder ()->record_producer (producer);
103 processing_has_namespace_info = false;
105 return get_builder ()->get_compunit_symtab ();
108 /* See read.h. */
110 struct type *
111 dwarf2_cu::addr_type () const
113 struct objfile *objfile = this->per_objfile->objfile;
114 struct type *void_type = builtin_type (objfile)->builtin_void;
115 struct type *addr_type = lookup_pointer_type (void_type);
116 int addr_size = this->per_cu->addr_size ();
118 if (addr_type->length () == addr_size)
119 return addr_type;
121 addr_type = addr_sized_int_type (addr_type->is_unsigned ());
122 return addr_type;
125 /* See dwarf2/cu.h. */
127 void
128 dwarf2_cu::mark ()
130 if (m_mark)
131 return;
133 m_mark = true;
135 for (dwarf2_per_cu_data *per_cu : m_dependencies)
137 /* cu->m_dependencies references may not yet have been ever
138 read if QUIT aborts reading of the chain. As such
139 dependencies remain valid it is not much useful to track
140 and undo them during QUIT cleanups. */
141 dwarf2_cu *cu = per_objfile->get_cu (per_cu);
143 if (cu == nullptr)
144 continue;
146 cu->mark ();
150 /* See dwarf2/cu.h. */
152 buildsym_compunit *
153 dwarf2_cu::get_builder ()
155 /* If this CU has a builder associated with it, use that. */
156 if (m_builder != nullptr)
157 return m_builder.get ();
159 if (per_objfile->sym_cu != nullptr)
160 return per_objfile->sym_cu->m_builder.get ();
162 gdb_assert_not_reached ("");