- if (*p != '(') {
- printf("%s:%d:%ld: '(' expected, got '%c'\n",
- hdrfn, pline, (p - protostr) + 1, *p);
- return 1;
- }
- p++;
-
- fprintf(fout, ".global _asm_%s\n", sym);
- fprintf(fout, "_asm_%s:\n", sym);
-
- xarg = 1;
- while (1) {
- p = sskip(p);
- if (*p == ')')
- break;
- if (*p == ',')
- p = sskip(p + 1);
-
- ret = check_type(p);
- if (ret <= 0) {
- printf("%s:%d:%ld: unhandled type for arg%d\n",
- hdrfn, pline, (p - protostr) + 1, xarg);
- return 1;
- }
- p += ret;
- p = sskip(p);
-
- p = next_idt(buf, sizeof(buf), p);
- p = sskip(p);
- if (buf[0] == 0) {
- printf("%s:%d:%ld: idt missing for arg%d\n",
- hdrfn, pline, (p - protostr) + 1, xarg);
- return 1;
- }
-
- have_regparm = 0;
- ret = get_regparm(regparm, sizeof(regparm), p);
- if (ret > 0) {
- p += ret;
- p = sskip(p);
-
- have_regparm = 1;
- fprintf(fout, "\t movl %d(%%esp), %%%s\n",
- xarg * 4, regparm);
- }
- if (xarg == 1)
- first_regparm = have_regparm;
- else if (have_regparm != first_regparm) {
- printf("%s:%d:%ld: mixed regparm is unhandled\n",
- hdrfn, pline, (p - protostr) + 1);
- return 1;
- }
- }