1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
|
/* Legacy support routines for building symbol tables in GDB's internal format.
Copyright (C) 1986-2021 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "buildsym-legacy.h"
#include "symtab.h"
/* The work-in-progress of the compunit we are building.
This is created first, before any subfiles by start_symtab. */
static struct buildsym_compunit *buildsym_compunit;
void
record_debugformat (const char *format)
{
buildsym_compunit->record_debugformat (format);
}
void
record_producer (const char *producer)
{
buildsym_compunit->record_producer (producer);
}
/* See buildsym.h. */
void
set_last_source_file (const char *name)
{
gdb_assert (buildsym_compunit != nullptr || name == nullptr);
if (buildsym_compunit != nullptr)
buildsym_compunit->set_last_source_file (name);
}
/* See buildsym.h. */
const char *
get_last_source_file ()
{
if (buildsym_compunit == nullptr)
return nullptr;
return buildsym_compunit->get_last_source_file ();
}
/* See buildsym.h. */
void
set_last_source_start_addr (CORE_ADDR addr)
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->set_last_source_start_addr (addr);
}
/* See buildsym.h. */
CORE_ADDR
get_last_source_start_addr ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_last_source_start_addr ();
}
/* See buildsym.h. */
struct using_direct **
get_local_using_directives ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_local_using_directives ();
}
/* See buildsym.h. */
void
set_local_using_directives (struct using_direct *new_local)
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->set_local_using_directives (new_local);
}
/* See buildsym.h. */
struct using_direct **
get_global_using_directives ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_global_using_directives ();
}
/* See buildsym.h. */
bool
outermost_context_p ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->outermost_context_p ();
}
/* See buildsym.h. */
struct context_stack *
get_current_context_stack ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_current_context_stack ();
}
/* See buildsym.h. */
int
get_context_stack_depth ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_context_stack_depth ();
}
/* See buildsym.h. */
struct subfile *
get_current_subfile ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_current_subfile ();
}
/* See buildsym.h. */
struct pending **
get_local_symbols ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_local_symbols ();
}
/* See buildsym.h. */
struct pending **
get_file_symbols ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_file_symbols ();
}
/* See buildsym.h. */
struct pending **
get_global_symbols ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->get_global_symbols ();
}
void
start_subfile (const char *name)
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->start_subfile (name);
}
void
patch_subfile_names (struct subfile *subfile, const char *name)
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->patch_subfile_names (subfile, name);
}
void
push_subfile ()
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->push_subfile ();
}
const char *
pop_subfile ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->pop_subfile ();
}
/* Delete the buildsym compunit. */
static void
free_buildsym_compunit (void)
{
if (buildsym_compunit == NULL)
return;
delete buildsym_compunit;
buildsym_compunit = NULL;
}
struct compunit_symtab *
end_symtab (CORE_ADDR end_addr, int section)
{
gdb_assert (buildsym_compunit != nullptr);
struct compunit_symtab *result
= buildsym_compunit->end_symtab (end_addr, section);
free_buildsym_compunit ();
return result;
}
struct context_stack *
push_context (int desc, CORE_ADDR valu)
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->push_context (desc, valu);
}
struct context_stack
pop_context ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->pop_context ();
}
struct block *
finish_block (struct symbol *symbol, struct pending_block *old_blocks,
const struct dynamic_prop *static_link,
CORE_ADDR start, CORE_ADDR end)
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit->finish_block (symbol, old_blocks, static_link,
start, end);
}
void
record_block_range (struct block *block, CORE_ADDR start,
CORE_ADDR end_inclusive)
{
gdb_assert (buildsym_compunit != nullptr);
buildsym_compunit->record_block_range (block, start, end_inclusive);
}
void
record_line (struct subfile *subfile, int line, CORE_ADDR pc)
{
gdb_assert (buildsym_compunit != nullptr);
/* Assume every line entry is a statement start, that is a good place to
put a breakpoint for that line number. */
buildsym_compunit->record_line (subfile, line, pc, true);
}
/* Start a new symtab for a new source file in OBJFILE. Called, for example,
when a stabs symbol of type N_SO is seen, or when a DWARF
TAG_compile_unit DIE is seen. It indicates the start of data for
one original source file.
NAME is the name of the file (cannot be NULL). COMP_DIR is the
directory in which the file was compiled (or NULL if not known).
START_ADDR is the lowest address of objects in the file (or 0 if
not known). LANGUAGE is the language of the source file, or
language_unknown if not known, in which case it'll be deduced from
the filename. */
struct compunit_symtab *
start_symtab (struct objfile *objfile, const char *name, const char *comp_dir,
CORE_ADDR start_addr, enum language language)
{
/* These should have been reset either by successful completion of building
a symtab, or by the scoped_free_pendings destructor. */
gdb_assert (buildsym_compunit == nullptr);
buildsym_compunit = new struct buildsym_compunit (objfile, name, comp_dir,
language, start_addr);
return buildsym_compunit->get_compunit_symtab ();
}
/* Restart compilation for a symtab.
CUST is the result of end_expandable_symtab.
NAME, START_ADDR are the source file we are resuming with.
This is used when a symtab is built from multiple sources.
The symtab is first built with start_symtab/end_expandable_symtab
and then for each additional piece call restart_symtab/augment_*_symtab.
Note: At the moment there is only augment_type_symtab. */
void
restart_symtab (struct compunit_symtab *cust,
const char *name, CORE_ADDR start_addr)
{
/* These should have been reset either by successful completion of building
a symtab, or by the scoped_free_pendings destructor. */
gdb_assert (buildsym_compunit == nullptr);
buildsym_compunit
= new struct buildsym_compunit (COMPUNIT_OBJFILE (cust),
name,
COMPUNIT_DIRNAME (cust),
compunit_language (cust),
start_addr,
cust);
}
/* See buildsym.h. */
struct compunit_symtab *
buildsym_compunit_symtab (void)
{
gdb_assert (buildsym_compunit != NULL);
return buildsym_compunit->get_compunit_symtab ();
}
/* See buildsym.h. */
struct macro_table *
get_macro_table (void)
{
gdb_assert (buildsym_compunit != NULL);
return buildsym_compunit->get_macro_table ();
}
/* At end of reading syms, or in case of quit, ensure everything
associated with building symtabs is freed.
N.B. This is *not* intended to be used when building psymtabs. Some debug
info readers call this anyway, which is harmless if confusing. */
scoped_free_pendings::~scoped_free_pendings ()
{
free_buildsym_compunit ();
}
/* See buildsym-legacy.h. */
struct buildsym_compunit *
get_buildsym_compunit ()
{
gdb_assert (buildsym_compunit != nullptr);
return buildsym_compunit;
}
|