This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [rfa] frame address size incorrect if address size != ptr size
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 5 Aug 2010 18:51:48 +0200 (CEST)
- Subject: Re: [rfa] frame address size incorrect if address size != ptr size
Corinna Vinschen wrote:
> Index: dwarf2-frame.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v
> retrieving revision 1.114
> diff -u -p -r1.114 dwarf2-frame.c
> --- dwarf2-frame.c 7 Jul 2010 17:26:38 -0000 1.114
> +++ dwarf2-frame.c 5 Aug 2010 15:25:27 -0000
> @@ -1732,13 +1732,6 @@ decode_frame_entry_1 (struct comp_unit *
> depends on the target address size. */
> cie->encoding = DW_EH_PE_absptr;
>
> - /* The target address size. For .eh_frame FDEs this is considered
> - equal to the size of a target pointer. For .dwarf_frame FDEs,
> - this is supposed to be the target address size from the associated
> - CU header. FIXME: We do not have a good way to determine the
> - latter. Always use the target pointer size for now. */
> - cie->addr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
> -
> /* We'll determine the final value later, but we need to
> initialize it conservatively. */
> cie->signal_frame = 0;
> @@ -1779,7 +1772,7 @@ decode_frame_entry_1 (struct comp_unit *
> }
> else
> {
> - cie->addr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
> + cie->addr_size = gdbarch_dwarf2_addr_size (gdbarch);
> cie->segment_size = 0;
> }
Ah, wait a minute -- now we're missing the distinction between .eh_frame
and .debug_frame again. For .eh_frame, FDE encodings needs to keep using
ptr_bit as discussed earlier, even on targets that do define a non-default
gdbarch_dwarf2_addr_size. Sorry for not noticing earlier.
In fact, this means we might as well fix the inconsistent use between
addr_size as input to read_encoded_value (which needs to be ptr_size
on .eh_frame and addr_size on .debug_frame), and addr_size as input
to execute_stack_op (which needs to be addr_size always).
Could you add a second variable ptr_size to struct dwarf2_cie, and
initialize it (after the addr_size initialization) along the lines of:
if (eh_frame_p)
cie->ptr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
else
cie->ptr_size = cie->addr_size;
and then change all calls to read_encoded_value throughout dwarf2-frame.c
to pass cie->ptr_size instead of cie->addr_size.
It would then be interesting to see whether *both* .debug_frame and
.eh_frame work on xstormy16 ... you might be able to try the latter
by building with -fasynchronous-unwind-tables.
Bye,
Ulrich
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com