Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Pedro Alves <pedro@palves.net>, gdb-patches@sourceware.org
Subject: Re: [PATCH 4/4] gdb.base/callfuncs.exp: Exercise "long double"
Date: Thu, 16 Jul 2026 22:36:49 +0100	[thread overview]
Message-ID: <87qzl2d3bi.fsf@redhat.com> (raw)
In-Reply-To: <20260714220631.1499846-5-pedro@palves.net>

Pedro Alves <pedro@palves.net> writes:

> gdb.base/callfuncs.exp tests calling functions that take and return
> floating point arguments, but only for float and double.  Add long
> double too, so that GDB's handling of the type in inferior function
> calls is exercised.
>
> On x86_64-pc-windows-msvc, without the fix that teaches GDB about the
> correct size of "long double", we get:
>
>  $ grep FAIL gdb.sum
>  FAIL: gdb.base/callfuncs.exp: noproto: p ((int (*) ()) t_long_double_values)(45.654L,-67.66L)
>  FAIL: gdb.base/callfuncs.exp: p ((int (*) (long double, long double)) t_long_double_values)(45.654,-67.66)
>
> These two tests go through GDB's expression parser for the long double
> type.  Without the long double fix, GDB is passing 128-bit (amd64
> default) but on the MSVC ABI, it should be passing 64-bit.
>
> The other tests pass even without the fix, as those are direct calls
> that get the parameter type from DWARF, which has the correct long
> double size.

LGTM.

Approved-By: Andrew Burgess <aburgess@redhat.com>

Thanks,
Andrew

>
> Change-Id: Ibcc3590753d08ece4fbf03c5d890872197047fff
> ---
>  gdb/testsuite/gdb.base/callfuncs.c   | 58 ++++++++++++++++++++--------
>  gdb/testsuite/gdb.base/callfuncs.exp | 26 +++++++++++++
>  2 files changed, 67 insertions(+), 17 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.base/callfuncs.c b/gdb/testsuite/gdb.base/callfuncs.c
> index 0e6d9dcdd71..918e8d6f97d 100644
> --- a/gdb/testsuite/gdb.base/callfuncs.c
> +++ b/gdb/testsuite/gdb.base/callfuncs.c
> @@ -72,6 +72,24 @@ double double_val13 = 10.25;
>  double double_val14 = 11.25;
>  double double_val15 = 12.25;
>  
> +/* "long double" cannot be pasted into a "long_double_val1"
> +   identifier, so the long double globals use an "ldouble" prefix.  */
> +long double ldouble_val1 = 45.654;
> +long double ldouble_val2 = -67.66;
> +long double ldouble_val3 = 0.25;
> +long double ldouble_val4 = 1.25;
> +long double ldouble_val5 = 2.25;
> +long double ldouble_val6 = 3.25;
> +long double ldouble_val7 = 4.25;
> +long double ldouble_val8 = 5.25;
> +long double ldouble_val9 = 6.25;
> +long double ldouble_val10 = 7.25;
> +long double ldouble_val11 = 8.25;
> +long double ldouble_val12 = 9.25;
> +long double ldouble_val13 = 10.25;
> +long double ldouble_val14 = 11.25;
> +long double ldouble_val15 = 12.25;
> +
>  #ifdef TEST_COMPLEX
>  extern float crealf (float _Complex);
>  extern float cimagf (float _Complex);
> @@ -359,20 +377,23 @@ float float_arg1, float_arg2;
>  #endif
>  
>  /* Define a function NAME comparing its two TYPE arguments against the
> -   TYPE_val1 and TYPE_val2 globals.  */
> +   TYPE_val1 and TYPE_val2 globals.  PREFIX is passed separately
> +   because "long double" cannot be pasted into a "long_double_val1"
> +   identifier.  */
>  
> -#define DEFINE_T_FLOAT_VALUES(TYPE, NAME)			\
> +#define DEFINE_T_FLOAT_VALUES(TYPE, NAME, PREFIX)		\
>  int								\
>  NAME T_VALUES_PARAMS (TYPE)					\
>  {								\
> -  return ((arg1 - TYPE##_val1) < DELTA				\
> -	  && (arg1 - TYPE##_val1) > -DELTA			\
> -	  && (arg2 - TYPE##_val2) < DELTA			\
> -	  && (arg2 - TYPE##_val2) > -DELTA);			\
> +  return ((arg1 - PREFIX##_val1) < DELTA			\
> +	  && (arg1 - PREFIX##_val1) > -DELTA			\
> +	  && (arg2 - PREFIX##_val2) < DELTA			\
> +	  && (arg2 - PREFIX##_val2) > -DELTA);			\
>  }
>  
> -DEFINE_T_FLOAT_VALUES (float, t_float_values2)
> -DEFINE_T_FLOAT_VALUES (double, t_double_values)
> +DEFINE_T_FLOAT_VALUES (float, t_float_values2, float)
> +DEFINE_T_FLOAT_VALUES (double, t_double_values, double)
> +DEFINE_T_FLOAT_VALUES (long double, t_long_double_values, ldouble)
>  
>  /* The parameter list of a t_TYPE_many_args function.  Split out into
>     prototyped vs non-prototyped variants because a macro body cannot
> @@ -394,9 +415,11 @@ DEFINE_T_FLOAT_VALUES (double, t_double_values)
>     test that GDB can construct the parameter save area correctly.
>     Note that Linux/ppc32 has 8 float registers to use for float
>     parameter passing and Linux/ppc64 has 13, so the number of
> -   arguments has to be at least 14 to contemplate these platforms.  */
> +   arguments has to be at least 14 to contemplate these platforms.
> +   PREFIX is passed separately because "long double" cannot be pasted
> +   into a "long_double_val1" identifier.  */
>  
> -#define DEFINE_T_MANY_ARGS(TYPE, NAME)					\
> +#define DEFINE_T_MANY_ARGS(TYPE, NAME, PREFIX)				\
>  TYPE									\
>  NAME T_MANY_ARGS_PARAMS (TYPE)						\
>  {									\
> @@ -405,18 +428,19 @@ NAME T_MANY_ARGS_PARAMS (TYPE)						\
>  									\
>    sum_args = (f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11	\
>  	      + f12 + f13 + f14 + f15);					\
> -  sum_values = (TYPE##_val1 + TYPE##_val2 + TYPE##_val3			\
> -		+ TYPE##_val4 + TYPE##_val5 + TYPE##_val6		\
> -		+ TYPE##_val7 + TYPE##_val8 + TYPE##_val9		\
> -		+ TYPE##_val10 + TYPE##_val11 + TYPE##_val12		\
> -		+ TYPE##_val13 + TYPE##_val14 + TYPE##_val15);		\
> +  sum_values = (PREFIX##_val1 + PREFIX##_val2 + PREFIX##_val3		\
> +		+ PREFIX##_val4 + PREFIX##_val5 + PREFIX##_val6		\
> +		+ PREFIX##_val7 + PREFIX##_val8 + PREFIX##_val9		\
> +		+ PREFIX##_val10 + PREFIX##_val11 + PREFIX##_val12	\
> +		+ PREFIX##_val13 + PREFIX##_val14 + PREFIX##_val15);	\
>  									\
>    return ((sum_args - sum_values) < DELTA				\
>  	  && (sum_args - sum_values) > -DELTA);				\
>  }
>  
> -DEFINE_T_MANY_ARGS (float, t_float_many_args)
> -DEFINE_T_MANY_ARGS (double, t_double_many_args)
> +DEFINE_T_MANY_ARGS (float, t_float_many_args, float)
> +DEFINE_T_MANY_ARGS (double, t_double_many_args, double)
> +DEFINE_T_MANY_ARGS (long double, t_long_double_many_args, ldouble)
>  
>  /* Various functions for _Complex types.  */
>  
> diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp
> index f020100ce8b..ebc389c6b03 100644
> --- a/gdb/testsuite/gdb.base/callfuncs.exp
> +++ b/gdb/testsuite/gdb.base/callfuncs.exp
> @@ -136,6 +136,32 @@ proc do_function_calls {prototypes} {
>  
>  	gdb_test "p t_double_many_args (double_val1, double_val2, double_val3, double_val4, double_val5, double_val6, double_val7, double_val8, double_val9, double_val10, double_val11, double_val12, double_val13, double_val14, double_val15)" " = 1" "call function with many double arguments."
>  
> +	gdb_test "p t_long_double_values(0.0,0.0)" " = 0"
> +	# Same, via function pointer.  When the pointer type is
> +	# unprototyped, GDB has no parameter type to coerce the
> +	# arguments to, so the literals must carry the "L" suffix to
> +	# be passed as long double rather than double.
> +	if {$prototypes} {
> +	    gdb_test "p ((int (*) (long double, long double)) t_long_double_values)(0.0,0.0)" " = 0"
> +	} else {
> +	    gdb_test "p ((int (*) ()) t_long_double_values)(0.0L,0.0L)" " = 0"
> +	}
> +
> +	gdb_test "p t_long_double_values(45.654,-67.66)" " = 1"
> +	if {$prototypes} {
> +	    gdb_test "p ((int (*) (long double, long double)) t_long_double_values)(45.654,-67.66)" " = 1"
> +	} else {
> +	    gdb_test "p ((int (*) ()) t_long_double_values)(45.654L,-67.66L)" " = 1"
> +	}
> +
> +	gdb_test "p t_long_double_values(ldouble_val1,ldouble_val2)" " = 1"
> +	gdb_test "p t_long_double_values(45.654,ldouble_val2)" " = 1"
> +	gdb_test "p t_long_double_values(ldouble_val1,-67.66)" " = 1"
> +
> +	gdb_test "p t_long_double_many_args (ldouble_val1, ldouble_val2, ldouble_val3, ldouble_val4, ldouble_val5, ldouble_val6, ldouble_val7, ldouble_val8, ldouble_val9, ldouble_val10, ldouble_val11, ldouble_val12, ldouble_val13, ldouble_val14, ldouble_val15)" \
> +	    " = 1" \
> +	    "call function with many long double arguments"
> +
>  	gdb_test "p t_double_int(99.0, 1)" " = 0"
>  	gdb_test "p t_double_int(99.0, 99)" " = 1"
>  	gdb_test "p t_int_double(99, 1.0)" " = 0"
> -- 
> 2.54.0


  reply	other threads:[~2026-07-16 21:37 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 22:06 [PATCH 0/4] gdb/testsuite: "long double" infcall tests Pedro Alves
2026-07-14 22:06 ` [PATCH 1/4] gdb.base/nodebug.exp: Add long double testing Pedro Alves
2026-07-16 21:14   ` Andrew Burgess
2026-07-17 13:59     ` Pedro Alves
2026-07-22 18:41       ` Andrew Burgess
2026-07-14 22:06 ` [PATCH 2/4] gdb.base/callfuncs.exp: Adjust for Windows Pedro Alves
2026-07-14 22:25   ` Pedro Alves
2026-07-16 21:26     ` Andrew Burgess
2026-07-17 14:27       ` Pedro Alves
2026-07-22 18:42         ` Andrew Burgess
2026-07-14 22:06 ` [PATCH 3/4] gdb.base/callfuncs.c: factor out float/double functions Pedro Alves
2026-07-16 21:33   ` Andrew Burgess
2026-07-14 22:06 ` [PATCH 4/4] gdb.base/callfuncs.exp: Exercise "long double" Pedro Alves
2026-07-16 21:36   ` Andrew Burgess [this message]
2026-07-22 13:01 ` [PATCH 0/4] gdb/testsuite: "long double" infcall tests Pedro Alves

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=87qzl2d3bi.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@palves.net \
    /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