From 7fa68005dde6d1468ac7611c513a492292c48992 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 20 Jun 2023 20:47:32 +0200 Subject: amd64: conform to ABI for varargs func calls --- amd64/emit.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'amd64/emit.c') diff --git a/amd64/emit.c b/amd64/emit.c index 7e9bbd3..d3dad9c 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -765,6 +765,15 @@ emitinstr(uchar **pcode, struct function *fn, struct block *blk, int curi, struc gencopy(pcode, cls, blk, curi, dst, ins->l); break; case Ocall: + if (calltab.p[ins->r.i].vararg >= 0) { + struct call *call = &calltab.p[ins->r.i]; + /* variadic functions need the caller to write num of args in sse regs to %al */ + int n = 0; + for (int i = 0; i < call->narg; ++i) + n += call->abiarg[i].reg >= XMM0; + if (!n) DS("\x31\xC0"); /* XOR EAX, EAX */ + else B(0xB0), B(n); /* MOV AL, n */ + } Xcall(pcode, KPTR, ref2oper(ins->l)); break; } -- cgit v1.2.3