From: "Ulrich Weigand" <uweigand@de.ibm.com>
To: gdb-patches@sourceware.org
Subject: Re: [rfa] frame address size incorrect if address size != ptr size
Date: Fri, 06 Aug 2010 14:51:00 -0000 [thread overview]
Message-ID: <201008061450.o76EouG2023129@d12av02.megacenter.de.ibm.com> (raw)
In-Reply-To: <20100806104810.GJ4610@calimero.vinschen.de> from "Corinna Vinschen" at Aug 06, 2010 12:48:10 PM
Corinna Vinschen wrote:
> At one point in this thread you mentioned that .eh_frame isn't really
> standarized.
>
> Additionally, using the pointer size in .eh_frame sections would
> invariably break unwinding on targets like avr and XStormy16.
No, it would make it work :-) In .eh_frame sections, the contents
of DW_EH_PE_absptr encoded fields are *used as pointer values* at
run time. See e.g. unwind-pe.h:read_encoded_value_with_base:
static const unsigned char *
read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
const unsigned char *p, _Unwind_Ptr *val)
{
union unaligned
{
void *ptr;
unsigned u2 __attribute__ ((mode (HI)));
unsigned u4 __attribute__ ((mode (SI)));
unsigned u8 __attribute__ ((mode (DI)));
signed s2 __attribute__ ((mode (HI)));
signed s4 __attribute__ ((mode (SI)));
signed s8 __attribute__ ((mode (DI)));
} __attribute__((__packed__));
const union unaligned *u = (const union unaligned *) p;
_Unwind_Internal_Ptr result;
[...]
switch (encoding & 0x0f)
{
case DW_EH_PE_absptr:
result = (_Unwind_Internal_Ptr) u->ptr;
p += sizeof (void *);
break;
"p" points directly into the mapped .eh_frame image. The contents
are simply interpreted as a native "void *" at run-time. If GDB
wants to use this section as well, it has to treat it like it would
read a "void *" global variable from the target ...
> > 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.
>
> ... .eh_frame sections are never generated for XStormy16. The
> -fasynchronous-unwind-tables option is a no-op.
OK, that's unfortunate.
> Consequentially, is it *really* correct to define the ptr_size as you
> requested now, or isn't it *more* correct to use the target dependent
> approach as my previous patch implemented? Since it's using the pointer
> size as fallback, it will be correct for all existing .eh_frame sections
> anyway.
The difference between .eh_frame and .debug_frame is really fundamental;
.eh_frame holds *pointer* values in target "void *" format; while
.debug_frame holds *address* values using the same format as the rest
of the DWARF debug sections.
Therefore we will definitely have to make a distinction between the two.
If you have another suggestion how to achieve that, I'd certainly be
interested ...
> * dwarf2-frame.c (struct dwarf2_cie): Add ptr_size member.
> Throughout, call read_encoded_value with ptr_size rather than addr_size.
> (decode_frame_entry_1): Remove redundant setting of
> addr_size. Call gdbarch_dwarf2_addr_size rather than gdbarch_ptr_bit
> to determine addr_size in Dwarf versions < 4. Set ptr_size dependent
> on examined frame section. Add comment to explain why.
> * gdbarch.sh (dwarf2_addr_size): Define as variable. Add lengthy
> comment to explain usage.
> * gdbarch.c: Regenerate.
> * gdbarch.h: Regenerate.
> * xstormy16-tdep.c (xstormy16_gdbarch_init): Set dwarf2_addr_size to 4.
This looks good to me, except a couple of the comments:
> + /* Address values in .eh_frame sections are defined to have the
> + target's pointer size. Watchout: This breaks frame info for
> + targets with pointer size < address size, unless a .debug_frame
> + section exists as well. */
As discussed above, I don't agree that this breaks anything ... Do you
still feel it does?
> +# dwarf2_addr_size is the target address size as used int the Dwarf debug
> +# info. For .eh_frame FDEs this is considered equal to the size of a target
> +# pointer. For .debug_frame FDEs, this is supposed to be the target address
> +# size from the associated CU header, and which is equivalent to the
> +# DWARF2_ADDR_SIZE as defined by the target specific GCC back-end.
> +# Unfortunately there is no good way to determine this value. Therefore
> +# dwarf2_addr_size simply defaults to the target pointer size.
I'd reword this to make clear that this value is *not* used for .eh_frame,
but solely for .debug_frame.
Thanks,
Ulrich
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com
next prev parent reply other threads:[~2010-08-06 14:51 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-26 14:53 Corinna Vinschen
2010-08-04 11:35 ` Corinna Vinschen
2010-08-04 22:40 ` Jan Kratochvil
2010-08-05 8:06 ` Corinna Vinschen
2010-08-05 10:04 ` Ulrich Weigand
2010-08-05 12:30 ` Corinna Vinschen
2010-08-05 14:08 ` Ulrich Weigand
2010-08-05 14:30 ` Corinna Vinschen
2010-08-05 14:59 ` Ulrich Weigand
2010-08-05 15:30 ` Corinna Vinschen
2010-08-05 16:52 ` Ulrich Weigand
2010-08-06 10:48 ` Corinna Vinschen
2010-08-06 11:17 ` Mark Kettenis
2010-08-06 12:01 ` Corinna Vinschen
2010-08-06 14:51 ` Ulrich Weigand [this message]
2010-08-06 15:57 ` Corinna Vinschen
2010-08-06 16:27 ` Ulrich Weigand
2010-08-06 16:59 ` Corinna Vinschen
2010-08-06 19:03 ` Corinna Vinschen
2010-08-08 14:55 ` Ulrich Weigand
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=201008061450.o76EouG2023129@d12av02.megacenter.de.ibm.com \
--to=uweigand@de.ibm.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).