X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fcvt_data.c;h=7c99a9172841b8010105f255368cd2032df2f8d8;hb=HEAD;hp=a00c081bd1cc3366c855ad9743f41525930d9b35;hpb=c1fbaecc86ab7ee1bd0fa42ea5a30f063130a9fd;p=ia32rtools.git diff --git a/tools/cvt_data.c b/tools/cvt_data.c index a00c081..7c99a91 100644 --- a/tools/cvt_data.c +++ b/tools/cvt_data.c @@ -1,6 +1,6 @@ /* * ia32rtools - * (C) notaz, 2013,2014 + * (C) notaz, 2013-2015 * * This work is licensed under the terms of 3-clause BSD license. * See COPYING file in the top-level directory. @@ -239,7 +239,7 @@ static void sprint_pp_short(const struct parsed_proto *pp, char *buf, } static const struct parsed_proto *check_var(FILE *fhdr, - const char *sym, const char *varname) + const char *sym, const char *varname, int is_export) { const struct parsed_proto *pp, *pp_sym; char fp_sym[256], fp_var[256], *p; @@ -252,6 +252,8 @@ static const struct parsed_proto *check_var(FILE *fhdr, return NULL; } + if (is_export) + return NULL; if (!pp->is_func && !pp->is_fptr) return NULL; @@ -304,10 +306,10 @@ check_sym: return pp; } - if (pp_cmp_func(pp, pp_sym)) { + if (!pp_compatible_func(pp_sym, pp)) { pp_print(fp_sym, sizeof(fp_sym), pp_sym); - anote("var: %s\n", fp_var); - anote("sym: %s\n", fp_sym); + anote("entry: %s\n", fp_var); + anote("label: %s\n", fp_sym); awarn("^ mismatch\n"); } @@ -379,6 +381,11 @@ int main(int argc, char *argv[]) FILE *fout, *fasm, *fhdr = NULL, *frlist; const struct parsed_proto *pp; int no_decorations = 0; + int header_mode = 0; + int maybe_func_table; + int in_export_table; + int rm_labels_lines; + int is_zero_val; char comment_char = '#'; char words[20][256]; char word[256]; @@ -395,7 +402,6 @@ int main(int argc, char *argv[]) char **rlist; int rlist_cnt = 0; int rlist_alloc; - int header_mode = 0; int is_ro = 0; int is_label; int is_bss; @@ -460,7 +466,7 @@ int main(int argc, char *argv[]) while (my_fgets(line, sizeof(line), frlist)) { p = sskip(line); - if (*p == 0 || *p == ';') + if (*p == 0 || *p == ';' || *p == '#') continue; p = next_word(words[0], sizeof(words[0]), p); @@ -485,9 +491,13 @@ int main(int argc, char *argv[]) qsort(unwanted_syms, ARRAY_SIZE(unwanted_syms), sizeof(unwanted_syms[0]), cmpstringp); - last_sym[0] = 0; - while (1) { + last_sym[0] = 0; + g_func_sym_pp = NULL; + maybe_func_table = 0; + in_export_table = 0; + rm_labels_lines = 0; + next_section(fasm, line); if (feof(fasm)) break; @@ -512,6 +522,7 @@ int main(int argc, char *argv[]) while (my_fgets(line, sizeof(line), fasm)) { + is_zero_val = 0; sym = NULL; asmln++; @@ -526,6 +537,10 @@ int main(int argc, char *argv[]) if (i != 0 && !header_mode) fprintf(fout, "\t\t .skip 0x%x\n", i); } + else if (IS_START(p, "; Export Address")) + in_export_table = 1; + else if (IS_START(p, "; Export")) + in_export_table = 0; continue; } @@ -542,8 +557,10 @@ int main(int argc, char *argv[]) if (*p == ';') { p = sskip(p + 1); - if (IS_START(p, "sctclrtype")) + if (IS_START(p, "sctclrtype")) { + maybe_func_table = 0; g_func_sym_pp = NULL; + } } if (wordc == 2 && IS(words[1], "ends")) @@ -618,6 +635,12 @@ int main(int argc, char *argv[]) } snprintf(last_sym, sizeof(last_sym), "%s", sym); + maybe_func_table = type == DXT_DWORD; + + if (IS_START(sym, "__IMPORT_DESCRIPTOR_")) { + rm_labels_lines = 5; + maybe_func_table = 0; + } pp = proto_parse(fhdr, sym, 1); if (pp != NULL) { @@ -783,6 +806,7 @@ int main(int argc, char *argv[]) p = words[w]; if (IS_START(p, "loc_") || IS_START(p, "__imp") || strchr(p, '?') || strchr(p, '@') + || rm_labels_lines > 0 || bsearch(&p, rlist, rlist_cnt, sizeof(rlist[0]), cmpstringp)) { @@ -790,7 +814,9 @@ int main(int argc, char *argv[]) snprintf(g_comment, sizeof(g_comment), "%s", p); } else { - pp = check_var(fhdr, sym, p); + const char *f_sym = maybe_func_table ? last_sym : NULL; + + pp = check_var(fhdr, f_sym, p, in_export_table); if (pp == NULL) { fprintf(fout, "%s%s", (no_decorations || p[0] == '_') ? "" : "_", p); @@ -809,12 +835,20 @@ int main(int argc, char *argv[]) fprintf(fout, "%d", (int)val64); else fprintf(fout, "0x%" PRIx64, val64); + + is_zero_val = val64 == 0; } first = 0; } fin: + if (!is_zero_val) + maybe_func_table = 0; + + if (rm_labels_lines > 0) + rm_labels_lines--; + if (g_comment[0] != 0) { fprintf(fout, "\t\t%c %s", comment_char, g_comment); g_comment[0] = 0;