Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Ulrich Weigand" <uweigand@de.ibm.com>
To: swagiaal@redhat.com (sami wagiaalla)
Cc: gdb-patches@sourceware.org
Subject: Re: [patch] smart pointer support
Date: Fri, 06 Aug 2010 16:48:00 -0000	[thread overview]
Message-ID: <201008061648.o76Gmk3o008780@d12av02.megacenter.de.ibm.com> (raw)
In-Reply-To: <4C5C36F1.9040800@redhat.com> from "sami wagiaalla" at Aug 06, 2010 12:23:13 PM

sami wagiaalla wrote:

> Hmm I see. I was under the impression that here the value is copied from 
> the inferior's return location to gdb memory. As the patch stands (with 
> the kfail) this can be removed, but I am actually looking for guidance 
> on how to ensure that this value is available for gdb to perform further 
> function calls that utilize it, especially when the return value is a 
> copy not a reference. As is described in this bug: 
> http://sourceware.org/bugzilla/show_bug.cgi?id=11606

So there's two issues here.  The first question is, what can you expect
from a GDB value representing the return value of an inferior function
call?  You will *always* get the value itself, as bytes copied to GDB's
memory.  In *some* cases, the value will in addition be of type lval_memory
meaning that the value is also present in inferior memory, *and you know
where*.  See existing code:

        switch (gdbarch_return_value (gdbarch, value_type (function),
                                      target_values_type, NULL, NULL, NULL))
          {
          case RETURN_VALUE_REGISTER_CONVENTION:
          case RETURN_VALUE_ABI_RETURNS_ADDRESS:
          case RETURN_VALUE_ABI_PRESERVES_ADDRESS:
            retval = allocate_value (values_type);
            gdbarch_return_value (gdbarch, value_type (function), values_type,
                                  retbuf, value_contents_raw (retval), NULL);
            break;
          case RETURN_VALUE_STRUCT_CONVENTION:
            retval = value_at (values_type, struct_addr);
            break;
          }

In the second case, we get a lval_memory value including the address
("struct_addr") where it resides.  In the first case, we just get a
non_lval value because the value doesn't reside in memory in the first
place; it was returned in registers.

Thinking more about this, the value_at case actually looks broken,
because while the value is in memory, that memory slot was just
temporarily allocated on the stack, and will go away as soon as
we return from call_function_by_hand!  So it might in fact be
better to just return a non_lval in that case, too ...


The second question is:  Well, if all we have is a non_lval, can we still
call a member function?  In priciple we could do the same what C++ does
and allocate a temporary copy on the stack; we'd probably want to this
at the time we call the member function in call_function_by_hand, similar
to how we already create temporary copies of call arguments as required.
That seems the way forward to fix the bug you point out ...

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


  reply	other threads:[~2010-08-06 16:48 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-20 15:58 sami wagiaalla
2010-07-23 23:37 ` Tom Tromey
2010-08-05 18:46   ` sami wagiaalla
2010-08-05 22:57     ` Ulrich Weigand
2010-08-06 16:23       ` sami wagiaalla
2010-08-06 16:48         ` Ulrich Weigand [this message]
2010-08-06 17:29           ` Tom Tromey
2010-08-08 15:01             ` Ulrich Weigand
2010-08-06 21:33           ` sami wagiaalla
2010-08-06 22:20             ` Tom Tromey
2010-08-09 15:59               ` sami wagiaalla
2010-08-09 17:35                 ` Tom Tromey
2010-08-09 18:04                   ` sami wagiaalla
2010-08-09 18:23                     ` Jan Kratochvil
2010-08-16 20:31                       ` sami wagiaalla
2010-08-16 20:59                         ` Pedro Alves
2010-08-17 16:16                           ` sami wagiaalla
2010-08-17 17:15                             ` Tom Tromey
2010-10-19 20:55                               ` sami wagiaalla

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=201008061648.o76Gmk3o008780@d12av02.megacenter.de.ibm.com \
    --to=uweigand@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=swagiaal@redhat.com \
    /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