Bus error interfacing with C function returning large struct
John Colvin
john.loughran.colvin at gmail.com
Wed Apr 17 02:49:43 PDT 2013
On Tuesday, 16 April 2013 at 23:03:44 UTC, John Colvin wrote:
> On Tuesday, 16 April 2013 at 19:26:09 UTC, Jacob Carlborg wrote:
>> The following code will result in a bus error on Mac OS X
>> 10.8.2 using DMD 2.062 compiled for 32bit (segfault on 64bit).
>> A couple of notes:
>>
>> * This code runs fine on Mac OS X 10.6.3
>> * It seems the struct has to be over 64 bits in size
>> * "foo" need to take an argument
>>
>> Dissassembly at the bottom.
>>
>> I think this is the same problem I had with interfacing with
>> the objc_msgSend_stret function, see other post:
>>
>> http://forum.dlang.org/thread/kkefk8$2663$1@digitalmars.com
>>
>> C code:
>>
>> struct Foo
>> {
>> int a;
>> int b;
>> int c;
>> };
>>
>> typedef struct Foo Foo;
>>
>> Foo foo (int a)
>> {
>> Foo f;
>> f.a = 1;
>> f.b = 2;
>> f.c = 3;
>> return f;
>> }
>>
>> D code:
>>
>> struct Foo
>> {
>> int a;
>> int b;
>> int c;
>> }
>>
>> extern (C) Foo foo (int a);
>>
>> Foo bar ()
>> {
>> return foo(0);
>> }
>>
>> extern (C) int printf(in char*, ...);
>>
>> void main ()
>> {
>> auto frame = bar();
>> printf("a=%d b=%d c=%d\n".ptr, frame.a, frame.b, frame.c);
>> }
>>
>> GDB session with dissassembly:
>>
>> http://pastebin.com/rguwXucR
>>
>> Dissassembly of the corresponding C program compiled with
>> Clang:
>>
>> http://pastebin.com/MG8Tnkzp
>>
>> Dissassembly of "foo" on Mac OS X 10.8.2 using Clang 4.1:
>>
>> http://pastebin.com/0jKqksxx
>>
>> Dissassembly of "foo" on Mac OS X 10.6.3 using Clang 1.5:
>>
>> http://pastebin.com/kbdfuVcB
>
> Some observations:
>
> Assuming main is doing everything properly, it's passing a
> pointer to 12 bytes of stack space to bar in eax (as per the D
> ABI). bar then puts that pointer on the stack for foo (as per
> the IA32 OS X ABI). However, it looks to me like it's in the
> wrong place, because of this line:
> 0x00002673 <D4test3barFZS4test3Foo+11>: sub $0x8,%esp
>
> This is just from a quick glance, I may have added my hexes
> wrongly.
I was wrong. Ignore the previous post.
More information about the Digitalmars-d
mailing list