[Issue 9931] Mac OS X ABI not followed when returning structs for extern (C)
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Apr 27 03:56:18 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9931
Jacob Carlborg <doob at me.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |REOPENED
Resolution|FIXED |
--- Comment #26 from Jacob Carlborg <doob at me.com> 2013-04-27 03:56:14 PDT ---
There's still problem with 64bit. It doesn't segfault now but the values of the
returned struct is completely wrong. Example:
a=-2077579799 b=32767 c=1517257856
The disassembly for the 64bit C version looks like this (all functions in the
same object file) :
main:
Relocation information (__TEXT,__text) 4 entries
address pcrel length extern type scattered symbolnum/value
000000ef True long True BRANCH False _printf
000000c2 True long True BRANCH False _bar
000000ab True long True SIGNED False L_.str
0000005b True long True BRANCH False _foo
Relocation information (__LD,__compact_unwind) 3 entries
address pcrel length extern type scattered symbolnum/value
00000040 False quad False UNSIGND False 1 (__TEXT,__text)
00000020 False quad False UNSIGND False 1 (__TEXT,__text)
00000000 False quad False UNSIGND False 1 (__TEXT,__text)
(__TEXT,__text) section
_foo:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp,%rbp
0000000000000004 movl %edi,0xec(%rbp)
0000000000000007 movl $0x00000001,0xe0(%rbp)
000000000000000e movl $0x00000002,0xe4(%rbp)
0000000000000015 movl $0x00000003,0xe8(%rbp)
000000000000001c movq 0xe0(%rbp),%rax
0000000000000020 movq %rax,0xf0(%rbp)
0000000000000024 movl $0x00000003,0xf8(%rbp)
000000000000002b movl 0xf0(%rbp),%edi
000000000000002e movl 0xf4(%rbp),%ecx
0000000000000031 movl 0xf8(%rbp),%edx
0000000000000034 movl %edx,0xd8(%rbp)
0000000000000037 movl %ecx,0xd4(%rbp)
000000000000003a movl %edi,0xd0(%rbp)
000000000000003d movq 0xd0(%rbp),%rax
0000000000000041 movl 0xd8(%rbp),%edx
0000000000000044 popq %rbp
0000000000000045 ret
0000000000000046 nopw %cs:_foo(%rax,%rax)
_bar:
0000000000000050 pushq %rbp
0000000000000051 movq %rsp,%rbp
0000000000000054 subq $0x30,%rsp
0000000000000058 xorl %edi,%edi
000000000000005a callq _foo
000000000000005f movl %edx,0xe8(%rbp)
0000000000000062 movq %rax,0xe0(%rbp)
0000000000000066 movl 0xe0(%rbp),%edx
0000000000000069 movl 0xe4(%rbp),%edi
000000000000006c movl 0xe8(%rbp),%ecx
000000000000006f movl %ecx,0xf8(%rbp)
0000000000000072 movl %edi,0xf4(%rbp)
0000000000000075 movl %edx,0xf0(%rbp)
0000000000000078 movl 0xf0(%rbp),%ecx
000000000000007b movl 0xf4(%rbp),%edx
000000000000007e movl 0xf8(%rbp),%edi
0000000000000081 movl %edi,0xd8(%rbp)
0000000000000084 movl %edx,0xd4(%rbp)
0000000000000087 movl %ecx,0xd0(%rbp)
000000000000008a movq 0xd0(%rbp),%rax
000000000000008e movl 0xd8(%rbp),%edx
0000000000000091 addq $0x30,%rsp
0000000000000095 popq %rbp
0000000000000096 ret
0000000000000097 nopw _foo(%rax,%rax)
_main:
00000000000000a0 pushq %rbp
00000000000000a1 movq %rsp,%rbp
00000000000000a4 subq $0x40,%rsp
00000000000000a8 leaq L_.str(%rip),%rax
00000000000000af movl $_foo,0xfc(%rbp)
00000000000000b6 movl %edi,0xf8(%rbp)
00000000000000b9 movq %rsi,0xf0(%rbp)
00000000000000bd movq %rax,0xc8(%rbp)
00000000000000c1 callq _bar
00000000000000c6 movl %edx,0xd8(%rbp)
00000000000000c9 movq %rax,0xd0(%rbp)
00000000000000cd movl 0xd0(%rbp),%edx
00000000000000d0 movl 0xd4(%rbp),%edi
00000000000000d3 movl 0xd8(%rbp),%ecx
00000000000000d6 movl %ecx,0xe8(%rbp)
00000000000000d9 movl %edi,0xe4(%rbp)
00000000000000dc movl %edx,0xe0(%rbp)
00000000000000df movl 0xe0(%rbp),%esi
00000000000000e2 movl 0xe4(%rbp),%edx
00000000000000e5 movl 0xe8(%rbp),%ecx
00000000000000e8 movq 0xc8(%rbp),%rdi
00000000000000ec movb $_foo,%al
00000000000000ee callq _printf
00000000000000f3 movl $_foo,%ecx
00000000000000f8 movl %eax,0xc4(%rbp)
00000000000000fb movl %ecx,%eax
00000000000000fd addq $0x40,%rsp
0000000000000101 popq %rbp
0000000000000102 ret
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list