int must_save = 0;
int sarg_ofs = 1; // stack offset to args, in DWORDs
int args_repushed = 0;
+ int argc_repush;
int i;
+ argc_repush = pp->argc;
+ if (pp->is_vararg)
+ argc_repush = ARRAY_SIZE(pp->arg); // hopefully enough?
+
for (i = 0; i < pp->argc; i++) {
if (pp->arg[i].reg != NULL)
must_save |= is_x86_reg_saved(pp->arg[i].reg);
return;
}
- if (pp->argc_stack == 0 && !must_save && !pp->is_stdcall) {
+ if (pp->argc_stack == 0 && !must_save && !pp->is_stdcall
+ && !pp->is_vararg)
+ {
// load arg regs
for (i = 0; i < pp->argc; i++) {
fprintf(f, "\tmovl %d(%%esp), %%%s\n",
}
// reconstruct arg stack
- for (i = pp->argc - 1; i >= 0; i--) {
+ for (i = argc_repush - 1; i >= 0; i--) {
if (pp->arg[i].reg == NULL) {
fprintf(f, "\tmovl %d(%%esp), %%eax\n",
(i + sarg_ofs) * 4);
args_repushed++;
}
}
- my_assert(args_repushed, pp->argc_stack);
+ // my_assert(args_repushed, pp->argc_stack);
// load arg regs
for (i = 0; i < pp->argc; i++) {
static void out_fromasm_x86(FILE *f, char *sym, struct parsed_proto *pp)
{
int sarg_ofs = 1; // stack offset to args, in DWORDs
+ int argc_repush;
int stack_args;
int i;
+ argc_repush = pp->argc;
+ stack_args = pp->argc_stack;
+ if (pp->is_vararg) {
+ argc_repush = ARRAY_SIZE(pp->arg); // hopefully enough?
+ stack_args = argc_repush - pp->argc_reg;
+ }
+
fprintf(f, "# %s\n", pp->is_stdcall ? "__stdcall" : "__cdecl");
fprintf(f, ".global %s\n", sym);
fprintf(f, "%s:\n", sym);
sarg_ofs++;
// construct arg stack
- stack_args = pp->argc_stack;
- for (i = pp->argc - 1; i >= 0; i--) {
+ for (i = argc_repush - 1; i >= 0; i--) {
if (pp->arg[i].reg == NULL) {
fprintf(f, "\tmovl %d(%%esp), %%edx\n",
(sarg_ofs + stack_args - 1) * 4);