public inbox for libffi-discuss@sourceware.org
 help / color / mirror / Atom feed
* How to call 'printf' using libffi?
@ 2021-03-18 14:04 ShaJunxing
  2021-03-18 15:25 ` Anthony Green
  0 siblings, 1 reply; 13+ messages in thread
From: ShaJunxing @ 2021-03-18 14:04 UTC (permalink / raw)
  To: libffi-discuss

'printf' not only has variable length arguments (maximum length is 
unlimited?), but also each argument type may be different. I searched 
the whole Internet but still found nothing, anybody help? thank you very 
much.



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-18 14:04 How to call 'printf' using libffi? ShaJunxing
@ 2021-03-18 15:25 ` Anthony Green
  2021-03-19  2:08   ` ShaJunxing
  2021-03-19 10:13   ` Andrew Haley
  0 siblings, 2 replies; 13+ messages in thread
From: Anthony Green @ 2021-03-18 15:25 UTC (permalink / raw)
  To: ShaJunxing; +Cc: libffi-discuss

Here's an example:

#include <ffi.h>
#include <stdio.h>

int main (void)
{
  ffi_cif cif;
  void *args[4];
  ffi_type *arg_types[3];

  char *format = "%.5g, %d\n";
  double doubleArg = 3.14159;
  signed int sintArg = 7;
  ffi_arg res = 0;

  arg_types[0] = &ffi_type_pointer;
  arg_types[1] = &ffi_type_double;
  arg_types[2] = &ffi_type_sint;
  arg_types[3] = NULL;

  /* This printf call is variadic */
  ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, arg_types);

  args[0] = &format;
  args[1] = &doubleArg;
  args[2] = &sintArg;
  args[3] = NULL;

  ffi_call(&cif, FFI_FN(printf), &res, args);

  return 0;
}

On Thu, Mar 18, 2021 at 10:04 AM ShaJunxing via Libffi-discuss <
libffi-discuss@sourceware.org> wrote:

> 'printf' not only has variable length arguments (maximum length is
> unlimited?), but also each argument type may be different. I searched
> the whole Internet but still found nothing, anybody help? thank you very
> much.
>
>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-18 15:25 ` Anthony Green
@ 2021-03-19  2:08   ` ShaJunxing
  2021-03-19  2:36     ` Kaz Kylheku (libffi)
  2021-03-19 10:13   ` Andrew Haley
  1 sibling, 1 reply; 13+ messages in thread
From: ShaJunxing @ 2021-03-19  2:08 UTC (permalink / raw)
  To: Anthony Green; +Cc: libffi-discuss

在 2021/3/18 下午11:25, Anthony Green 写道:
> Here's an example:
>
> #include <ffi.h>
> #include <stdio.h>
>
> int main (void)
> {
>   ffi_cif cif;
>   void *args[4];
>   ffi_type *arg_types[3];
>
>   char *format = "%.5g, %d\n";
>   double doubleArg = 3.14159;
>   signed int sintArg = 7;
>   ffi_arg res = 0;
>
>   arg_types[0] = &ffi_type_pointer;
>   arg_types[1] = &ffi_type_double;
>   arg_types[2] = &ffi_type_sint;
>   arg_types[3] = NULL;
>
>   /* This printf call is variadic */
>   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, 
> arg_types);
>
>   args[0] = &format;
>   args[1] = &doubleArg;
>   args[2] = &sintArg;
>   args[3] = NULL;
>
>   ffi_call(&cif, FFI_FN(printf), &res, args);
>
>   return 0;
> }
>
> On Thu, Mar 18, 2021 at 10:04 AM ShaJunxing via Libffi-discuss 
> <libffi-discuss@sourceware.org <mailto:libffi-discuss@sourceware.org>> 
> wrote:
>
>     'printf' not only has variable length arguments (maximum length is
>     unlimited?), but also each argument type may be different. I searched
>     the whole Internet but still found nothing, anybody help? thank
>     you very
>     much.
>
>
Thank you for your answer, really appreciate it. libffi is so amazing it 
makes possible to call almost any shared libraries with even non C 
languages and without any header files and compilations, I love it so much.

Yesterday after sending email I also realized maybe different parameters 
needs different cif, and I did some experiments, it exactly works. But I 
got two more problems. The first is, I found ffi_prep_cif() works fine 
in this situation, so what is ffi_prep_cif_var() different from? The 
second is, I found printf() cannot properly handle float type in my 
machine, my code is:

#include <ffi.h>
#include <stdio.h>
intmain() {
ffi_cif cif;
ffi_type *atypes[2] = {&ffi_type_pointer, &ffi_type_float};
if(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, atypes) == 
FFI_OK) {
char*s = "hello %f\n";
floatf = 3.14;
void*avalues[2] = {&s, &f};
ffi_arg rvalue;
ffi_call(&cif, (void*)printf, &rvalue, avalues);
}
return0;
}

It always outputs zero (maybe other unexpected result). I changed the 
second argument to double, char *, int, long ... all correct, except float.

My machine is "Linux X230 4.9.0-14-amd64 #1 SMP Debian 4.9.246-2 
(2020-12-17) x86_64 GNU/Linux" and libc version is "GNU C Library 
(Debian GLIBC 2.24-11+deb9u4) stable release version 2.24".

Could you please give me a direction?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19  2:08   ` ShaJunxing
@ 2021-03-19  2:36     ` Kaz Kylheku (libffi)
  2021-03-19  3:09       ` ShaJunxing
  0 siblings, 1 reply; 13+ messages in thread
From: Kaz Kylheku (libffi) @ 2021-03-19  2:36 UTC (permalink / raw)
  To: ShaJunxing; +Cc: Anthony Green, libffi-discuss

On 2021-03-18 19:08, ShaJunxing via Libffi-discuss wrote:
> Yesterday after sending email I also realized maybe different
> parameters needs different cif, and I did some experiments, it exactly
> works. But I got two more problems. The first is, I found
> ffi_prep_cif() works fine in this situation, so what is
> ffi_prep_cif_var() different from?

Note that what you are saying is exactly analogous to this:

"When I declare printf like this:

    extern int printf(const char *fmt, char *arg);

everything works; I can call it as

    printf("Hello, %s!\n", name);

and I get the expected output.

why do I have to have a correct variadic prototype by including
<stdio.h>?

It might look like it's working, but it's undefined behavior;
it is not required to work and could prove to be nonportable.

Variadic functions do not necessarily pass arguments the same way
as ordinary functions. In order for libffi to build the correct
parameter passing mechanism for the descriptor, it needs to be
informed that the target function is variadic.

Then, depending on the target architecture, the libffi code
might do some things differently for calling that function.
Those different things might depend on how many arguments
there are and what types.

> The second is, I found printf()
> cannot properly handle float type in my machine, my code is:

Note that when argument expressions of float type are passed
as the trailing arguments of a variadic function, they are
promoted to type double. That's a C language rule.

The rule also applies to old style functions with undeclared
parameter lists,e .g.

    int old_style();

    float f = 3.14;

    old_style(f);  /* promoted to double! */

    /* definition must be this */

    int old_style(arg)
    double arg;
    {
    }

The %f conversion specifier in printf does not mean "float".
It means "fixed digit format". There are two other formats:
%e, exponential and %g, general (which chooses exponential
or fixed digit).

All of these take an argument of type double.

> 
> #include <ffi.h>
> #include <stdio.h>
> intmain() {
> ffi_cif cif;
> ffi_type *atypes[2] = {&ffi_type_pointer, &ffi_type_float};
> if(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, atypes) == 
> FFI_OK) {
> char*s = "hello %f\n";
> floatf = 3.14;
> void*avalues[2] = {&s, &f};
> ffi_arg rvalue;
> ffi_call(&cif, (void*)printf, &rvalue, avalues);
> }
> return0;
> }
> 
> It always outputs zero (maybe other unexpected result). I changed the
> second argument to double, char *, int, long ... all correct, except
> float.

Not only must the FFI type be ffi_type_double, but you must make sure
that the object which the corresponding argument points to is of
type double. FFI doesn't perform any conversion; it has no idea:
there is just a void * pointing at an argument object which is expected
to match the exact type that the type descriptor states.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19  2:36     ` Kaz Kylheku (libffi)
@ 2021-03-19  3:09       ` ShaJunxing
  0 siblings, 0 replies; 13+ messages in thread
From: ShaJunxing @ 2021-03-19  3:09 UTC (permalink / raw)
  To: Kaz Kylheku (libffi); +Cc: Anthony Green, libffi-discuss

在 2021/3/19 上午10:36, Kaz Kylheku (libffi) 写道:
> On 2021-03-18 19:08, ShaJunxing via Libffi-discuss wrote:
>> Yesterday after sending email I also realized maybe different
>> parameters needs different cif, and I did some experiments, it exactly
>> works. But I got two more problems. The first is, I found
>> ffi_prep_cif() works fine in this situation, so what is
>> ffi_prep_cif_var() different from?
>
> Note that what you are saying is exactly analogous to this:
>
> "When I declare printf like this:
>
>    extern int printf(const char *fmt, char *arg);
>
> everything works; I can call it as
>
>    printf("Hello, %s!\n", name);
>
> and I get the expected output.
>
> why do I have to have a correct variadic prototype by including
> <stdio.h>?
>
> It might look like it's working, but it's undefined behavior;
> it is not required to work and could prove to be nonportable.
>
> Variadic functions do not necessarily pass arguments the same way
> as ordinary functions. In order for libffi to build the correct
> parameter passing mechanism for the descriptor, it needs to be
> informed that the target function is variadic.
>
> Then, depending on the target architecture, the libffi code
> might do some things differently for calling that function.
> Those different things might depend on how many arguments
> there are and what types.
>
>> The second is, I found printf()
>> cannot properly handle float type in my machine, my code is:
>
> Note that when argument expressions of float type are passed
> as the trailing arguments of a variadic function, they are
> promoted to type double. That's a C language rule.
>
> The rule also applies to old style functions with undeclared
> parameter lists,e .g.
>
>    int old_style();
>
>    float f = 3.14;
>
>    old_style(f);  /* promoted to double! */
>
>    /* definition must be this */
>
>    int old_style(arg)
>    double arg;
>    {
>    }
>
> The %f conversion specifier in printf does not mean "float".
> It means "fixed digit format". There are two other formats:
> %e, exponential and %g, general (which chooses exponential
> or fixed digit).
>
> All of these take an argument of type double.
>
>>
>> #include <ffi.h>
>> #include <stdio.h>
>> intmain() {
>> ffi_cif cif;
>> ffi_type *atypes[2] = {&ffi_type_pointer, &ffi_type_float};
>> if(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, atypes) == 
>> FFI_OK) {
>> char*s = "hello %f\n";
>> floatf = 3.14;
>> void*avalues[2] = {&s, &f};
>> ffi_arg rvalue;
>> ffi_call(&cif, (void*)printf, &rvalue, avalues);
>> }
>> return0;
>> }
>>
>> It always outputs zero (maybe other unexpected result). I changed the
>> second argument to double, char *, int, long ... all correct, except
>> float.
>
> Not only must the FFI type be ffi_type_double, but you must make sure
> that the object which the corresponding argument points to is of
> type double. FFI doesn't perform any conversion; it has no idea:
> there is just a void * pointing at an argument object which is expected
> to match the exact type that the type descriptor states.

Thank you for your detailed answer, it's very kind of you. I'm not very 
good at C and was always thought var args are in fact macros and will be 
fixed length after compiling, now I realized it is a special mechanism 
not as simple as macros. I'll do more studying. Thank you so much.😁



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-18 15:25 ` Anthony Green
  2021-03-19  2:08   ` ShaJunxing
@ 2021-03-19 10:13   ` Andrew Haley
  2021-03-19 11:01     ` Anthony Green
  2021-03-19 11:26     ` Jarkko Hietaniemi
  1 sibling, 2 replies; 13+ messages in thread
From: Andrew Haley @ 2021-03-19 10:13 UTC (permalink / raw)
  To: libffi-discuss

On 3/18/21 3:25 PM, Anthony Green wrote:
>   arg_types[0] = &ffi_type_pointer;
>   arg_types[1] = &ffi_type_double;
>   arg_types[2] = &ffi_type_sint;
>   arg_types[3] = NULL;
> 
>   /* This printf call is variadic */
>   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, arg_types);

Surely that only works if a varargs call uses the same ABI as a normal
call. They don't always,

-- 
Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19 10:13   ` Andrew Haley
@ 2021-03-19 11:01     ` Anthony Green
  2021-03-19 11:43       ` Andrew Haley
  2021-03-19 11:26     ` Jarkko Hietaniemi
  1 sibling, 1 reply; 13+ messages in thread
From: Anthony Green @ 2021-03-19 11:01 UTC (permalink / raw)
  To: Andrew Haley; +Cc: libffi-discuss

On Fri, Mar 19, 2021 at 6:13 AM Andrew Haley via Libffi-discuss <
libffi-discuss@sourceware.org> wrote:

> On 3/18/21 3:25 PM, Anthony Green wrote:
> >   arg_types[0] = &ffi_type_pointer;
> >   arg_types[1] = &ffi_type_double;
> >   arg_types[2] = &ffi_type_sint;
> >   arg_types[3] = NULL;
> >
> >   /* This printf call is variadic */
> >   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
> arg_types);
>
> Surely that only works if a varargs call uses the same ABI as a normal
> call. They don't always,
>

I'm using the '_var' variant of ffi_prep_cif that takes this into account.

AG

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19 10:13   ` Andrew Haley
  2021-03-19 11:01     ` Anthony Green
@ 2021-03-19 11:26     ` Jarkko Hietaniemi
  2021-03-19 11:33       ` Anthony Green
  1 sibling, 1 reply; 13+ messages in thread
From: Jarkko Hietaniemi @ 2021-03-19 11:26 UTC (permalink / raw)
  To: Andrew Haley, libffi-discuss

Andrew Haley via Libffi-discuss wrote:
> On 3/18/21 3:25 PM, Anthony Green wrote:
>>    arg_types[0] = &ffi_type_pointer;
>>    arg_types[1] = &ffi_type_double;
>>    arg_types[2] = &ffi_type_sint;
>>    arg_types[3] = NULL;
>>
>>    /* This printf call is variadic */
>>    ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, arg_types);
> 
> Surely that only works if a varargs call uses the same ABI as a normal
> call. They don't always,
> 

Yeah, it's a mess, e.g.

https://www.quora.com/How-are-varargs-typically-implemented-in-C-under-the-hood


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19 11:26     ` Jarkko Hietaniemi
@ 2021-03-19 11:33       ` Anthony Green
  0 siblings, 0 replies; 13+ messages in thread
From: Anthony Green @ 2021-03-19 11:33 UTC (permalink / raw)
  To: jhi; +Cc: Andrew Haley, libffi-discuss

On Fri, Mar 19, 2021 at 7:26 AM Jarkko Hietaniemi <jhi@iki.fi> wrote:

> >>    /* This printf call is variadic */
> >>    ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
> arg_types);
> >
> > Surely that only works if a varargs call uses the same ABI as a normal
> > call. They don't always,
> >
>
> Yeah, it's a mess, e.g.
>
>
> https://www.quora.com/How-are-varargs-typically-implemented-in-C-under-the-hood
>
>

Libffi has you covered with ffi_prep_cif_var()

AG

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19 11:01     ` Anthony Green
@ 2021-03-19 11:43       ` Andrew Haley
  2021-03-20 22:40         ` Anthony Green
  0 siblings, 1 reply; 13+ messages in thread
From: Andrew Haley @ 2021-03-19 11:43 UTC (permalink / raw)
  To: Anthony Green; +Cc: libffi-discuss

On 3/19/21 11:01 AM, Anthony Green wrote:
>>>   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
>> arg_types);
>>
>> Surely that only works if a varargs call uses the same ABI as a normal
>> call. They don't always,
>>
> I'm using the '_var' variant of ffi_prep_cif that takes this into account.

Aha! Missed it.

-- 
Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-19 11:43       ` Andrew Haley
@ 2021-03-20 22:40         ` Anthony Green
  2021-03-20 23:56           ` Anthony Green
  0 siblings, 1 reply; 13+ messages in thread
From: Anthony Green @ 2021-03-20 22:40 UTC (permalink / raw)
  To: Andrew Haley; +Cc: libffi-discuss

It turns out there are problems with ffi_prep_cif_var().  One issue is that
libffi doesn't promote floats to doubles for varargs, like most C hackers
expect.  There was a bug filed against that recently:
https://github.com/libffi/libffi/issues/608
Should libffi do the promotion, or leave it as an exercise to the
developer?  Right now I'm thinking that it should simply abort in
ffi_prep_cif_var() if passed any of ffi_type_float, ffi_type_*short, or
ffi_type_*char and require that the caller handle promotions and only pass
pointers, structs, doubles, ints or larger, as it seems that we're not
promoting short integer values either.  If I pass a very long list of
varargs that end in a sequence of ffi_type_schar, for instance, the callee
doesn't find the right values in the right stack locations.  So maybe we
shouldn't allow that in the first place.

I'm interested in opinions.

Thanks,

AG


On Fri, Mar 19, 2021 at 7:43 AM Andrew Haley <aph@redhat.com> wrote:

> On 3/19/21 11:01 AM, Anthony Green wrote:
> >>>   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
> >> arg_types);
> >>
> >> Surely that only works if a varargs call uses the same ABI as a normal
> >> call. They don't always,
> >>
> > I'm using the '_var' variant of ffi_prep_cif that takes this into
> account.
>
> Aha! Missed it.
>
> --
> Andrew Haley  (he/him)
> Java Platform Lead Engineer
> Red Hat UK Ltd. <https://www.redhat.com>
> https://keybase.io/andrewhaley
> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-20 22:40         ` Anthony Green
@ 2021-03-20 23:56           ` Anthony Green
  2021-03-22 10:36             ` Andrew Haley
  0 siblings, 1 reply; 13+ messages in thread
From: Anthony Green @ 2021-03-20 23:56 UTC (permalink / raw)
  To: Andrew Haley; +Cc: libffi-discuss

It's worth noting that JNA, one of libffi's big users, does the
float-to-double promotion at their layer.
https://github.com/java-native-access/jna/issues/463

Ruby's FFI does the same thing:
https://github.com/ffi/ffi/blob/6d14c0a9107c0d5febb3bf92a60d2581e768fa2f/ext/ffi_c/Variadic.c

This is making me feel more comfortable about returning an error on float
varargs.  (I've change my mind about aborting)

AG


On Sat, Mar 20, 2021 at 6:40 PM Anthony Green <green@moxielogic.com> wrote:

> It turns out there are problems with ffi_prep_cif_var().  One issue is
> that libffi doesn't promote floats to doubles for varargs, like most C
> hackers expect.  There was a bug filed against that recently:
> https://github.com/libffi/libffi/issues/608
> Should libffi do the promotion, or leave it as an exercise to the
> developer?  Right now I'm thinking that it should simply abort in
> ffi_prep_cif_var() if passed any of ffi_type_float, ffi_type_*short, or
> ffi_type_*char and require that the caller handle promotions and only pass
> pointers, structs, doubles, ints or larger, as it seems that we're not
> promoting short integer values either.  If I pass a very long list of
> varargs that end in a sequence of ffi_type_schar, for instance, the callee
> doesn't find the right values in the right stack locations.  So maybe we
> shouldn't allow that in the first place.
>
> I'm interested in opinions.
>
> Thanks,
>
> AG
>
>
> On Fri, Mar 19, 2021 at 7:43 AM Andrew Haley <aph@redhat.com> wrote:
>
>> On 3/19/21 11:01 AM, Anthony Green wrote:
>> >>>   ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
>> >> arg_types);
>> >>
>> >> Surely that only works if a varargs call uses the same ABI as a normal
>> >> call. They don't always,
>> >>
>> > I'm using the '_var' variant of ffi_prep_cif that takes this into
>> account.
>>
>> Aha! Missed it.
>>
>> --
>> Andrew Haley  (he/him)
>> Java Platform Lead Engineer
>> Red Hat UK Ltd. <https://www.redhat.com>
>> https://keybase.io/andrewhaley
>> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
>>
>>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to call 'printf' using libffi?
  2021-03-20 23:56           ` Anthony Green
@ 2021-03-22 10:36             ` Andrew Haley
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Haley @ 2021-03-22 10:36 UTC (permalink / raw)
  To: Anthony Green; +Cc: libffi-discuss

On 3/20/21 11:56 PM, Anthony Green wrote:
> It's worth noting that JNA, one of libffi's big users, does the
> float-to-double promotion at their layer.
> https://github.com/java-native-access/jna/issues/463
> 
> Ruby's FFI does the same thing:
> https://github.com/ffi/ffi/blob/6d14c0a9107c0d5febb3bf92a60d2581e768fa2f/ext/ffi_c/Variadic.c
> 
> This is making me feel more comfortable about returning an error on float
> varargs.  (I've change my mind about aborting)
That souns right. libffi is the lowest-level layer, after all.

-- 
Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2021-03-22 10:36 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-18 14:04 How to call 'printf' using libffi? ShaJunxing
2021-03-18 15:25 ` Anthony Green
2021-03-19  2:08   ` ShaJunxing
2021-03-19  2:36     ` Kaz Kylheku (libffi)
2021-03-19  3:09       ` ShaJunxing
2021-03-19 10:13   ` Andrew Haley
2021-03-19 11:01     ` Anthony Green
2021-03-19 11:43       ` Andrew Haley
2021-03-20 22:40         ` Anthony Green
2021-03-20 23:56           ` Anthony Green
2021-03-22 10:36             ` Andrew Haley
2021-03-19 11:26     ` Jarkko Hietaniemi
2021-03-19 11:33       ` Anthony Green

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).