From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 4/6] Change pop_context to return a block
Date: Fri, 17 Apr 2026 12:24:06 -0600 [thread overview]
Message-ID: <20260417-list-in-scope-v1-4-0deb050fc03d@adacore.com> (raw)
In-Reply-To: <20260417-list-in-scope-v1-0-0deb050fc03d@adacore.com>
This changes buildsym_compunit::pop_context to create and return the
block, if needed. It also arranges to reset some fields in the
buildsym_compunit object to their saved values.
This also enables the removal of the set_local_using_directives
method.
---
gdb/buildsym.c | 29 +++++++++++++++++------------
gdb/buildsym.h | 15 +++++++++------
gdb/dwarf2/read.c | 55 ++++++++++++++++++-------------------------------------
3 files changed, 44 insertions(+), 55 deletions(-)
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 6d719cb25a0..592bcf8bcf0 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -629,13 +629,7 @@ buildsym_compunit::end_compunit_symtab_get_static_block (CORE_ADDR end_addr,
the context stack. */
if (!m_context_stack.empty ())
- {
- struct context_stack cstk = pop_context ();
-
- /* Make a block for the local symbols within. */
- finish_block (cstk.name, cstk.old_blocks, NULL,
- cstk.start_addr, end_addr);
- }
+ pop_context (end_addr);
gdb_assert (m_context_stack.empty ());
/* Executables may have out of order pending blocks; sort the
@@ -949,14 +943,25 @@ buildsym_compunit::push_context (CORE_ADDR valu)
return ctx;
}
-/* Pop a context block. Returns the address of the context block just
- popped. */
+/* See buildsym.h. */
-context_stack
-buildsym_compunit::pop_context ()
+block *
+buildsym_compunit::pop_context (CORE_ADDR end_addr,
+ const struct dynamic_prop *static_link,
+ bool required)
{
gdb_assert (!m_context_stack.empty ());
- context_stack result = m_context_stack.back ();
+ context_stack cstk = m_context_stack.back ();
m_context_stack.pop_back ();
+
+ block *result = nullptr;
+ if (required || !m_local_symbols.empty ()
+ || m_local_using_directives != nullptr)
+ result = finish_block (cstk.name, cstk.old_blocks, static_link,
+ cstk.start_addr, end_addr);
+
+ m_local_symbols = std::move (cstk.locals);
+ m_local_using_directives = cstk.local_using_directives;
+
return result;
}
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index 70d22229f53..d1199735abb 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -189,11 +189,6 @@ struct buildsym_compunit
return &m_local_using_directives;
}
- void set_local_using_directives (struct using_direct *new_local)
- {
- m_local_using_directives = new_local;
- }
-
struct using_direct **get_global_using_directives ()
{
return &m_global_using_directives;
@@ -243,7 +238,15 @@ struct buildsym_compunit
context_stack &push_context (CORE_ADDR valu);
- context_stack pop_context ();
+ /* Pop a context and create the corresponding block. Returns the
+ block. END_ADDR is the final address of the block. STATIC_LINK,
+ if provided, is the static link. REQUIRED controls whether the
+ block is required. When false, if the block does not contain any
+ variables or 'using' directives, this method will return
+ nullptr. */
+ block *pop_context (CORE_ADDR end_addr,
+ const struct dynamic_prop *static_link = nullptr,
+ bool required = true);
struct block *end_compunit_symtab_get_static_block
(CORE_ADDR end_addr, bool expandable, bool required);
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index e1d70ea650d..4447923ae3e 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -7715,7 +7715,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
CORE_ADDR highpc;
struct attribute *attr, *call_line, *call_file;
const char *name;
- struct block *block;
int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
std::vector<struct symbol *> template_args;
struct template_symbol *templ_func = NULL;
@@ -7802,17 +7801,18 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
gdb_assert (cu->get_builder () != nullptr);
context_stack &ctx = cu->get_builder ()->push_context (lowpc);
- ctx.name = new_symbol (die, read_type_die (die, cu), cu, templ_func);
+ symbol *func_sym = new_symbol (die, read_type_die (die, cu), cu, templ_func);
+ ctx.name = func_sym;
if (dwarf2_func_is_main_p (die, cu))
- set_objfile_main_name (objfile, ctx.name->linkage_name (),
+ set_objfile_main_name (objfile, func_sym->linkage_name (),
cu->lang ());
/* If there is a location expression for DW_AT_frame_base, record
it. */
attr = dwarf2_attr (die, DW_AT_frame_base, cu);
if (attr != nullptr)
- dwarf2_symbol_mark_computed (attr, ctx.name, cu, 1);
+ dwarf2_symbol_mark_computed (attr, func_sym, cu, 1);
/* If there is a location for the static link, record it. */
dynamic_prop *static_link = nullptr;
@@ -7864,11 +7864,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
}
}
- struct context_stack cstk = cu->get_builder ()->pop_context ();
-
- /* Make a block for the local symbols within. */
- block = cu->get_builder ()->finish_block (cstk.name, cstk.old_blocks,
- static_link, lowpc, highpc);
+ block *block = cu->get_builder ()->pop_context (highpc, static_link);
/* For C++, set the block's scope. */
if ((cu->lang () == language_cplus
@@ -7882,7 +7878,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
/* If we have address ranges, record them. */
dwarf2_record_block_ranges (die, block, cu);
- gdbarch_make_symbol_special (gdbarch, cstk.name, objfile);
+ gdbarch_make_symbol_special (gdbarch, func_sym, objfile);
/* Attach template arguments to function. */
if (!template_args.empty ())
@@ -7904,13 +7900,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
for (symbol *sym : template_args)
sym->set_symtab (templ_func->symtab ());
}
-
- /* In C++, we can have functions nested inside functions (e.g., when
- a function declares a class that has methods). This means that
- when we finish processing a function scope, we may need to go
- back to building a containing block's symbol lists. */
- cu->get_builder ()->get_local_symbols () = std::move (cstk.locals);
- cu->get_builder ()->set_local_using_directives (cstk.local_using_directives);
}
/* Process all the DIES contained within a lexical block scope. Start
@@ -7958,29 +7947,21 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
process_die (child_die, cu);
inherit_abstract_dies (die, cu);
- struct context_stack cstk = cu->get_builder ()->pop_context ();
- if (!cu->get_builder ()->get_local_symbols ().empty ()
- || (*cu->get_builder ()->get_local_using_directives ()) != NULL)
- {
- struct block *block
- = cu->get_builder ()->finish_block (0, cstk.old_blocks, NULL,
- cstk.start_addr, highpc);
+ block *block = cu->get_builder ()->pop_context (highpc, nullptr, false);
- /* Note that recording ranges after traversing children, as we
- do here, means that recording a parent's ranges entails
- walking across all its children's ranges as they appear in
- the address map, which is quadratic behavior.
+ /* Note that recording ranges after traversing children, as we
+ do here, means that recording a parent's ranges entails
+ walking across all its children's ranges as they appear in
+ the address map, which is quadratic behavior.
- It would be nicer to record the parent's ranges before
- traversing its children, simply overriding whatever you find
- there. But since we don't even decide whether to create a
- block until after we've traversed its children, that's hard
- to do. */
- dwarf2_record_block_ranges (die, block, cu);
- }
- cu->get_builder ()->get_local_symbols () = std::move (cstk.locals);
- cu->get_builder ()->set_local_using_directives (cstk.local_using_directives);
+ It would be nicer to record the parent's ranges before
+ traversing its children, simply overriding whatever you find
+ there. But since we don't even decide whether to create a
+ block until after we've traversed its children, that's hard
+ to do. */
+ if (block != nullptr)
+ dwarf2_record_block_ranges (die, block, cu);
}
static void dwarf2_ranges_read_low_addrs
--
2.53.0
next prev parent reply other threads:[~2026-04-17 18:24 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-17 18:24 [PATCH 0/6] Some buildsym cleanups Tom Tromey
2026-04-17 18:24 ` [PATCH 1/6] Use scoped_restore for dwarf2_cu::list_in_scope Tom Tromey
2026-04-17 18:24 ` [PATCH 2/6] Remove some dead code from buildsym.c Tom Tromey
2026-04-17 20:10 ` Simon Marchi
2026-04-17 18:24 ` [PATCH 3/6] Remove context_stack::depth Tom Tromey
2026-04-17 18:24 ` Tom Tromey [this message]
2026-04-17 20:11 ` [PATCH 4/6] Change pop_context to return a block Simon Marchi
2026-04-17 18:24 ` [PATCH 5/6] Return void from buildsym_compunit::push_context Tom Tromey
2026-04-17 20:22 ` Simon Marchi
2026-04-17 18:24 ` [PATCH 6/6] Rename context_stack and make it private Tom Tromey
2026-04-17 20:24 ` [PATCH 0/6] Some buildsym cleanups Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260417-list-in-scope-v1-4-0deb050fc03d@adacore.com \
--to=tromey@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox