X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fcvt_data.c;h=692fa1076ac351b0af52e5816009a4d31d8538f4;hb=7a7487bee79c16312270eb30275b095c92324348;hp=09e7ebc54d7b688899cb86c00ff7847c6b5d7e32;hpb=206c0727041648e9545d16b25e591880f2c58f79;p=ia32rtools.git diff --git a/tools/cvt_data.c b/tools/cvt_data.c index 09e7ebc..692fa10 100644 --- a/tools/cvt_data.c +++ b/tools/cvt_data.c @@ -10,15 +10,13 @@ #include #include #include +#include +#include #include "my_assert.h" #include "my_str.h" #include "common.h" -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) -#define IS(w, y) !strcmp(w, y) -#define IS_START(w, y) !strncmp(w, y, strlen(y)) - #include "protoparse.h" static const char *asmfn; @@ -307,10 +305,17 @@ check_sym: } if (pp_cmp_func(pp, pp_sym)) { - pp_print(fp_sym, sizeof(fp_sym), pp_sym); - anote("var: %s\n", fp_var); - anote("sym: %s\n", fp_sym); - awarn("^ mismatch\n"); + if (pp_sym->argc_stack == 0 && pp_sym->is_fastcall + && pp->argc_stack == 0 + && (pp->is_fastcall || pp->argc_reg == 0) + && pp_sym->argc_reg > pp->argc_reg) + ; /* fascall compatible func doesn't use all args -> ok */ + else { + pp_print(fp_sym, sizeof(fp_sym), pp_sym); + anote("var: %s\n", fp_var); + anote("sym: %s\n", fp_sym); + awarn("^ mismatch\n"); + } } return pp; @@ -388,6 +393,7 @@ int main(int argc, char *argv[]) char last_sym[32]; unsigned long val; unsigned long cnt; + uint64_t val64; const char *sym; enum dx_type type; char **pub_syms; @@ -562,11 +568,16 @@ int main(int argc, char *argv[]) if (header_mode) continue; - val = parse_number(words[1]); + val = parse_number(words[1], 0); fprintf(fout, "\t\t .align %d", align_value(val)); goto fin; } + if (IS(words[0], "public")) { + // skip, sym should appear in header anyway + continue; + } + w = 1; type = parse_dx_directive(words[0]); if (type == DXT_UNSPEC) { @@ -690,7 +701,7 @@ int main(int argc, char *argv[]) fprintf(fout, "%s", escape_string(word)); } else { - val = parse_number(words[w]); + val = parse_number(words[w], 0); if (val & ~0xff) aerr("bad string trailing byte?\n"); // unfortunately \xHH is unusable - gas interprets @@ -704,7 +715,7 @@ int main(int argc, char *argv[]) if (w == wordc - 2) { if (IS_START(words[w + 1], "dup(")) { - cnt = parse_number(words[w]); + cnt = parse_number(words[w], 0); p = words[w + 1] + 4; p2 = strchr(p, ')'); if (p2 == NULL) @@ -714,7 +725,7 @@ int main(int argc, char *argv[]) val = 0; if (!IS(word, "?")) - val = parse_number(word); + val = parse_number(word, 0); fprintf(fout, ".fill 0x%02lx,%d,0x%02lx", cnt, type_size(type), val); @@ -800,11 +811,11 @@ int main(int argc, char *argv[]) } } else { - val = parse_number(words[w]); - if (val < 10) - fprintf(fout, "%ld", val); + val64 = parse_number(words[w], 1); + if (val64 < 10) + fprintf(fout, "%d", (int)val64); else - fprintf(fout, "0x%lx", val); + fprintf(fout, "0x%" PRIx64, val64); } first = 0;