Implement "strace" mode

extensions
Volodymyr Shymanskyy 4 years ago
parent e9b8cfd70b
commit 64c8523db5

@ -68,6 +68,10 @@
# define d_m3EnableOpTracing 0 // only works with DEBUG
# endif
# ifndef d_m3EnableStrace
# define d_m3EnableStrace 0 // trace exported function calls
# endif
// logging --------------------------------------------------------------------

@ -119,8 +119,49 @@ d_m3OpDef (CallRawFunction)
M3RawCall call = (M3RawCall) (* _pc++);
IM3Function function = immediate (IM3Function);
void * userdata = immediate (void *);
u64* const sp = ((u64*)_sp);
#if d_m3EnableStrace
IM3FuncType ftype = function->funcType;
FILE* out = stderr;
char outbuff[1024];
char* outp = outbuff;
char* oute = outbuff+1024;
outp += snprintf(outp, oute-outp, "%s.%s(", function->import.moduleUtf8, function->import.fieldUtf8);
const int nArgs = ftype->numArgs;
const int nRets = ftype->numRets;
for (int i=0; i<nArgs; i++) {
const int type = ftype->types[nRets + i];
switch (type) {
case c_m3Type_i32: outp += snprintf(outp, oute-outp, "%i", *(i32*)(sp+i)); break;
case c_m3Type_i64: outp += snprintf(outp, oute-outp, "%lli", *(i64*)(sp+i)); break;
case c_m3Type_f32: outp += snprintf(outp, oute-outp, "%f", *(f32*)(sp+i)); break;
case c_m3Type_f64: outp += snprintf(outp, oute-outp, "%lf", *(f64*)(sp+i)); break;
default: outp += snprintf(outp, oute-outp, "<unknown type %d>", type); break;
}
outp += snprintf(outp, oute-outp, (i < nArgs-1) ? ", " : ")");
}
#endif
m3ret_t possible_trap = call (m3MemRuntime(_mem), sp, m3MemData(_mem), userdata);
#if d_m3EnableStrace
if (possible_trap) {
fprintf(out, "%s -> %s\n", outbuff, possible_trap);
} else {
switch (GetSingleRetType(ftype)) {
case c_m3Type_none: fprintf(out, "%s\n", outbuff); break;
case c_m3Type_i32: fprintf(out, "%s = %i\n", outbuff, *(i32*)sp); break;
case c_m3Type_i64: fprintf(out, "%s = %lli\n", outbuff, *(i64*)sp); break;
case c_m3Type_f32: fprintf(out, "%s = %f\n", outbuff, *(f32*)sp); break;
case c_m3Type_f64: fprintf(out, "%s = %lf\n", outbuff, *(f64*)sp); break;
}
}
#endif
m3ret_t possible_trap = call (m3MemRuntime(_mem), (u64 *)_sp, m3MemData(_mem), userdata);
return possible_trap;
}

Loading…
Cancel
Save