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.

Reply via email to