From d030198aea96012b635b559fc6021fd954205395 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 22 Nov 2025 19:32:24 +0100 Subject: make sure indirect function call pointer does not end up in clobber reg --- amd64/isel.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'amd64/isel.c') diff --git a/amd64/isel.c b/amd64/isel.c index 6541c10..26ee6e0 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -147,6 +147,11 @@ selcall(struct function *fn, struct instr *ins, struct block *blk, int *curi) ++*curi; insertinstr(blk, *curi+1, (struct instr){Oadd, KPTR, .keep=1, .reg = RSP+1, .l=mkref(RREG,RSP), disp}); } + if (call->vararg >= 0 && ins->l.t == RTMP) { + /* variadic calls write number of sse regs used to AL, so mark it as clobbered such that + * the function pointer of an indirect calls does not get allocated to RAX by regalloc */ + insertinstr(blk, (*curi)++, mkinstr(Omove, KPTR, mkref(RREG, RAX), mkref(RREG, RAX))); + } cls = ins->cls; ins->cls = 0; if (cls) { -- cgit v1.2.3