X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fcvt_data.c;h=237abef7c11dc2246f334ee353e6f8dfdd7562c8;hb=179b79a987ed0f464f47f724032aff6c90bc50c0;hp=2c5bbbf69a104f0576dd3e3a29ce1c5e6dc29f5b;hpb=23fd0b111f4f6437346e1889099f7a5a7652a9d8;p=ia32rtools.git diff --git a/tools/cvt_data.c b/tools/cvt_data.c index 2c5bbbf..237abef 100644 --- a/tools/cvt_data.c +++ b/tools/cvt_data.c @@ -247,7 +247,8 @@ static const struct parsed_proto *check_var(FILE *fhdr, const char *sym, const char *varname) { const struct parsed_proto *pp, *pp_sym; - char fp_sym[256], fp_var[256]; + char fp_sym[256], fp_var[256], *p; + int i; pp = proto_parse(fhdr, varname, 1); if (pp == NULL) { @@ -277,6 +278,20 @@ static const struct parsed_proto *check_var(FILE *fhdr, } check_sym: + // fptrs must use 32bit args, callsite might have no information and + // lack a cast to smaller types, which results in incorrectly masked + // args passed (callee may assume masked args, it does on ARM) + for (i = 0; i < pp->argc; i++) { + if (pp->arg[i].type.is_ptr) + continue; + p = pp->arg[i].type.name; + if (strstr(p, "int8") || strstr(p, "int16") + || strstr(p, "char") || strstr(p, "short")) + { + awarn("reference to %s with arg%d '%s'\n", pp->name, i + 1, p); + } + } + sprint_pp_short(pp, g_comment, sizeof(g_comment)); if (sym != NULL) {