From: Simon Marchi Date: Thu, 18 Jun 2026 18:39:26 +0000 (-0400) Subject: gdb: make symtab::compunit return a reference X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4e2d7236c720cfcc36fec102ba466b95634ed8d;p=thirdparty%2Fbinutils-gdb.git gdb: make symtab::compunit return a reference The compunit symtab backlink of a symtab is never null (the constructor asserts it), so make symtab::compunit return a reference instead of a pointer, and have the symtab constructor take the compunit_symtab as a reference too. Update all callers accordingly. This came up earlier in review, where a caller would check the result of `symtab->compunit ()` for nullptr, and I pointed out that it was unnecessary. Returning a reference makes this clear. Change-Id: Idf3a6b5fb07a10cd161826ae8a7b826d95bd96c6 Reviewed-By: Tom de Vries --- diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index 5c5d4675eb6..f36426a2084 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -1498,7 +1498,7 @@ block_lookup (const struct block *context, const char *raw_name) symtab = NULL; if (symtab != NULL) - result = symtab->compunit ()->blockvector ()->static_block (); + result = symtab->compunit ().blockvector ()->static_block (); else if (syms.empty () || syms[0].symbol->loc_class () != LOC_BLOCK) { if (context == NULL) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 564e4d6194a..19d8e4ee13b 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -4806,7 +4806,7 @@ cache_symbol (const char *name, domain_search_flags domain, against the global and static blocks of its associated symtab. */ if (sym != nullptr) { - const blockvector &bv = *sym->symtab ()->compunit ()->blockvector (); + const blockvector &bv = *sym->symtab ()->compunit ().blockvector (); if (bv.global_block () != block && bv.static_block () != block) return; @@ -11869,8 +11869,8 @@ is_known_support_routine (const frame_info_ptr &frame) re_comp (known_runtime_file_name_patterns[i]); if (re_exec (lbasename (sal.symtab->filename ()))) return true; - if (sal.symtab->compunit ()->objfile () != NULL - && re_exec (objfile_name (sal.symtab->compunit ()->objfile ()))) + if (sal.symtab->compunit ().objfile () != NULL + && re_exec (objfile_name (sal.symtab->compunit ().objfile ()))) return true; } diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 99448a98f61..a982e610642 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2782,7 +2782,7 @@ amd64_skip_xmm_prologue (CORE_ADDR pc, CORE_ADDR start_pc) start_pc_sal = find_sal_for_pc_sect (start_pc, NULL, 0); if (start_pc_sal.symtab == NULL || producer_is_gcc_ge_4 (start_pc_sal.symtab->compunit () - ->producer ()) < 6 + .producer ()) < 6 || start_pc_sal.pc != start_pc || pc >= start_pc_sal.end) return pc; diff --git a/gdb/annotate.c b/gdb/annotate.c index 1f3a6d114b1..e6c2f896942 100644 --- a/gdb/annotate.c +++ b/gdb/annotate.c @@ -452,12 +452,12 @@ annotate_source_line (struct symtab *s, int line, int mid_statement, return false; annotate_source (s->fullname (), line, (int) (*offsets)[line - 1], - mid_statement, s->compunit ()->objfile ()->arch (), + mid_statement, s->compunit ().objfile ()->arch (), pc); /* Update the current symtab and line. */ symtab_and_line sal; - sal.pspace = s->compunit ()->objfile ()->pspace (); + sal.pspace = s->compunit ().objfile ()->pspace (); sal.symtab = s; sal.line = line; set_current_source_symtab_and_line (sal); diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 72cfd3af490..e4df4df04a7 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -7767,7 +7767,7 @@ get_sal_arch (struct symtab_and_line sal) if (sal.section != nullptr) return sal.section->objfile->arch (); if (sal.symtab != nullptr) - return sal.symtab->compunit ()->objfile ()->arch (); + return sal.symtab->compunit ().objfile ()->arch (); return nullptr; } @@ -9502,13 +9502,13 @@ resolve_sal_pc (struct symtab_and_line *sal) struct symbol *sym; bv = blockvector_for_pc_sect (sal->pc, 0, &b, - sal->symtab->compunit ()); + &sal->symtab->compunit ()); if (bv != NULL) { sym = b->linkage_function (); if (sym != NULL) sal->section - = sym->obj_section (sal->symtab->compunit ()->objfile ()); + = sym->obj_section (sal->symtab->compunit ().objfile ()); else { /* It really is worthwhile to have the section, so we'll @@ -14740,7 +14740,7 @@ breakpoint_free_objfile (struct objfile *objfile) for (bp_location *loc : all_bp_locations ()) { if (loc->symtab != nullptr - && loc->symtab->compunit ()->objfile () == objfile) + && loc->symtab->compunit ().objfile () == objfile) { loc->symtab = nullptr; loc->symbol = nullptr; diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 2829d8bccba..e6a82e2aa3c 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -3178,7 +3178,7 @@ classify_name (struct parser_state *par_state, const struct block *block, symtab != nullptr) { yylval.bval - = symtab->compunit ()->blockvector ()->static_block (); + = symtab->compunit ().blockvector ()->static_block (); return FILENAME; } diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 3abb2f136ec..f5c85dfc352 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1044,7 +1044,7 @@ edit_command (const char *arg, int from_tty) error (_("No source file for address %s."), paddress (get_current_arch (), sal.pc)); - gdbarch = sal.symtab->compunit ()->objfile ()->arch (); + gdbarch = sal.symtab->compunit ().objfile ()->arch (); sym = find_symbol_for_pc (sal.pc); if (sym) gdb_printf ("%ps is in %ps (%ps:%ps).\n", @@ -1506,7 +1506,7 @@ list_command (const char *arg, int from_tty) error (_("No source file for address %s."), paddress (get_current_arch (), sal.pc)); - struct gdbarch *gdbarch = sal.symtab->compunit ()->objfile ()->arch (); + struct gdbarch *gdbarch = sal.symtab->compunit ().objfile ()->arch (); struct symbol *sym = find_symbol_for_pc (sal.pc); if (sym != nullptr) gdb_printf ("%ps is in %s (%ps:%ps).\n", @@ -2329,8 +2329,8 @@ ambiguous_line_spec (gdb::array_view sals, static int cmp_symtabs (const symtab_and_line &sala, const symtab_and_line &salb) { - const char *dira = sala.symtab->compunit ()->dirname (); - const char *dirb = salb.symtab->compunit ()->dirname (); + const char *dira = sala.symtab->compunit ().dirname (); + const char *dirb = salb.symtab->compunit ().dirname (); int r; if (dira == NULL) diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c index 20e4c3e51ce..a70282c4e0c 100644 --- a/gdb/compile/compile-object-load.c +++ b/gdb/compile/compile-object-load.c @@ -426,7 +426,7 @@ get_out_value_type (struct symbol *func_sym, struct objfile *objfile, lookup_name_info i_ptr_matcher (COMPILE_I_EXPR_PTR_TYPE, symbol_name_match_type::SEARCH_NAME); - bv = func_sym->symtab ()->compunit ()->blockvector (); + bv = func_sym->symtab ()->compunit ().blockvector (); nblocks = bv->num_blocks (); gdb_ptr_type_sym = NULL; diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c index b52859b4bc8..4a027de2625 100644 --- a/gdb/compile/compile.c +++ b/gdb/compile/compile.c @@ -364,7 +364,7 @@ get_expr_block_and_pc (CORE_ADDR *pc) = get_current_source_symtab_and_line (current_program_space); if (cursal.symtab) - block = cursal.symtab->compunit ()->blockvector ()->static_block (); + block = cursal.symtab->compunit ().blockvector ()->static_block (); if (block != NULL) *pc = block->entry_pc (); diff --git a/gdb/disasm.c b/gdb/disasm.c index 81c466c188a..a61bd203b6f 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -553,7 +553,7 @@ do_mixed_source_and_assembly_deprecated mle = (struct deprecated_dis_line_entry *) alloca (nlines * sizeof (struct deprecated_dis_line_entry)); - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); unrelocated_addr unrel_low = unrelocated_addr (low - objfile->text_section_offset ()); @@ -701,7 +701,7 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch, gdb::unordered_set dis_line_table; - struct objfile *objfile = main_symtab->compunit ()->objfile (); + struct objfile *objfile = main_symtab->compunit ().objfile (); unrelocated_addr unrel_low = unrelocated_addr (low - objfile->text_section_offset ()); diff --git a/gdb/guile/scm-symtab.c b/gdb/guile/scm-symtab.c index b3efcaca22e..639b134d8e7 100644 --- a/gdb/guile/scm-symtab.c +++ b/gdb/guile/scm-symtab.c @@ -136,7 +136,7 @@ stscm_eq_symtab_smob (const void *ap, const void *bp) static htab_t stscm_objfile_symtab_map (struct symtab *symtab) { - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); htab_t htab = stscm_objfile_data_key.get (objfile); if (htab == NULL) @@ -346,7 +346,7 @@ gdbscm_symtab_objfile (SCM self) = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); const struct symtab *symtab = st_smob->symtab; - return ofscm_scm_from_objfile (symtab->compunit ()->objfile ()); + return ofscm_scm_from_objfile (symtab->compunit ().objfile ()); } /* (symtab-global-block ) -> @@ -360,10 +360,10 @@ gdbscm_symtab_global_block (SCM self) const struct symtab *symtab = st_smob->symtab; const struct blockvector *blockvector; - blockvector = symtab->compunit ()->blockvector (); + blockvector = symtab->compunit ().blockvector (); const struct block *block = blockvector->global_block (); - return bkscm_scm_from_block (block, symtab->compunit ()->objfile ()); + return bkscm_scm_from_block (block, symtab->compunit ().objfile ()); } /* (symtab-static-block ) -> @@ -377,10 +377,10 @@ gdbscm_symtab_static_block (SCM self) const struct symtab *symtab = st_smob->symtab; const struct blockvector *blockvector; - blockvector = symtab->compunit ()->blockvector (); + blockvector = symtab->compunit ().blockvector (); const struct block *block = blockvector->static_block (); - return bkscm_scm_from_block (block, symtab->compunit ()->objfile ()); + return bkscm_scm_from_block (block, symtab->compunit ().objfile ()); } /* Administrivia for sal (symtab-and-line) smobs. */ diff --git a/gdb/linespec.c b/gdb/linespec.c index 5371d8426ae..fd7918df5a1 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1149,7 +1149,7 @@ iterate_over_all_matching_symtabs { const struct block *block; int i; - const blockvector *bv = symtab->compunit ()->blockvector (); + const blockvector *bv = symtab->compunit ().blockvector (); for (i = FIRST_LOCAL_BLOCK; i < bv->num_blocks (); i++) { @@ -1197,7 +1197,7 @@ iterate_over_file_blocks { const struct block *block; - for (block = symtab->compunit ()->blockvector ()->static_block (); + for (block = symtab->compunit ().blockvector ()->static_block (); block != NULL; block = block->superblock ()) current_language->for_each_symbol (block, name, domain, callback); @@ -2198,7 +2198,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec *ls) for (const auto &sym : ls->labels.label_symbols) { struct program_space *pspace - = sym.symbol->symtab ()->compunit ()->objfile ()->pspace (); + = sym.symbol->symtab ()->compunit ().objfile ()->pspace (); std::optional sal = symbol_to_sal (state->funfirstline, sym.symbol); @@ -2221,7 +2221,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec *ls) for (const auto &sym : ls->function_symbols) { program_space *pspace - = sym.symbol->symtab ()->compunit ()->objfile ()->pspace (); + = sym.symbol->symtab ()->compunit ().objfile ()->pspace (); set_current_program_space (pspace); /* Don't skip to the first line of the function if we @@ -3403,7 +3403,7 @@ lookup_prefix_sym (struct linespec_state *state, { /* Program spaces that are executing startup should have been filtered out earlier. */ - program_space *pspace = elt->compunit ()->objfile ()->pspace (); + program_space *pspace = elt->compunit ().objfile ()->pspace (); gdb_assert (!pspace->executing_startup); set_current_program_space (pspace); @@ -3452,8 +3452,8 @@ compare_symbols (const block_symbol &a, const block_symbol &b) which gives unstable sorting results. While the assumption is that this doesn't matter, play it safe and compare program space IDs instead. */ int cmp - = compare_pspace (a.symbol->symtab ()->compunit ()->objfile ()->pspace (), - b.symbol->symtab ()->compunit ()->objfile ()->pspace ()); + = compare_pspace (a.symbol->symtab ()->compunit ().objfile ()->pspace (), + b.symbol->symtab ()->compunit ().objfile ()->pspace ()); if (cmp == -1) return true; if (cmp == 1) @@ -3560,7 +3560,7 @@ find_method (struct linespec_state *self, /* Program spaces that are executing startup should have been filtered out earlier. */ - pspace = sym->symtab ()->compunit ()->objfile ()->pspace (); + pspace = sym->symtab ()->compunit ().objfile ()->pspace (); gdb_assert (!pspace->executing_startup); set_current_program_space (pspace); t = check_typedef (sym->type ()); @@ -3572,7 +3572,7 @@ find_method (struct linespec_state *self, if (ix == sym_classes->size () - 1 || (pspace != (sym_classes->at (ix + 1).symbol->symtab () - ->compunit ()->objfile ()->pspace ()))) + ->compunit ().objfile ()->pspace ()))) { /* If we did not find a direct implementation anywhere in this program space, consider superclasses. */ @@ -3891,7 +3891,7 @@ find_label_symbols (struct linespec_state *self, { fn_sym = elt.symbol; set_current_program_space - (fn_sym->symtab ()->compunit ()->objfile ()->pspace ()); + (fn_sym->symtab ()->compunit ().objfile ()->pspace ()); block = fn_sym->value_block (); find_label_symbols_in_block (block, name, fn_sym, completion_mode, @@ -3918,7 +3918,7 @@ decode_digits_list_mode (linespec_state *self, linespec *ls, int line) /* The logic above should ensure this. */ gdb_assert (elt != NULL); - program_space *pspace = elt->compunit ()->objfile ()->pspace (); + program_space *pspace = elt->compunit ().objfile ()->pspace (); set_current_program_space (pspace); /* Simplistic search just for the list command. */ @@ -3955,7 +3955,7 @@ decode_digits_ordinary (struct linespec_state *self, /* The logic above should ensure this. */ gdb_assert (elt != NULL); - objfile *objfile = elt->compunit ()->objfile (); + objfile *objfile = elt->compunit ().objfile (); program_space *pspace = objfile->pspace (); set_current_program_space (pspace); @@ -4166,7 +4166,7 @@ search_minsyms_for_name (struct collect_info *info, } else { - objfile &objfile = *symtab->compunit ()->objfile (); + objfile &objfile = *symtab->compunit ().objfile (); program_space *pspace = objfile.pspace (); if (search_pspace == NULL || pspace == search_pspace) @@ -4264,13 +4264,14 @@ add_matching_symbols_to_info (const char *name, add_symbol); search_minsyms_for_name (info, lookup_name, pspace, NULL); } - else if (pspace == NULL || pspace == elt->compunit ()->objfile ()->pspace ()) + else if (pspace == NULL + || pspace == elt->compunit ().objfile ()->pspace ()) { int prev_len = info->symbols->size (); /* Program spaces that are executing startup should have been filtered out earlier. */ - program_space *elt_pspace = elt->compunit ()->objfile ()->pspace (); + program_space *elt_pspace = elt->compunit ().objfile ()->pspace (); gdb_assert (!elt_pspace->executing_startup); set_current_program_space (elt_pspace); iterate_over_file_blocks (elt, lookup_name, SEARCH_VFT, add_symbol); @@ -4305,7 +4306,7 @@ symbol_to_sal (bool funfirstline, symbol *sym) result.symbol = sym; result.line = sym->line (); result.pc = sym->value_address (); - result.pspace = result.symtab->compunit ()->objfile ()->pspace (); + result.pspace = result.symtab->compunit ().objfile ()->pspace (); result.explicit_pc = 1; return result; } @@ -4321,7 +4322,7 @@ symbol_to_sal (bool funfirstline, symbol *sym) result.symbol = sym; result.line = sym->line (); result.pc = sym->value_address (); - result.pspace = result.symtab->compunit ()->objfile ()->pspace (); + result.pspace = result.symtab->compunit ().objfile ()->pspace (); return result; } } diff --git a/gdb/macroscope.c b/gdb/macroscope.c index 50fc5c79691..6e01301484f 100644 --- a/gdb/macroscope.c +++ b/gdb/macroscope.c @@ -44,7 +44,7 @@ sal_macro_scope (struct symtab_and_line sal) if (sal.symtab == NULL) return result; - cust = sal.symtab->compunit (); + cust = &sal.symtab->compunit (); if (cust->macro_table () == NULL) return result; diff --git a/gdb/mi/mi-cmd-file.c b/gdb/mi/mi-cmd-file.c index 2ce661ad6d2..8b2fb379ec8 100644 --- a/gdb/mi/mi-cmd-file.c +++ b/gdb/mi/mi-cmd-file.c @@ -56,7 +56,7 @@ mi_cmd_file_list_exec_source_file (const char *command, uiout->field_string ("fullname", symtab_to_fullname (st.symtab)); uiout->field_signed ("macro-info", - st.symtab->compunit ()->macro_table () != NULL); + st.symtab->compunit ().macro_table () != NULL); } /* Implement -file-list-exec-source-files command. */ diff --git a/gdb/mi/mi-symbol-cmds.c b/gdb/mi/mi-symbol-cmds.c index d7535c51d2a..e284fe01729 100644 --- a/gdb/mi/mi-symbol-cmds.c +++ b/gdb/mi/mi-symbol-cmds.c @@ -50,7 +50,7 @@ mi_cmd_symbol_list_lines (const char *command, const char *const *argv, already sorted by increasing values in the symbol table, so no need to perform any other sorting. */ - struct objfile *objfile = s->compunit ()->objfile (); + struct objfile *objfile = s->compunit ().objfile (); gdbarch = objfile->arch (); ui_out_emit_list list_emitter (uiout, "lines"); diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 387434153e9..408ddf1ff83 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -462,7 +462,7 @@ objfile::~objfile () and if so, call clear_last_displayed_sal. */ if (symtab *last_displayed_symtab = get_last_displayed_symtab (); last_displayed_symtab != nullptr - && last_displayed_symtab->compunit ()->objfile () == this) + && last_displayed_symtab->compunit ().objfile () == this) clear_last_displayed_sal (); /* Rebuild section map next time we need it. */ diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c index 32fef65dc37..1351dbe2d0c 100644 --- a/gdb/or1k-tdep.c +++ b/gdb/or1k-tdep.c @@ -468,9 +468,8 @@ or1k_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) if (0 != prologue_end) { struct symtab_and_line prologue_sal = find_sal_for_pc (start_pc, 0); - struct compunit_symtab *compunit - = prologue_sal.symtab->compunit (); - const char *debug_format = compunit->debugformat (); + const char *debug_format + = prologue_sal.symtab->compunit ().debugformat (); if ((NULL != debug_format) && (strlen ("dwarf") <= strlen (debug_format)) diff --git a/gdb/p-exp.y b/gdb/p-exp.y index c06ada3b7ff..1a43837ae33 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -615,7 +615,7 @@ block : BLOCKNAME struct symtab *tem = lookup_symtab (current_program_space, copy.c_str ()); if (tem) - $$ = (tem->compunit ()->blockvector () + $$ = (tem->compunit ().blockvector () ->static_block ()); else error (_("No file or function \"%s\"."), diff --git a/gdb/parse.c b/gdb/parse.c index fd190d6e15e..ecb3e30c5cb 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -386,7 +386,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, if (cursal.symtab) expression_context_block - = cursal.symtab->compunit ()->blockvector ()->static_block (); + = cursal.symtab->compunit ().blockvector ()->static_block (); if (expression_context_block) expression_context_pc = expression_context_block->entry_pc (); diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index 1db13af4c12..faaedc5e9e8 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -179,7 +179,7 @@ ltpy_get_pcs_for_line (PyObject *self, PyObject *args) return gdbpy_handle_gdb_exception (nullptr, except); } - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); return build_line_table_tuple_from_entries (objfile, entries); } @@ -413,7 +413,7 @@ ltpy_iternext (PyObject *self) item = &(symtab->linetable ()->item[iter_obj->current_index]); } - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); obj = build_linetable_entry (item->line, item->pc (objfile)); iter_obj->current_index++; diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 9a343167624..ce5feaeb390 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -130,7 +130,7 @@ stpy_get_objfile (PyObject *self, void *closure) STPY_REQUIRE_VALID (self, symtab); - return objfile_to_objfile_object (symtab->compunit ()->objfile ()).release (); + return objfile_to_objfile_object (symtab->compunit ().objfile ()).release (); } /* Getter function for symtab.producer. */ @@ -139,13 +139,13 @@ static PyObject * stpy_get_producer (PyObject *self, void *closure) { struct symtab *symtab = NULL; - struct compunit_symtab *cust; STPY_REQUIRE_VALID (self, symtab); - cust = symtab->compunit (); - if (cust->producer () != nullptr) + compunit_symtab &cust = symtab->compunit (); + + if (cust.producer () != nullptr) { - const char *producer = cust->producer (); + const char *producer = cust.producer (); return host_string_to_python_string (producer).release (); } @@ -191,11 +191,11 @@ stpy_global_block (PyObject *self, PyObject *args) STPY_REQUIRE_VALID (self, symtab); - blockvector = symtab->compunit ()->blockvector (); + blockvector = symtab->compunit ().blockvector (); const struct block *block = blockvector->global_block (); return block_to_block_object (block, - symtab->compunit ()->objfile ()).release (); + symtab->compunit ().objfile ()).release (); } /* Return the STATIC_BLOCK of the underlying symtab. */ @@ -208,11 +208,11 @@ stpy_static_block (PyObject *self, PyObject *args) STPY_REQUIRE_VALID (self, symtab); - blockvector = symtab->compunit ()->blockvector (); + blockvector = symtab->compunit ().blockvector (); const struct block *block = blockvector->static_block (); return block_to_block_object (block, - symtab->compunit ()->objfile ()).release (); + symtab->compunit ().objfile ()).release (); } /* Implementation of gdb.Symtab.linetable (self) -> gdb.LineTable. @@ -361,7 +361,7 @@ stpy_dealloc (PyObject *obj) symtab_object *symtab_obj = (symtab_object *) obj; if (symtab_obj->symtab != nullptr) - stpy_registry.remove (symtab_obj->symtab->compunit ()->objfile(), + stpy_registry.remove (symtab_obj->symtab->compunit ().objfile (), symtab_obj); Py_TYPE (obj)->tp_free (obj); @@ -438,7 +438,7 @@ salpy_dealloc (PyObject *self) sal_object *self_sal = (sal_object *) self; if (self_sal->sal != nullptr && self_sal->sal->symtab != nullptr) - salpy_registry.remove (self_sal->sal->symtab->compunit ()->objfile (), + salpy_registry.remove (self_sal->sal->symtab->compunit ().objfile (), self_sal); xfree (self_sal->sal); @@ -463,7 +463,7 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal) objfile cleanup observer linked list. */ symtab *symtab = sal_obj->sal->symtab; if (symtab != nullptr) - salpy_registry.add (symtab->compunit ()->objfile (), sal_obj); + salpy_registry.add (symtab->compunit ().objfile (), sal_obj); } /* Given a symtab, and a symtab_object that has previously been @@ -476,7 +476,7 @@ set_symtab (symtab_object *obj, struct symtab *symtab) { obj->symtab = symtab; if (symtab != nullptr) - stpy_registry.add (symtab->compunit ()->objfile (), obj); + stpy_registry.add (symtab->compunit ().objfile (), obj); } /* Create a new symbol table (gdb.Symtab) object that encapsulates the @@ -491,7 +491,7 @@ symtab_to_symtab_object (struct symtab *symtab) if (symtab != nullptr) { gdbpy_ref<> result - = stpy_registry.lookup (symtab->compunit ()->objfile (), symtab); + = stpy_registry.lookup (symtab->compunit ().objfile (), symtab); if (result != nullptr) return result; } diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 4bd755b24f2..dae243ee2db 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -729,7 +729,7 @@ btrace_find_line_range (CORE_ADDR pc) if (nlines <= 0) return btrace_mk_line_range (symtab, 0, 0); - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); unrelocated_addr unrel_pc = unrelocated_addr (pc - objfile->text_section_offset ()); diff --git a/gdb/source-cache.c b/gdb/source-cache.c index 6e8acab3504..804a6a08a8c 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -110,9 +110,9 @@ source_cache::get_plain_source_lines (struct symtab *s, perror_with_name (symtab_to_filename_for_display (s)); time_t mtime = 0; - if (s->compunit ()->objfile () != NULL - && s->compunit ()->objfile ()->obfd != NULL) - mtime = s->compunit ()->objfile ()->mtime; + if (s->compunit ().objfile () != NULL + && s->compunit ().objfile ()->obfd != NULL) + mtime = s->compunit ().objfile ()->mtime; else if (current_program_space->exec_bfd ()) mtime = current_program_space->ebfd_mtime; diff --git a/gdb/source.c b/gdb/source.c index 6028c29deae..5c7c344a1aa 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -299,7 +299,7 @@ clear_current_source_symtab_and_line (objfile *objfile) return; if (loc->symtab () != nullptr - && loc->symtab ()->compunit ()->objfile () == objfile) + && loc->symtab ()->compunit ().objfile () == objfile) clear_current_source_symtab_and_line (objfile->pspace ()); } @@ -671,7 +671,6 @@ info_source_command (const char *ignore, int from_tty) current_source_location *loc = get_source_location (current_program_space); struct symtab *s = loc->symtab (); - struct compunit_symtab *cust; if (!s) { @@ -679,10 +678,11 @@ info_source_command (const char *ignore, int from_tty) return; } - cust = s->compunit (); + compunit_symtab &cust = s->compunit (); + gdb_printf (_("Current source file is %s\n"), s->filename ()); - if (s->compunit ()->dirname () != NULL) - gdb_printf (_("Compilation directory is %s\n"), s->compunit ()->dirname ()); + if (s->compunit ().dirname () != NULL) + gdb_printf (_("Compilation directory is %s\n"), s->compunit ().dirname ()); if (s->fullname () != nullptr) gdb_printf (_("Located in %s\n"), s->fullname ()); if (std::optional last_lineno = last_symtab_line (s); @@ -693,12 +693,12 @@ info_source_command (const char *ignore, int from_tty) gdb_printf (_("Source language is %s.\n"), language_str (s->language ())); gdb_printf (_("Producer is %s.\n"), - (cust->producer ()) != nullptr - ? cust->producer () : _("unknown")); + (cust.producer ()) != nullptr + ? cust.producer () : _("unknown")); gdb_printf (_("Compiled with %s debugging format.\n"), - cust->debugformat ()); + cust.debugformat ()); gdb_printf (_("%s preprocessor macro info.\n"), - (cust->macro_table () != nullptr + (cust.macro_table () != nullptr ? "Includes" : "Does not include")); } @@ -1117,44 +1117,41 @@ open_source_file (struct symtab *s) gdb::unique_xmalloc_ptr fullname = s->release_fullname (); scoped_fd fd = find_and_open_source (s->filename (), - s->compunit ()->dirname (), + s->compunit ().dirname (), &fullname); if (fd.get () < 0) { - if (s->compunit () != nullptr) + const objfile *ofp = s->compunit ().objfile (); + + std::string srcpath; + if (IS_ABSOLUTE_PATH (s->filename ())) + srcpath = s->filename (); + else if (s->compunit ().dirname () != nullptr) { - const objfile *ofp = s->compunit ()->objfile (); + srcpath = s->compunit ().dirname (); + srcpath += SLASH_STRING; + srcpath += s->filename (); + } - std::string srcpath; - if (IS_ABSOLUTE_PATH (s->filename ())) - srcpath = s->filename (); - else if (s->compunit ()->dirname () != nullptr) - { - srcpath = s->compunit ()->dirname (); - srcpath += SLASH_STRING; - srcpath += s->filename (); - } + const struct bfd_build_id *build_id + = build_id_bfd_get (ofp->obfd.get ()); - const struct bfd_build_id *build_id - = build_id_bfd_get (ofp->obfd.get ()); + /* Query debuginfod for the source file. */ + if (build_id != nullptr && !srcpath.empty ()) + { + scoped_fd query_fd + = debuginfod_source_query (build_id->data, + build_id->size, + srcpath.c_str (), + &fullname); - /* Query debuginfod for the source file. */ - if (build_id != nullptr && !srcpath.empty ()) + /* Don't return a negative errno from debuginfod_source_query. + It handles the reporting of its own errors. */ + if (query_fd.get () >= 0) { - scoped_fd query_fd - = debuginfod_source_query (build_id->data, - build_id->size, - srcpath.c_str (), - &fullname); - - /* Don't return a negative errno from debuginfod_source_query. - It handles the reporting of its own errors. */ - if (query_fd.get () >= 0) - { - s->set_fullname (std::move (fullname)); - return query_fd; - } + s->set_fullname (std::move (fullname)); + return query_fd; } } } @@ -1217,11 +1214,11 @@ symtab_to_fullname (struct symtab *s) /* rewrite_source_path would be applied by find_and_open_source, we should report the pathname where GDB tried to find the file. */ - if (s->compunit ()->dirname () == nullptr + if (s->compunit ().dirname () == nullptr || IS_ABSOLUTE_PATH (s->filename ())) fullname = make_unique_xstrdup (s->filename ()); else - fullname.reset (concat (s->compunit ()->dirname (), SLASH_STRING, + fullname.reset (concat (s->compunit ().dirname (), SLASH_STRING, s->filename (), (char *) NULL)); s->set_fullname (rewrite_source_path (fullname.get ())); @@ -1527,7 +1524,7 @@ info_line_command (const char *arg, int from_tty) else if (sal.line > 0 && find_pc_range_for_sal (sal, &start_pc, &end_pc)) { - gdbarch *gdbarch = sal.symtab->compunit ()->objfile ()->arch (); + gdbarch *gdbarch = sal.symtab->compunit ().objfile ()->arch (); if (start_pc == end_pc) { diff --git a/gdb/symfile.c b/gdb/symfile.c index 5f046a03567..296795bda80 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2811,7 +2811,7 @@ allocate_symtab (struct compunit_symtab *cust, const char *filename, struct objfile *objfile = cust->objfile (); struct symtab *symtab = obstack_new (&objfile->objfile_obstack, - cust, + *cust, objfile->intern (filename), objfile->intern (filename_for_id), deduce_language_from_filename (filename)); diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 89374bd8a2f..6d90765fe50 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -135,7 +135,7 @@ dump_objfile (struct objfile *objfile) styled_string (file_name_style.style (), symtab_to_filename_for_display (symtab)), host_address_to_string (symtab)); - if (symtab->compunit ()->objfile () != objfile) + if (symtab->compunit ().objfile () != objfile) gdb_printf (_(", NOT ON CHAIN!")); gdb_printf ("\n"); } @@ -244,7 +244,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile) static void dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) { - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); struct gdbarch *gdbarch = objfile->arch (); const struct linetable *l; int depth; @@ -254,10 +254,10 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) symtab_to_filename_for_display (symtab)), host_address_to_string (symtab)); - if (symtab->compunit ()->dirname () != NULL) + if (symtab->compunit ().dirname () != NULL) gdb_printf (outfile, _("Compilation directory is %ps\n"), styled_string (file_name_style.style (), - symtab->compunit ()->dirname ())); + symtab->compunit ().dirname ())); gdb_printf (outfile, _("Read from object file %ps (%s)\n"), styled_string (file_name_style.style (), objfile_name (objfile)), @@ -288,7 +288,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) if (is_main_symtab_of_compunit_symtab (symtab)) { gdb_printf (outfile, _("\nBlockvector:\n\n")); - const blockvector *bv = symtab->compunit ()->blockvector (); + const blockvector *bv = symtab->compunit ().blockvector (); for (int i = 0; i < bv->num_blocks (); i++) { const block *b = bv->block (i); @@ -342,9 +342,9 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) } else { - compunit_symtab *compunit = symtab->compunit (); + compunit_symtab &compunit = symtab->compunit (); const char *compunit_filename - = symtab_to_filename_for_display (compunit->primary_filetab ()); + = symtab_to_filename_for_display (compunit.primary_filetab ()); gdb_printf (outfile, _("\nBlockvector same as owning compunit: %ps\n\n"), @@ -356,14 +356,14 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) compunit_symtabs included by this one. */ if (is_main_symtab_of_compunit_symtab (symtab)) { - struct compunit_symtab *cust = symtab->compunit (); + compunit_symtab &cust = symtab->compunit (); - if (cust->user != nullptr) + if (cust.user != nullptr) gdb_printf (outfile, _("Compunit user: %s\n"), - host_address_to_string (cust->user->primary_filetab ())); + host_address_to_string (cust.user->primary_filetab ())); - for (compunit_symtab *include : cust->includes) + for (compunit_symtab *include : cust.includes) gdb_printf (outfile, _("Compunit include: %s\n"), host_address_to_string (include->primary_filetab ())); } @@ -978,14 +978,14 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data) const struct linetable *linetable; struct objfile *objfile; - objfile = symtab->compunit ()->objfile (); + objfile = symtab->compunit ().objfile (); gdb_printf (_("objfile: %ps ((struct objfile *) %s)\n"), styled_string (file_name_style.style (), objfile_name (objfile)), host_address_to_string (objfile)); gdb_printf (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"), - symtab->compunit ()->name, - host_address_to_string (symtab->compunit ())); + symtab->compunit ().name, + host_address_to_string (&symtab->compunit ())); gdb_printf (_("symtab: %ps ((struct symtab *) %s)\n"), styled_string (file_name_style.style (), symtab_to_fullname (symtab)), diff --git a/gdb/symtab.c b/gdb/symtab.c index b38362e6fcc..4ca6f92ff9a 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -3389,7 +3389,7 @@ find_pc_for_line (struct symtab *symtab, int line, CORE_ADDR *pc) if (symtab != NULL) { l = symtab->linetable (); - *pc = l->item[ind].pc (symtab->compunit ()->objfile ()); + *pc = l->item[ind].pc (symtab->compunit ().objfile ()); return true; } else @@ -3511,10 +3511,10 @@ find_function_start_sal_1 (CORE_ADDR func_addr, obj_section *section, symtab_and_line sal = find_sal_for_pc_sect (func_addr, section, 0); if (funfirstline && sal.symtab != NULL - && (sal.symtab->compunit ()->locations_valid () + && (sal.symtab->compunit ().locations_valid () || sal.symtab->language () == language_asm)) { - struct gdbarch *gdbarch = sal.symtab->compunit ()->objfile ()->arch (); + struct gdbarch *gdbarch = sal.symtab->compunit ().objfile ()->arch (); sal.pc = func_addr; if (gdbarch_skip_entrypoint_p (gdbarch)) @@ -3592,7 +3592,7 @@ skip_prologue_using_lineinfo (CORE_ADDR func_addr, struct symtab *symtab) if (!find_pc_partial_function (func_addr, NULL, &func_start, &func_end)) return func_addr; - struct objfile *objfile = symtab->compunit ()->objfile (); + struct objfile *objfile = symtab->compunit ().objfile (); /* Linetable entries are ordered by PC values, see the commentary in symtab.h where `struct linetable' is defined. Thus, the first @@ -3634,7 +3634,7 @@ skip_prologue_using_linetable (CORE_ADDR func_addr) { const linetable *linetable = prologue_sal.symtab->linetable (); - struct objfile *objfile = prologue_sal.symtab->compunit ()->objfile (); + struct objfile *objfile = prologue_sal.symtab->compunit ().objfile (); unrelocated_addr unrel_start = unrelocated_addr (start_pc - objfile->text_section_offset ()); @@ -3727,7 +3727,7 @@ skip_prologue_sal (struct symtab_and_line *sal) have proven the CU (Compilation Unit) supports it. sal->SYMTAB does not have to be set by the caller so we use SYM instead. */ if (sym != NULL - && sym->symtab ()->compunit ()->locations_valid ()) + && sym->symtab ()->compunit ().locations_valid ()) force_skip = 0; symtab_and_line start_sal; @@ -3885,7 +3885,7 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr) if (prologue_sal.symtab->language () != language_asm) { struct objfile *objfile - = prologue_sal.symtab->compunit ()->objfile (); + = prologue_sal.symtab->compunit ().objfile (); const linetable *linetable = prologue_sal.symtab->linetable (); gdb_assert (linetable->nitems > 0); int idx = 0; @@ -3986,7 +3986,7 @@ find_epilogue_using_linetable (CORE_ADDR func_addr) const struct symtab_and_line sal = find_sal_for_pc (end_pc - 1, 0); if (sal.symtab != nullptr && sal.symtab->language () != language_asm) { - struct objfile *objfile = sal.symtab->compunit ()->objfile (); + struct objfile *objfile = sal.symtab->compunit ().objfile (); unrelocated_addr unrel_start = unrelocated_addr (start_pc - objfile->text_section_offset ()); unrelocated_addr unrel_end @@ -6155,7 +6155,7 @@ collect_file_symbol_completion_matches (completion_tracker &tracker, for symbols which match. */ for_each_symtab (current_program_space, srcfile, [&] (symtab *s) { - add_symtab_completions (s->compunit (), + add_symtab_completions (&s->compunit (), tracker, mode, lookup_name, sym_text, word, TYPE_CODE_UNDEF); }); @@ -6560,7 +6560,7 @@ struct objfile * symbol::objfile () const { gdb_assert (is_objfile_owned ()); - return owner.symtab->compunit ()->objfile (); + return owner.symtab->compunit ().objfile (); } /* See symtab.h. */ @@ -6570,7 +6570,7 @@ symbol::arch () const { if (!is_objfile_owned ()) return owner.arch; - return owner.symtab->compunit ()->objfile ()->arch (); + return owner.symtab->compunit ().objfile ()->arch (); } /* See symtab.h. */ diff --git a/gdb/symtab.h b/gdb/symtab.h index b29b72aba00..fc2c1ed23aa 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1671,21 +1671,20 @@ struct linetable struct symtab { - symtab (struct compunit_symtab *cust, const char *filename, + symtab (struct compunit_symtab &cust, const char *filename, const char *filename_for_id, enum language language) : m_filename (filename), m_filename_for_id (filename_for_id), - m_compunit (cust), + m_compunit (&cust), m_language (language) { gdb_assert (m_filename != nullptr); gdb_assert (m_filename_for_id != nullptr); - gdb_assert (m_compunit != nullptr); } - struct compunit_symtab *compunit () const + struct compunit_symtab &compunit () const { - return m_compunit; + return *m_compunit; } const struct linetable *linetable () const @@ -2028,7 +2027,7 @@ struct compunit_symtab : intrusive_list_node static inline bool is_main_symtab_of_compunit_symtab (struct symtab *symtab) { - return symtab == symtab->compunit ()->primary_filetab (); + return symtab == symtab->compunit ().primary_filetab (); } /* Return true if epilogue unwind info of CUST is valid. */ diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index 783d4b2a1c2..466e9972106 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -79,7 +79,7 @@ tui_source_window::set_contents (struct gdbarch *arch, m_fullname = make_unique_xstrdup (symtab_to_fullname (s)); cur_line = 0; - m_gdbarch = s->compunit ()->objfile ()->arch (); + m_gdbarch = s->compunit ().objfile ()->arch (); m_start_line_or_addr.loa = LOA_LINE; cur_line_no = m_start_line_or_addr.u.line_no = line_no; diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index 8609a7cd4fe..e3f64892e27 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -209,7 +209,7 @@ tui_update_source_windows_with_line (struct symtab_and_line sal) if (sal.symtab != nullptr) { find_pc_for_line (sal.symtab, sal.line, &sal.pc); - gdbarch = sal.symtab->compunit ()->objfile ()->arch (); + gdbarch = sal.symtab->compunit ().objfile ()->arch (); } for (struct tui_source_window_base *win_info : tui_source_windows ()) diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c index 9da18855d71..7359f9bcfb6 100644 --- a/gdb/z80-tdep.c +++ b/gdb/z80-tdep.c @@ -498,8 +498,8 @@ z80_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) if (prologue_sal.symtab != nullptr) { - struct compunit_symtab *compunit = prologue_sal.symtab->compunit (); - const char *debug_format = compunit->debugformat (); + const char *debug_format + = prologue_sal.symtab->compunit ().debugformat (); if (debug_format != nullptr && !strncasecmp ("dwarf", debug_format, strlen ("dwarf")))