Implement tp_richcompare for gdb.Block
[binutils-gdb.git] / gdb / blockframe.c
blob55e82fb4b193b7e8c440d42c94ccc209df666f8a
1 /* Get info from stack frames; convert between frames, blocks,
2 functions and pc values.
4 Copyright (C) 1986-2024 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "symtab.h"
22 #include "bfd.h"
23 #include "objfiles.h"
24 #include "frame.h"
25 #include "gdbcore.h"
26 #include "value.h"
27 #include "target.h"
28 #include "inferior.h"
29 #include "annotate.h"
30 #include "regcache.h"
31 #include "dummy-frame.h"
32 #include "command.h"
33 #include "cli/cli-cmds.h"
34 #include "block.h"
35 #include "inline-frame.h"
37 /* Return the innermost lexical block in execution in a specified
38 stack frame. The frame address is assumed valid.
40 If ADDR_IN_BLOCK is non-zero, set *ADDR_IN_BLOCK to the exact code
41 address we used to choose the block. We use this to find a source
42 line, to decide which macro definitions are in scope.
44 The value returned in *ADDR_IN_BLOCK isn't necessarily the frame's
45 PC, and may not really be a valid PC at all. For example, in the
46 caller of a function declared to never return, the code at the
47 return address will never be reached, so the call instruction may
48 be the very last instruction in the block. So the address we use
49 to choose the block is actually one byte before the return address
50 --- hopefully pointing us at the call instruction, or its delay
51 slot instruction. */
53 const struct block *
54 get_frame_block (const frame_info_ptr &frame, CORE_ADDR *addr_in_block)
56 CORE_ADDR pc;
57 const struct block *bl;
58 int inline_count;
60 if (!get_frame_address_in_block_if_available (frame, &pc))
61 return NULL;
63 if (addr_in_block)
64 *addr_in_block = pc;
66 bl = block_for_pc (pc);
67 if (bl == NULL)
68 return NULL;
70 inline_count = frame_inlined_callees (frame);
72 while (inline_count > 0)
74 if (bl->inlined_p ())
75 inline_count--;
77 bl = bl->superblock ();
78 gdb_assert (bl != NULL);
81 return bl;
84 CORE_ADDR
85 get_pc_function_start (CORE_ADDR pc)
87 const struct block *bl;
88 struct bound_minimal_symbol msymbol;
90 bl = block_for_pc (pc);
91 if (bl)
93 struct symbol *symbol = bl->linkage_function ();
95 if (symbol)
97 bl = symbol->value_block ();
98 return bl->entry_pc ();
102 msymbol = lookup_minimal_symbol_by_pc (pc);
103 if (msymbol.minsym)
105 CORE_ADDR fstart = msymbol.value_address ();
107 if (find_pc_section (fstart))
108 return fstart;
111 return 0;
114 /* Return the symbol for the function executing in frame FRAME. */
116 struct symbol *
117 get_frame_function (const frame_info_ptr &frame)
119 const struct block *bl = get_frame_block (frame, 0);
121 if (bl == NULL)
122 return NULL;
124 while (bl->function () == NULL && bl->superblock () != NULL)
125 bl = bl->superblock ();
127 return bl->function ();
131 /* Return the function containing pc value PC in section SECTION.
132 Returns 0 if function is not known. */
134 struct symbol *
135 find_pc_sect_function (CORE_ADDR pc, struct obj_section *section)
137 const struct block *b = block_for_pc_sect (pc, section);
139 if (b == 0)
140 return 0;
141 return b->linkage_function ();
144 /* Return the function containing pc value PC.
145 Returns 0 if function is not known.
146 Backward compatibility, no section */
148 struct symbol *
149 find_pc_function (CORE_ADDR pc)
151 return find_pc_sect_function (pc, find_pc_mapped_section (pc));
154 /* See symtab.h. */
156 struct symbol *
157 find_pc_sect_containing_function (CORE_ADDR pc, struct obj_section *section)
159 const block *bl = block_for_pc_sect (pc, section);
161 if (bl == nullptr)
162 return nullptr;
164 return bl->containing_function ();
167 /* These variables are used to cache the most recent result of
168 find_pc_partial_function.
170 The addresses cache_pc_function_low and cache_pc_function_high
171 record the range in which PC was found during the most recent
172 successful lookup. When the function occupies a single contiguous
173 address range, these values correspond to the low and high
174 addresses of the function. (The high address is actually one byte
175 beyond the last byte of the function.) For a function with more
176 than one (non-contiguous) range, the range in which PC was found is
177 used to set the cache bounds.
179 When determining whether or not these cached values apply to a
180 particular PC value, PC must be within the range specified by
181 cache_pc_function_low and cache_pc_function_high. In addition to
182 PC being in that range, cache_pc_section must also match PC's
183 section. See find_pc_partial_function() for details on both the
184 comparison as well as how PC's section is determined.
186 The other values aren't used for determining whether the cache
187 applies, but are used for setting the outputs from
188 find_pc_partial_function. cache_pc_function_low and
189 cache_pc_function_high are used to set outputs as well. */
191 static CORE_ADDR cache_pc_function_low = 0;
192 static CORE_ADDR cache_pc_function_high = 0;
193 static const general_symbol_info *cache_pc_function_sym = nullptr;
194 static struct obj_section *cache_pc_function_section = NULL;
195 static const struct block *cache_pc_function_block = nullptr;
197 /* Clear cache, e.g. when symbol table is discarded. */
199 void
200 clear_pc_function_cache (void)
202 cache_pc_function_low = 0;
203 cache_pc_function_high = 0;
204 cache_pc_function_sym = nullptr;
205 cache_pc_function_section = NULL;
206 cache_pc_function_block = nullptr;
209 /* See symtab.h. */
211 bool
212 find_pc_partial_function_sym (CORE_ADDR pc,
213 const struct general_symbol_info **sym,
214 CORE_ADDR *address, CORE_ADDR *endaddr,
215 const struct block **block)
217 struct obj_section *section;
218 struct symbol *f;
219 struct bound_minimal_symbol msymbol;
220 struct compunit_symtab *compunit_symtab = NULL;
221 CORE_ADDR mapped_pc;
223 /* To ensure that the symbol returned belongs to the correct section
224 (and that the last [random] symbol from the previous section
225 isn't returned) try to find the section containing PC. First try
226 the overlay code (which by default returns NULL); and second try
227 the normal section code (which almost always succeeds). */
228 section = find_pc_overlay (pc);
229 if (section == NULL)
230 section = find_pc_section (pc);
232 mapped_pc = overlay_mapped_address (pc, section);
234 if (mapped_pc >= cache_pc_function_low
235 && mapped_pc < cache_pc_function_high
236 && section == cache_pc_function_section)
237 goto return_cached_value;
239 msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
240 compunit_symtab = find_pc_sect_compunit_symtab (mapped_pc, section);
242 if (compunit_symtab != NULL)
244 /* Checking whether the msymbol has a larger value is for the
245 "pathological" case mentioned in stack.c:find_frame_funname.
247 We use BLOCK_ENTRY_PC instead of BLOCK_START_PC for this
248 comparison because the minimal symbol should refer to the
249 function's entry pc which is not necessarily the lowest
250 address of the function. This will happen when the function
251 has more than one range and the entry pc is not within the
252 lowest range of addresses. */
253 f = find_pc_sect_function (mapped_pc, section);
254 if (f != NULL
255 && (msymbol.minsym == NULL
256 || (f->value_block ()->entry_pc ()
257 >= msymbol.value_address ())))
259 const struct block *b = f->value_block ();
261 cache_pc_function_sym = f;
262 cache_pc_function_section = section;
263 cache_pc_function_block = b;
265 /* For blocks occupying contiguous addresses (i.e. no gaps),
266 the low and high cache addresses are simply the start
267 and end of the block.
269 For blocks with non-contiguous ranges, we have to search
270 for the range containing mapped_pc and then use the start
271 and end of that range.
273 This causes the returned *ADDRESS and *ENDADDR values to
274 be limited to the range in which mapped_pc is found. See
275 comment preceding declaration of find_pc_partial_function
276 in symtab.h for more information. */
278 if (b->is_contiguous ())
280 cache_pc_function_low = b->start ();
281 cache_pc_function_high = b->end ();
283 else
285 bool found = false;
286 for (const blockrange &range : b->ranges ())
288 if (range.start () <= mapped_pc && mapped_pc < range.end ())
290 cache_pc_function_low = range.start ();
291 cache_pc_function_high = range.end ();
292 found = true;
293 break;
296 /* Above loop should exit via the break. */
297 gdb_assert (found);
301 goto return_cached_value;
305 /* Not in the normal symbol tables, see if the pc is in a known
306 section. If it's not, then give up. This ensures that anything
307 beyond the end of the text seg doesn't appear to be part of the
308 last function in the text segment. */
310 if (!section)
311 msymbol.minsym = NULL;
313 /* Must be in the minimal symbol table. */
314 if (msymbol.minsym == NULL)
316 /* No available symbol. */
317 if (sym != nullptr)
318 *sym = 0;
319 if (address != NULL)
320 *address = 0;
321 if (endaddr != NULL)
322 *endaddr = 0;
323 if (block != nullptr)
324 *block = nullptr;
325 return false;
328 cache_pc_function_low = msymbol.value_address ();
329 cache_pc_function_sym = msymbol.minsym;
330 cache_pc_function_section = section;
331 cache_pc_function_high = minimal_symbol_upper_bound (msymbol);
332 cache_pc_function_block = nullptr;
334 return_cached_value:
336 if (address)
338 if (pc_in_unmapped_range (pc, section))
339 *address = overlay_unmapped_address (cache_pc_function_low, section);
340 else
341 *address = cache_pc_function_low;
344 if (sym != nullptr)
345 *sym = cache_pc_function_sym;
347 if (endaddr)
349 if (pc_in_unmapped_range (pc, section))
351 /* Because the high address is actually beyond the end of
352 the function (and therefore possibly beyond the end of
353 the overlay), we must actually convert (high - 1) and
354 then add one to that. */
356 *endaddr = 1 + overlay_unmapped_address (cache_pc_function_high - 1,
357 section);
359 else
360 *endaddr = cache_pc_function_high;
363 if (block != nullptr)
364 *block = cache_pc_function_block;
366 return true;
369 /* See symtab.h. */
371 bool
372 find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
373 CORE_ADDR *endaddr, const struct block **block)
375 const general_symbol_info *gsi;
376 bool r = find_pc_partial_function_sym (pc, &gsi, address, endaddr, block);
377 if (name != nullptr)
378 *name = r ? gsi->linkage_name () : nullptr;
379 return r;
383 /* See symtab.h. */
385 bool
386 find_function_entry_range_from_pc (CORE_ADDR pc, const char **name,
387 CORE_ADDR *address, CORE_ADDR *endaddr)
389 const struct block *block;
390 bool status = find_pc_partial_function (pc, name, address, endaddr, &block);
392 if (status && block != nullptr && !block->is_contiguous ())
394 CORE_ADDR entry_pc = block->entry_pc ();
396 for (const blockrange &range : block->ranges ())
398 if (range.start () <= entry_pc && entry_pc < range.end ())
400 if (address != nullptr)
401 *address = range.start ();
403 if (endaddr != nullptr)
404 *endaddr = range.end ();
406 return status;
410 /* It's an internal error if we exit the above loop without finding
411 the range. */
412 internal_error (_("Entry block not found in find_function_entry_range_from_pc"));
415 return status;
418 /* See symtab.h. */
420 struct type *
421 find_function_type (CORE_ADDR pc)
423 struct symbol *sym = find_pc_function (pc);
425 if (sym != NULL && sym->value_block ()->entry_pc () == pc)
426 return sym->type ();
428 return NULL;
431 /* See symtab.h. */
433 struct type *
434 find_gnu_ifunc_target_type (CORE_ADDR resolver_funaddr)
436 struct type *resolver_type = find_function_type (resolver_funaddr);
437 if (resolver_type != NULL)
439 /* Get the return type of the resolver. */
440 struct type *resolver_ret_type
441 = check_typedef (resolver_type->target_type ());
443 /* If we found a pointer to function, then the resolved type
444 is the type of the pointed-to function. */
445 if (resolver_ret_type->code () == TYPE_CODE_PTR)
447 struct type *resolved_type
448 = resolver_ret_type->target_type ();
449 if (check_typedef (resolved_type)->code () == TYPE_CODE_FUNC)
450 return resolved_type;
454 return NULL;
457 /* Return the innermost stack frame that is executing inside of BLOCK and is
458 at least as old as the selected frame. Return NULL if there is no
459 such frame. If BLOCK is NULL, just return NULL. */
461 frame_info_ptr
462 block_innermost_frame (const struct block *block)
464 if (block == NULL)
465 return NULL;
467 frame_info_ptr frame = get_selected_frame ();
468 while (frame != NULL)
470 const struct block *frame_block = get_frame_block (frame, NULL);
471 if (frame_block != NULL && block->contains (frame_block))
472 return frame;
474 frame = get_prev_frame (frame);
477 return NULL;