public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Ronald Oussoren <oussoren@cistron.nl>
To: Andreas Tobler <toa@pop.agri.ch>
Cc: Dale Johannesen <dalej@apple.com>, gcc@gcc.gnu.org
Subject: Re: Libffi problem on darwin (MacOSX)
Date: Sat, 17 May 2003 10:17:00 -0000	[thread overview]
Message-ID: <465A16CC-882D-11D7-8ACF-0003931CFE24@cistron.nl> (raw)
In-Reply-To: <3EC5CE0D.30607@pop.agri.ch>


On Saturday, May 17, 2003, at 07:52 Europe/Amsterdam, Andreas Tobler 
wrote:

> Dale Johannesen wrote:
>> On Friday, May 16, 2003, at 01:55  PM, Ronald Oussoren wrote:
>>> We're using libffi closures in the Objective-C method tables to 
>>> forward calls from Objective-C to python. This is working fine for 
>>> basic calls, but gives wrong results when structs are passed. It 
>>> looks like a mismatch between the compiler and libffi: 
>>> ffi_closure_helper_DARWIN in libffi_darwin.c seems to assume that 
>>> structs are passed "by reference" (line 615), while the compiler 
>>> passes small structs entirely in registers (see assembly code emited 
>>> by the following C snippet):
>> I'm not familiar with libffi, but I can confirm that the compiler is 
>> doing the
>> right thing, and it's the same thing it's always done.  It looks like 
>> ffi_prep_args
>> and ffi_prep_cif_machdep correctly understand that structs are passed 
>> by value, so
>> this is just a bug in ffi_closure_helper_DARWIN.
>
> Hey great, people are using libffi on darwin-ppc.
And were very glad this is available on darwin-ppc, libffi is a very 
usefull library.

> I guess this is born on my camp. I'll have a look at, as soon as  time 
> allows here.
> It is possible that I didn't finish the libffi regarding structures 
> since I didn't need it for libjava work. So, you could be right.

I just noticed that this might well be stupidity on my part, I tried to 
write a minimal program that demonstrates the problem and that runs 
without problems. Our real code builds ffi_cifs and ffi_closures at 
runtime, and maybe that code is bogus.

Sorry about the inconvenience,
	Ronald

--- example.c ---
#include "ffi.h"
#include <stdio.h>

struct foobar {
	float a;
	int b;
};

void callee(struct foobar a1, int a2)
{
	printf("%g@%d %d\n", a1.a, a1.b, a2);
}

void stub(ffi_cif* cif, void* resp, void** args, void* userdata)
{	
	struct foobar a1;
	int  a2;

	a1 = *(struct foobar*)(args[0]);
	a2 = *(int*)(args[1]);

	callee(a1, a2);
}


int main(void)
{
	ffi_type* foobar_fields[3];
	ffi_type foobar_type;
	ffi_cif cif;
	ffi_closure cl;
	ffi_status rv;
	void* args[4];
	ffi_type* arg_types[3];
	
	struct foobar g = { 1.0, 2.0 };
	int fourtytwo = 42;

	foobar_type.size = 0;
	foobar_type.alignment = 0;
	foobar_type.type = FFI_TYPE_STRUCT;
	foobar_type.elements = foobar_fields;

	foobar_fields[0] = &ffi_type_float;
	foobar_fields[1] = &ffi_type_sint;
	foobar_fields[2] = NULL;

	arg_types[0] = &foobar_type;
	arg_types[1] = &ffi_type_sint;
	arg_types[2] = NULL;

	rv = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_void, arg_types);
	if (rv != FFI_OK) {
		printf("ffi cif: %d\n", rv);
		abort();
	}

	printf ("Direct call:");
	callee(g, fourtytwo);

	printf("FFI call:");
	args[0] = &g;
	args[1] = &fourtytwo;
	args[2] = NULL;
	ffi_call(&cif, FFI_FN(callee), NULL, args);

	printf("FFI closure call:");
	rv = ffi_prep_closure(&cl, &cif, stub, NULL);
	if (rv != FFI_OK) {
		printf("ffi cl: %d\n", rv);
		abort();
	}
	((void(*)(struct foobar, int))(&cl))(g, fourtytwo);



	return 0;
}

  reply	other threads:[~2003-05-17  6:03 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-16 20:56 Ronald Oussoren
2003-05-16 21:42 ` Dale Johannesen
2003-05-17  6:03   ` Andreas Tobler
2003-05-17 10:17     ` Ronald Oussoren [this message]
2003-05-17 15:39       ` Andreas Tobler
2003-05-25 20:49         ` Ronald Oussoren
2003-05-26  5:24           ` Andreas Tobler
2003-05-26 10:01             ` Ronald Oussoren

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=465A16CC-882D-11D7-8ACF-0003931CFE24@cistron.nl \
    --to=oussoren@cistron.nl \
    --cc=dalej@apple.com \
    --cc=gcc@gcc.gnu.org \
    --cc=toa@pop.agri.ch \
    /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).