17f2ac410Schristos /* Legacy support routines for building symbol tables in GDB's internal format. 2*6881a400Schristos Copyright (C) 1986-2023 Free Software Foundation, Inc. 37f2ac410Schristos 47f2ac410Schristos This file is part of GDB. 57f2ac410Schristos 67f2ac410Schristos This program is free software; you can redistribute it and/or modify 77f2ac410Schristos it under the terms of the GNU General Public License as published by 87f2ac410Schristos the Free Software Foundation; either version 3 of the License, or 97f2ac410Schristos (at your option) any later version. 107f2ac410Schristos 117f2ac410Schristos This program is distributed in the hope that it will be useful, 127f2ac410Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 137f2ac410Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 147f2ac410Schristos GNU General Public License for more details. 157f2ac410Schristos 167f2ac410Schristos You should have received a copy of the GNU General Public License 177f2ac410Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 187f2ac410Schristos 197f2ac410Schristos #include "defs.h" 207f2ac410Schristos #include "buildsym-legacy.h" 217d62b00eSchristos #include "symtab.h" 227f2ac410Schristos 237f2ac410Schristos /* The work-in-progress of the compunit we are building. 24*6881a400Schristos This is created first, before any subfiles by start_compunit_symtab. */ 257f2ac410Schristos 267f2ac410Schristos static struct buildsym_compunit *buildsym_compunit; 277f2ac410Schristos 287f2ac410Schristos void 297f2ac410Schristos record_debugformat (const char *format) 307f2ac410Schristos { 317f2ac410Schristos buildsym_compunit->record_debugformat (format); 327f2ac410Schristos } 337f2ac410Schristos 347f2ac410Schristos void 357f2ac410Schristos record_producer (const char *producer) 367f2ac410Schristos { 377f2ac410Schristos buildsym_compunit->record_producer (producer); 387f2ac410Schristos } 397f2ac410Schristos 407f2ac410Schristos 417f2ac410Schristos 427f2ac410Schristos /* See buildsym.h. */ 437f2ac410Schristos 447f2ac410Schristos void 457f2ac410Schristos set_last_source_file (const char *name) 467f2ac410Schristos { 477f2ac410Schristos gdb_assert (buildsym_compunit != nullptr || name == nullptr); 487f2ac410Schristos if (buildsym_compunit != nullptr) 497f2ac410Schristos buildsym_compunit->set_last_source_file (name); 507f2ac410Schristos } 517f2ac410Schristos 527f2ac410Schristos /* See buildsym.h. */ 537f2ac410Schristos 547f2ac410Schristos const char * 557f2ac410Schristos get_last_source_file () 567f2ac410Schristos { 577f2ac410Schristos if (buildsym_compunit == nullptr) 587f2ac410Schristos return nullptr; 597f2ac410Schristos return buildsym_compunit->get_last_source_file (); 607f2ac410Schristos } 617f2ac410Schristos 627f2ac410Schristos /* See buildsym.h. */ 637f2ac410Schristos 647f2ac410Schristos void 657f2ac410Schristos set_last_source_start_addr (CORE_ADDR addr) 667f2ac410Schristos { 677f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 687f2ac410Schristos buildsym_compunit->set_last_source_start_addr (addr); 697f2ac410Schristos } 707f2ac410Schristos 717f2ac410Schristos /* See buildsym.h. */ 727f2ac410Schristos 737f2ac410Schristos CORE_ADDR 747f2ac410Schristos get_last_source_start_addr () 757f2ac410Schristos { 767f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 777f2ac410Schristos return buildsym_compunit->get_last_source_start_addr (); 787f2ac410Schristos } 797f2ac410Schristos 807f2ac410Schristos /* See buildsym.h. */ 817f2ac410Schristos 827f2ac410Schristos bool 837f2ac410Schristos outermost_context_p () 847f2ac410Schristos { 857f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 867f2ac410Schristos return buildsym_compunit->outermost_context_p (); 877f2ac410Schristos } 887f2ac410Schristos 897f2ac410Schristos /* See buildsym.h. */ 907f2ac410Schristos 917f2ac410Schristos int 927f2ac410Schristos get_context_stack_depth () 937f2ac410Schristos { 947f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 957f2ac410Schristos return buildsym_compunit->get_context_stack_depth (); 967f2ac410Schristos } 977f2ac410Schristos 987f2ac410Schristos /* See buildsym.h. */ 997f2ac410Schristos 1007f2ac410Schristos struct subfile * 1017f2ac410Schristos get_current_subfile () 1027f2ac410Schristos { 1037f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1047f2ac410Schristos return buildsym_compunit->get_current_subfile (); 1057f2ac410Schristos } 1067f2ac410Schristos 1077f2ac410Schristos /* See buildsym.h. */ 1087f2ac410Schristos 1097f2ac410Schristos struct pending ** 1107f2ac410Schristos get_local_symbols () 1117f2ac410Schristos { 1127f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1137f2ac410Schristos return buildsym_compunit->get_local_symbols (); 1147f2ac410Schristos } 1157f2ac410Schristos 1167f2ac410Schristos /* See buildsym.h. */ 1177f2ac410Schristos 1187f2ac410Schristos struct pending ** 1197f2ac410Schristos get_file_symbols () 1207f2ac410Schristos { 1217f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1227f2ac410Schristos return buildsym_compunit->get_file_symbols (); 1237f2ac410Schristos } 1247f2ac410Schristos 1257f2ac410Schristos /* See buildsym.h. */ 1267f2ac410Schristos 1277f2ac410Schristos struct pending ** 1287f2ac410Schristos get_global_symbols () 1297f2ac410Schristos { 1307f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1317f2ac410Schristos return buildsym_compunit->get_global_symbols (); 1327f2ac410Schristos } 1337f2ac410Schristos 1347f2ac410Schristos void 1357f2ac410Schristos start_subfile (const char *name) 1367f2ac410Schristos { 1377f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1387f2ac410Schristos buildsym_compunit->start_subfile (name); 1397f2ac410Schristos } 1407f2ac410Schristos 1417f2ac410Schristos void 1427f2ac410Schristos patch_subfile_names (struct subfile *subfile, const char *name) 1437f2ac410Schristos { 1447f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1457f2ac410Schristos buildsym_compunit->patch_subfile_names (subfile, name); 1467f2ac410Schristos } 1477f2ac410Schristos 1487f2ac410Schristos void 1497f2ac410Schristos push_subfile () 1507f2ac410Schristos { 1517f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1527f2ac410Schristos buildsym_compunit->push_subfile (); 1537f2ac410Schristos } 1547f2ac410Schristos 1557f2ac410Schristos const char * 1567f2ac410Schristos pop_subfile () 1577f2ac410Schristos { 1587f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1597f2ac410Schristos return buildsym_compunit->pop_subfile (); 1607f2ac410Schristos } 1617f2ac410Schristos 1627f2ac410Schristos /* Delete the buildsym compunit. */ 1637f2ac410Schristos 1647f2ac410Schristos static void 1657f2ac410Schristos free_buildsym_compunit (void) 1667f2ac410Schristos { 1677f2ac410Schristos if (buildsym_compunit == NULL) 1687f2ac410Schristos return; 1697f2ac410Schristos delete buildsym_compunit; 1707f2ac410Schristos buildsym_compunit = NULL; 1717f2ac410Schristos } 1727f2ac410Schristos 1737f2ac410Schristos struct compunit_symtab * 174*6881a400Schristos end_compunit_symtab (CORE_ADDR end_addr, int section) 1757f2ac410Schristos { 1767f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1777f2ac410Schristos struct compunit_symtab *result 178*6881a400Schristos = buildsym_compunit->end_compunit_symtab (end_addr, section); 1797f2ac410Schristos free_buildsym_compunit (); 1807f2ac410Schristos return result; 1817f2ac410Schristos } 1827f2ac410Schristos 1837f2ac410Schristos struct context_stack * 1847f2ac410Schristos push_context (int desc, CORE_ADDR valu) 1857f2ac410Schristos { 1867f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1877f2ac410Schristos return buildsym_compunit->push_context (desc, valu); 1887f2ac410Schristos } 1897f2ac410Schristos 1907f2ac410Schristos struct context_stack 1917f2ac410Schristos pop_context () 1927f2ac410Schristos { 1937f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 1947f2ac410Schristos return buildsym_compunit->pop_context (); 1957f2ac410Schristos } 1967f2ac410Schristos 1977f2ac410Schristos struct block * 1987f2ac410Schristos finish_block (struct symbol *symbol, struct pending_block *old_blocks, 1997f2ac410Schristos const struct dynamic_prop *static_link, 2007f2ac410Schristos CORE_ADDR start, CORE_ADDR end) 2017f2ac410Schristos { 2027f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 2037f2ac410Schristos return buildsym_compunit->finish_block (symbol, old_blocks, static_link, 2047f2ac410Schristos start, end); 2057f2ac410Schristos } 2067f2ac410Schristos 2077f2ac410Schristos void 2087f2ac410Schristos record_line (struct subfile *subfile, int line, CORE_ADDR pc) 2097f2ac410Schristos { 2107f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 2117d62b00eSchristos /* Assume every line entry is a statement start, that is a good place to 2127d62b00eSchristos put a breakpoint for that line number. */ 213*6881a400Schristos buildsym_compunit->record_line (subfile, line, pc, LEF_IS_STMT); 2147f2ac410Schristos } 2157f2ac410Schristos 216*6881a400Schristos /* Start a new compunit_symtab for a new source file in OBJFILE. Called, for 217*6881a400Schristos example, when a stabs symbol of type N_SO is seen, or when a DWARF 218*6881a400Schristos DW_TAG_compile_unit DIE is seen. It indicates the start of data for one 219*6881a400Schristos original source file. 2207f2ac410Schristos 2217f2ac410Schristos NAME is the name of the file (cannot be NULL). COMP_DIR is the 2227f2ac410Schristos directory in which the file was compiled (or NULL if not known). 2237f2ac410Schristos START_ADDR is the lowest address of objects in the file (or 0 if 2247f2ac410Schristos not known). LANGUAGE is the language of the source file, or 2257f2ac410Schristos language_unknown if not known, in which case it'll be deduced from 2267f2ac410Schristos the filename. */ 2277f2ac410Schristos 2287f2ac410Schristos struct compunit_symtab * 229*6881a400Schristos start_compunit_symtab (struct objfile *objfile, const char *name, 230*6881a400Schristos const char *comp_dir, CORE_ADDR start_addr, 231*6881a400Schristos enum language language) 2327f2ac410Schristos { 2337f2ac410Schristos /* These should have been reset either by successful completion of building 2347f2ac410Schristos a symtab, or by the scoped_free_pendings destructor. */ 2357f2ac410Schristos gdb_assert (buildsym_compunit == nullptr); 2367f2ac410Schristos 2377f2ac410Schristos buildsym_compunit = new struct buildsym_compunit (objfile, name, comp_dir, 2387f2ac410Schristos language, start_addr); 2397f2ac410Schristos 2407f2ac410Schristos return buildsym_compunit->get_compunit_symtab (); 2417f2ac410Schristos } 2427f2ac410Schristos 2437f2ac410Schristos /* At end of reading syms, or in case of quit, ensure everything 2447f2ac410Schristos associated with building symtabs is freed. 2457f2ac410Schristos 2467f2ac410Schristos N.B. This is *not* intended to be used when building psymtabs. Some debug 2477f2ac410Schristos info readers call this anyway, which is harmless if confusing. */ 2487f2ac410Schristos 2497f2ac410Schristos scoped_free_pendings::~scoped_free_pendings () 2507f2ac410Schristos { 2517f2ac410Schristos free_buildsym_compunit (); 2527f2ac410Schristos } 2537f2ac410Schristos 2547f2ac410Schristos /* See buildsym-legacy.h. */ 2557f2ac410Schristos 2567f2ac410Schristos struct buildsym_compunit * 2577f2ac410Schristos get_buildsym_compunit () 2587f2ac410Schristos { 2597f2ac410Schristos gdb_assert (buildsym_compunit != nullptr); 2607f2ac410Schristos return buildsym_compunit; 2617f2ac410Schristos } 262