[MLton] MLton broken FFI on AMD64???
Wesley W. Terpstra
wesley at terpstra.ca
Fri Feb 4 00:57:26 PST 2011
On Fri, Feb 4, 2011 at 9:32 AM, Wesley W. Terpstra <wesley at terpstra.ca>wrote:
> However, the segfault persists. If you replace "printf" with "test":
> void test(const char* s, int x) {
> printf(s, x);
> }
> ... it works.
>
I've confirmed that MLton produces identical code except replacing 'printf'
with 'test'. I tried a similar test with gcc. For some reason gcc clears eax
before a call to printf but not a call to 'printm'. Perhaps this is related
to varargs?
#include <stdio.h>
int printm(const char* x, int k);
int beh() {
printm("dog %d\n", 44);
printf("dog %d\n", 44);
return 1;
}
beh:
.LFB13:
subq $8, %rsp
.LCFI0:
movl $44, %esi
movl $.LC0, %edi
call printm
movl $44, %esi
movl $.LC0, %edi
xorl %eax, %eax <<<<<<<<<<<<<<<< WTF?
call printf
movl $1, %eax
addq $8, %rsp
ret
Adding an 'xorl %eax,%eax' directly before the call to printf in the MLton
generated assembler makes the problem disappear.
L_114:
addq $0xFFFFFFFFFFFFFFD8,%rbp
movq (c_stackP+0x0)(%rip),%rsp
movl $0x7B,%r15d
movl %r15d,%esi
movq (globalObjptr+0x80)(%rip),%rdi
addq $0x28,%rbp
leaq (L_115+0x0)(%rip),%r15
movq %r15,0xFFFFFFFFFFFFFFF8(%rbp)
movq %rbp,(gcState+0x10)(%rip)
movq %r12,(gcState+0x0)(%rip)
xorl %eax,%eax
call printf
movq (gcState+0x0)(%rip),%r12
movq (gcState+0x10)(%rip),%rbp
jmp L_115
I then did some digging and found this choice quote in the "System V
Application Binary Interface AMD64 Architecture Processor Supplement Draft
Version 0.99.5":
" When a function taking variable-arguments is called, %rax must be set
to the
total number of floating point parameters passed to the function in vector
registers"
... either we need to add another tag to imports like:
_import "printf" stdarg : ... ;
... or we should just always set rax for every FFI call on AMD64?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mlton.org/pipermail/mlton/attachments/20110204/4a37e6d6/attachment.html
More information about the MLton
mailing list