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/>. */
31 #include "dummy-frame.h"
33 #include "cli/cli-cmds.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
54 get_frame_block (const frame_info_ptr
&frame
, CORE_ADDR
*addr_in_block
)
57 const struct block
*bl
;
60 if (!get_frame_address_in_block_if_available (frame
, &pc
))
66 bl
= block_for_pc (pc
);
70 inline_count
= frame_inlined_callees (frame
);
72 while (inline_count
> 0)
77 bl
= bl
->superblock ();
78 gdb_assert (bl
!= NULL
);
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
);
93 struct symbol
*symbol
= bl
->linkage_function ();
97 bl
= symbol
->value_block ();
98 return bl
->entry_pc ();
102 msymbol
= lookup_minimal_symbol_by_pc (pc
);
105 CORE_ADDR fstart
= msymbol
.value_address ();
107 if (find_pc_section (fstart
))
114 /* Return the symbol for the function executing in frame FRAME. */
117 get_frame_function (const frame_info_ptr
&frame
)
119 const struct block
*bl
= get_frame_block (frame
, 0);
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. */
135 find_pc_sect_function (CORE_ADDR pc
, struct obj_section
*section
)
137 const struct block
*b
= block_for_pc_sect (pc
, section
);
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 */
149 find_pc_function (CORE_ADDR pc
)
151 return find_pc_sect_function (pc
, find_pc_mapped_section (pc
));
157 find_pc_sect_containing_function (CORE_ADDR pc
, struct obj_section
*section
)
159 const block
*bl
= block_for_pc_sect (pc
, section
);
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. */
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;
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
;
219 struct bound_minimal_symbol msymbol
;
220 struct compunit_symtab
*compunit_symtab
= NULL
;
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
);
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
);
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 ();
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 ();
296 /* Above loop should exit via the break. */
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. */
311 msymbol
.minsym
= NULL
;
313 /* Must be in the minimal symbol table. */
314 if (msymbol
.minsym
== NULL
)
316 /* No available symbol. */
323 if (block
!= nullptr)
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;
338 if (pc_in_unmapped_range (pc
, section
))
339 *address
= overlay_unmapped_address (cache_pc_function_low
, section
);
341 *address
= cache_pc_function_low
;
345 *sym
= cache_pc_function_sym
;
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,
360 *endaddr
= cache_pc_function_high
;
363 if (block
!= nullptr)
364 *block
= cache_pc_function_block
;
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
);
378 *name
= r
? gsi
->linkage_name () : nullptr;
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 ();
410 /* It's an internal error if we exit the above loop without finding
412 internal_error (_("Entry block not found in find_function_entry_range_from_pc"));
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
)
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
;
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. */
462 block_innermost_frame (const struct block
*block
)
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
))
474 frame
= get_prev_frame (frame
);