mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 03:42:22 +08:00

Consider this Fortran type: type :: some_type integer, allocatable :: array_one (:,:) integer :: a_field integer, allocatable :: array_two (:,:) end type some_type And a variable declared: type(some_type) :: some_var Now within GDB we try this: (gdb) set $a = some_var (gdb) p $a $1 = ( array_one = ../../src/gdb/value.c:3968: internal-error: Unexpected lazy value type. Normally, when an internalvar ($a in this case) is created, it is non-lazy, the value is immediately copied out of the inferior into GDB's memory. When printing the internalvar ($a) GDB will extract each field in turn, so in this case `array_one`. As the original internalvar is non-lazy then the extracted field will also be non-lazy, with its contents immediately copied from the parent internalvar. However, when the field has a dynamic type this is not the case, in value_primitive_field we see that any field with dynamic type is always created lazy. Further, the content of this field will usually not have been captured in the contents buffer of the original value, a field with dynamic location is effectively a pointer value contained within the parent value, with rules in the DWARF for how to dereference the pointer. So, we end up with a lazy lval_internalvar_component representing a field within an lval_internalvar. This eventually ends up in value_fetch_lazy, which currently does not support lval_internalvar_component, and we see the error above. My original plan for how to handle this involved extending value_fetch_lazy to handle lval_internalvar_component. However, when I did this I ran into another error: (gdb) set $a = some_var (gdb) p $a $1 = ( array_one = ((1, 1) (1, 1) (1, 1)), a_field = 5, array_two = ((0, 0, 0) (0, 0, 0)) ) (gdb) p $a%array_one $2 = ((1, 1) (1, 1) (1, 1)) (gdb) p $a%array_one(1,1) ../../src/gdb/value.c:1547: internal-error: void set_value_address(value*, CORE_ADDR): Assertion `value->lval == lval_memory' failed. The problem now is inside set_value_component_location, where we attempt to set the address for a component if the original parent value has a dynamic location. GDB does not expect to ever set the address on anything other than an lval_memory value (which seems reasonable). In order to resolve this issue I initially thought about how an internalvar should "capture" the value of a program variable at the moment the var is created. In an ideal world (I think) GDB would be able to do this even for values with dynamic type. So in our above example doing `set $a = some_var` would capture the content of 'some_var', but also the content of 'array_one', and also 'array_two', even though these content regions are not contained within the region of 'some_var'. Supporting this would require GDB values to be able to carry around multiple non-contiguous regions of memory as content in some way, which sounds like a pretty huge change to a core part of GDB. So, I wondered if there was some other solution that wouldn't require such a huge change. What if values with a dynamic location were though of like points with automatic dereferencing? Given this C structure: struct foo_t { int *val; } struct foo_t my_foo; Then in GDB: (gdb) $a = my_foo We would expect GDB to capture the pointer value in '$a', but not the value pointed at by the pointer. So maybe it's not that unreasonable to think that given a dynamically typed field GDB will capture the address of the content, but not the actual content itself. That's what this patch does. The approach is to catch this case in set_value_component_location. When we create a component location (of an lval_internalvar) that has a dynamic data location, the lval_internalvar_component is changed into an lval_memory. After this, both of the above issues are resolved. In the first case, the lval_memory is still lazy, but value_fetch_lazy knows how to handle that. In the second case, when we access an element of the array we are now accessing an element of an lval_memory, not an lval_internalvar_component, and calling set_value_address on an lval_memory is fine. gdb/ChangeLog: * value.c (set_value_component_location): Adjust the VALUE_LVAL for internalvar components that have a dynamic location. gdb/testsuite/ChangeLog: * gdb.fortran/intvar-dynamic-types.exp: New file. * gdb.fortran/intvar-dynamic-types.f90: New file.
198 lines
5.9 KiB
Plaintext
198 lines
5.9 KiB
Plaintext
2021-01-08 Andrew Burgess <andrew.burgess@embecosm.com>
|
||
|
||
* value.c (set_value_component_location): Adjust the VALUE_LVAL
|
||
for internalvar components that have a dynamic location.
|
||
|
||
2021-01-08 Tom de Vries <tdevries@suse.de>
|
||
|
||
PR gdb/26881
|
||
* breakpoint.c (create_exception_master_breakpoint_probe)
|
||
(create_exception_master_breakpoint_hook): Factor out
|
||
of ...
|
||
(create_exception_master_breakpoint): ... here. Only try to install
|
||
the master exception breakpoint in objfile.debug using the
|
||
_Unwind_DebugHook method, if the install using probes in objfile
|
||
failed.
|
||
|
||
2021-01-08 Andrew Burgess <andrew.burgess@embecosm.com>
|
||
|
||
* f-lang.c (fortran_value_subarray): Call value_from_component.
|
||
|
||
2021-01-07 Mike Frysinger <vapier@gentoo.org>
|
||
|
||
* remote-sim.c: Include memory-map.h.
|
||
(gdbsim_target): Define memory_map override.
|
||
(gdbsim_target::memory_map): Define.
|
||
|
||
2021-01-07 Tom Tromey <tromey@adacore.com>
|
||
|
||
* ada-lang.c (do_full_match): Conditionally skip "_ada_" prefix.
|
||
|
||
2021-01-07 Tom Tromey <tromey@adacore.com>
|
||
|
||
* ada-lang.c (add_component_interval): Start loop using vector's
|
||
updated size.
|
||
|
||
2021-01-06 Tom Tromey <tromey@adacore.com>
|
||
|
||
* ada-lang.c (ada_evaluate_subexp) <BINOP_ADD, BINOP_SUB>:
|
||
Do not cast result.
|
||
* valarith.c (fixed_point_binop): Handle multiplication
|
||
and division specially.
|
||
* valops.c (value_to_gdb_mpq): New function.
|
||
(value_cast_to_fixed_point): Use it.
|
||
|
||
2021-01-05 Hannes Domani <ssbssa@yahoo.de>
|
||
|
||
* tui/tui-winsource.c (tui_source_window_base::refresh_window):
|
||
Call wnoutrefresh instead of tui_win_info::refresh_window.
|
||
|
||
2021-01-05 Hannes Domani <ssbssa@yahoo.de>
|
||
|
||
* tui/tui-source.c (tui_source_window::show_line_number):
|
||
Redraw second space after line number.
|
||
|
||
2021-01-05 Hannes Domani <ssbssa@yahoo.de>
|
||
|
||
PR tui/26927
|
||
* tui/tui-winsource.c (tui_source_window_base::refresh_window):
|
||
Fix source pad size in prefresh.
|
||
(tui_source_window_base::show_source_content): Grow source pad
|
||
if necessary.
|
||
|
||
2021-01-04 Mike Frysinger <vapier@gentoo.org>
|
||
|
||
* bfin-tdep.c (bfin_push_dummy_call): Use align_up.
|
||
(bfin_frame_align): Use align_down.
|
||
|
||
2021-01-04 Tom de Vries <tdevries@suse.de>
|
||
|
||
* buildsym.c (buildsym_compunit::record_line): Filter out end-of-seq
|
||
terminators that do not terminate anything.
|
||
|
||
2021-01-04 Simon Marchi <simon.marchi@efficios.com>
|
||
|
||
* debug.c (debug_print_depth): New.
|
||
* infrun.h (INFRUN_SCOPED_DEBUG_START_END): New.
|
||
(INFRUN_SCOPED_DEBUG_ENTER_EXIT): New.
|
||
* infrun.c (start_step_over): Use
|
||
INFRUN_SCOPED_DEBUG_ENTER_EXIT.
|
||
(proceed): Use INFRUN_SCOPED_DEBUG_ENTER_EXIT and
|
||
INFRUN_SCOPED_DEBUG_START_END.
|
||
(fetch_inferior_event): Use INFRUN_SCOPED_DEBUG_ENTER_EXIT.
|
||
|
||
2021-01-04 Simon Marchi <simon.marchi@efficios.com>
|
||
|
||
* infrun.c (print_target_wait_results): Use infrun_debug_printf.
|
||
|
||
2021-01-04 Simon Marchi <simon.marchi@efficios.com>
|
||
|
||
* utils.c (vfprintf_unfiltered): Print timestamp only when
|
||
previous debug output ended with a newline.
|
||
|
||
2021-01-04 Luis Machado <luis.machado@linaro.org>
|
||
|
||
Update all users of trad_frame_saved_reg to use the new member
|
||
functions.
|
||
|
||
Remote all struct keywords from declarations of trad_frame_saved_reg
|
||
types, except on forward declarations.
|
||
|
||
* aarch64-tdep.c: Update.
|
||
* alpha-mdebug-tdep.c: Update.
|
||
* alpha-tdep.c: Update.
|
||
* arc-tdep.c: Update.
|
||
* arm-tdep.c: Update.
|
||
* avr-tdep.c: Update.
|
||
* cris-tdep.c: Update.
|
||
* csky-tdep.c: Update.
|
||
* frv-tdep.c: Update.
|
||
* hppa-linux-tdep.c: Update.
|
||
* hppa-tdep.c: Update.
|
||
* hppa-tdep.h: Update.
|
||
* lm32-tdep.c: Update.
|
||
* m32r-linux-tdep.c: Update.
|
||
* m32r-tdep.c: Update.
|
||
* m68hc11-tdep.c: Update.
|
||
* mips-tdep.c: Update.
|
||
* moxie-tdep.c: Update.
|
||
* riscv-tdep.c: Update.
|
||
* rs6000-tdep.c: Update.
|
||
* s390-linux-tdep.c: Update.
|
||
* s390-tdep.c: Update.
|
||
* score-tdep.c: Update.
|
||
* sparc-netbsd-tdep.c: Update.
|
||
* sparc-sol2-tdep.c: Update.
|
||
* sparc64-fbsd-tdep.c: Update.
|
||
* sparc64-netbsd-tdep.c: Update.
|
||
* sparc64-obsd-tdep.c: Update.
|
||
* sparc64-sol2-tdep.c: Update.
|
||
* tilegx-tdep.c: Update.
|
||
* v850-tdep.c: Update.
|
||
* vax-tdep.c: Update.
|
||
|
||
* frame-unwind.c (frame_unwind_got_bytes): Make parameter const.
|
||
* frame-unwind.h (frame_unwind_got_bytes): Likewise.
|
||
|
||
* trad-frame.c: Update.
|
||
Remove TF_REG_* enum.
|
||
(trad_frame_alloc_saved_regs): Add a static assertion to check for
|
||
a trivially-constructible struct.
|
||
(trad_frame_reset_saved_regs): Adjust to use member function.
|
||
(trad_frame_value_p): Likewise.
|
||
(trad_frame_addr_p): Likewise.
|
||
(trad_frame_realreg_p): Likewise.
|
||
(trad_frame_value_bytes_p): Likewise.
|
||
(trad_frame_set_value): Likewise.
|
||
(trad_frame_set_realreg): Likewise.
|
||
(trad_frame_set_addr): Likewise.
|
||
(trad_frame_set_unknown): Likewise.
|
||
(trad_frame_set_value_bytes): Likewise.
|
||
(trad_frame_get_prev_register): Likewise.
|
||
* trad-frame.h: Update.
|
||
(trad_frame_saved_reg_kind): New enum.
|
||
(struct trad_frame_saved_reg) <addr, realreg, data>: Remove.
|
||
<m_kind, m_reg>: New member fields.
|
||
<set_value, set_realreg, set_addr, set_unknown, set_value_bytes>
|
||
<kind, value, realreg, addr, value_bytes, is_value, is_realreg>
|
||
<is_addr, is_unknown, is_value_bytes>: New member functions.
|
||
|
||
2021-01-02 Simon Marchi <simon.marchi@polymtl.ca>
|
||
|
||
* target-float.c: Fix typos.
|
||
|
||
2021-01-02 Hannes Domani <ssbssa@yahoo.de>
|
||
|
||
* gdb-gdb.py.in: Fix main_type.flds_bnds.bounds pretty printer.
|
||
|
||
2021-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* gdbarch.sh: Update copyright year range.
|
||
|
||
2021-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
Update copyright year range in copyright header of all GDB files.
|
||
|
||
2021-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* copyright.py (get_update_list): Add "gdbserver" and "gdbsupport"
|
||
to the list of directories to update.
|
||
|
||
2021-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* top.c (print_gdb_version): Update copyright year.
|
||
|
||
2021-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* config/djgpp/fnchange.lst: Add entry for gdb/ChangeLog-2020.
|
||
|
||
For older changes see ChangeLog-2020.
|
||
|
||
Local Variables:
|
||
mode: change-log
|
||
left-margin: 8
|
||
fill-column: 74
|
||
version-control: never
|
||
coding: utf-8
|
||
End:
|