Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Tom Tromey <tom@tromey.com>, Keith Seitz <keiths@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v2] infcall: Add support for integer literals as reference function paramters
Date: Wed, 22 Oct 2025 13:05:22 +0100	[thread overview]
Message-ID: <87qzuvcfb1.fsf@redhat.com> (raw)
In-Reply-To: <877bwom2ip.fsf@tromey.com>

Tom Tromey <tom@tromey.com> writes:

>>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:
>
> Keith> This patch attempts to mitigate the shortcomings of passing literals
> Keith> to inferior function calls requiring references.  The specific use case here
> Keith> is std::map's operator[]:
>
> Thanks for doing this.
>
> Keith>  struct value *
> Keith> -value_coerce_to_target (struct value *val)
> Keith> +value_coerce_to_target (struct value *val, struct type *param_type)
> Keith>  {
>
> I wasn't totally sold on doing the work here and not in value_arg_coerce
> but I guess it makes sense.
>
> Keith> +  if (param_type != nullptr && param_type->language () == language_cplus
> Keith> +      && TYPE_IS_REFERENCE (param_type))
> Keith> +    {
>
> Can we get here with a value that has an address, and so we don't need
> to make a copy?  Like if there's a local variable 'x', and you do 'print
> map[x]'?

I took a look at this patch too, and came here to say the same thing.
In fact, this is exactly why the 'param_type->language () ==
language_cplus' is needed.  The Fortran breakage that Keith mentions
does this:

  (gdb) p return_string(returned_string_debugger, 40)
  (gdb) p returned_string_debugger

The first line calls 'return_string' passing in the inferior variable
'returned_string_debugger' (length 40), the function is then going to
fill that variable in for us, which we print on the next line.

Without the 'param_type->language() == language_cplus' bit, we end up
creating a copy of 'returned_string_debugger' in the inferior, which the
'return_string' function fills in.  Then back in GDB we try to print the
original variable, which _hasn't_ been filled in.

This is all just a long way around of saying that Tom's right.

> If the argument is already in memory, then just casting its address to a
> reference would be a lot better, especially because memcpy()ing the data
> into the inferior is only really correct for trivially-copyable types.

I agree with this.

This function `value_coerce_to_target` does seem like a sensible place
to update to fix this, but given that the forcing seems to be entangled
with the parameter type, I wonder if this should be fixed back in
`value_arg_coerce` (infcall.c)?  Specifically, in this block:

    case TYPE_CODE_REF:
    case TYPE_CODE_RVALUE_REF:
      {
	struct value *new_value;

	if (TYPE_IS_REFERENCE (arg_type))
	  return value_cast_pointers (type, arg, 0);

	/* Cast the value to the reference's target type, and then
	   convert it back to a reference.  This will issue an error
	   if the value was not previously in memory - in some cases
	   we should clearly be allowing this, but how?  */
	new_value = value_cast (type->target_type (), arg);
	new_value = value_ref (new_value, type->code ());
	return new_value;
      }

The comment seems (to me) to hint at the exact problem that you are
trying to solve here.  Maybe the solution is to split
`value_coerce_to_target` and `value_must_coerce_to_target` into some
smaller pieces and then reuse those within `value_arg_coerce`?

> I don't know if that property (trivially-copyable) is all that easy to
> detect in gdb, but if it is, I guess it would make sense to detect it
> and throw an exception.  Since in that case we'd be looking at something
> like a callee that wants memory but where the object has been SROA'd or
> something along those lines.

We have `language_pass_by_reference`, the return value of which will, I
think, tell you if a type is trivially-copyable or not.  I don't think
this is going to be the common path though; don't objects that are not
trivially-copyable have to live in memory?  I'm sure there might be some
edge case here, but for me, I'd be happy with a patch that ignores this
for now, and we can come back to this later if/when we find a
problematic case.

Thanks,
Andrew


  reply	other threads:[~2025-10-22 12:06 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-16 15:48 [PATCH] " Keith Seitz
2025-10-17 14:49 ` Tom Tromey
2025-10-20 19:00   ` Keith Seitz
2025-10-20 19:36 ` [PATCH v2] " Keith Seitz
2025-10-21 20:19   ` Tom Tromey
2025-10-22 12:05     ` Andrew Burgess [this message]
2025-10-22 13:21       ` Tom Tromey
2026-01-22 19:05       ` Keith Seitz
2026-01-23 14:07         ` Aktemur, Tankut Baris
2026-01-27 18:43           ` Keith Seitz
2026-01-27 19:01 ` [PATCH v4] " Keith Seitz
2026-01-28  8:24   ` Aktemur, Tankut Baris
2026-01-28 13:54   ` Andrew Burgess
2026-02-02 17:05     ` Aktemur, Tankut Baris
2026-02-02 17:21     ` Keith Seitz
2026-01-30 20:59   ` Tom Tromey
2026-02-02 16:58     ` Keith Seitz
2026-02-02 17:22       ` Aktemur, Tankut Baris
2026-02-12 16:31       ` Tom Tromey
2026-03-12 14:14 ` [PATCH v5] infcall: Add support for integer literals as reference function parameters Keith Seitz
2026-03-12 16:23   ` Tom de Vries
2026-03-12 16:45     ` Keith Seitz
2026-03-12 17:12 ` [PATCH v6] " Keith Seitz
2026-03-17 14:10   ` Andrew Burgess
2026-03-17 18:11     ` Keith Seitz

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=87qzuvcfb1.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=keiths@redhat.com \
    --cc=tom@tromey.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