diff --git a/CMakeLists.txt b/CMakeLists.txt index cfbc8a6..741927c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ if(EMSCRIPTEN) elseif(WASIENV) if(BUILD_WASI_SUPPORT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasMetaWASI") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasMetaWASI -Dd_m3HasTracer") endif() set(CMAKE_C_FLAGS_RELEASE "-O3 -Wfatal-errors -fomit-frame-pointer -fno-stack-check -fno-stack-protector") @@ -127,7 +127,7 @@ elseif(WIN32) else() if(BUILD_WASI_SUPPORT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI") #-Dd_m3FixedHeap=1048576 + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI -Dd_m3HasTracer") #-Dd_m3FixedHeap=1048576 endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wparentheses -Wundef -Wpointer-arith -Wstrict-aliasing=2") diff --git a/platforms/app/main.c b/platforms/app/main.c index 1ec6fa6..3cae784 100644 --- a/platforms/app/main.c +++ b/platforms/app/main.c @@ -13,6 +13,7 @@ #include "wasm3.h" #include "m3_api_wasi.h" #include "m3_api_libc.h" +#include "m3_api_tracer.h" #include "m3_env.h" #define FATAL(msg, ...) { printf("Error: [Fatal] " msg "\n", ##__VA_ARGS__); goto _onfatal; } @@ -265,6 +266,11 @@ int main (int i_argc, const char* i_argv[]) if (result) FATAL("m3_LinkWASI: %s", result); #endif +#if defined(d_m3HasTracer) + result = m3_LinkTracer (runtime->modules); + if (result) FATAL("m3_LinkTracer: %s", result); +#endif + result = m3_LinkLibC (runtime->modules); if (result) FATAL("m3_LinkLibC: %s", result); diff --git a/source/m3_api_tracer.c b/source/m3_api_tracer.c index 7edf7bc..dabd36f 100644 --- a/source/m3_api_tracer.c +++ b/source/m3_api_tracer.c @@ -14,7 +14,7 @@ #if defined(d_m3HasTracer) -static FILE* trace; +static FILE* trace = NULL; m3ApiRawFunction(m3_env_log_execution) { @@ -114,10 +114,15 @@ d_m3TraceLocal(set_f64, "set f64", double, "%lf") static M3Result SuppressLookupFailure(M3Result i_result) { - if (i_result == m3Err_functionLookupFailed) - return m3Err_none; - else - return i_result; + if (i_result == m3Err_none) { + // If any trace function is found in the module, open the trace file + if (!trace) { + trace = fopen ("wasm3_trace.csv","w"); + } + } else if (i_result == m3Err_functionLookupFailed) { + i_result = m3Err_none; + } + return i_result; } @@ -127,8 +132,6 @@ M3Result m3_LinkTracer (IM3Module module) const char* env = "env"; - trace = fopen ("wasm3_trace.csv","w"); - _ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "log_execution", "v(i)", &m3_env_log_execution))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, env, "log_exec_enter", "v(ii)", &m3_env_log_exec_enter)));