From f60bb6876b1d48319ac5a4a28c554a17f54c8f5b Mon Sep 17 00:00:00 2001 From: Seonghyun Kim Date: Tue, 8 Aug 2023 09:58:19 +0900 Subject: [PATCH] Support google-perf & dump stack map Signed-off-by: Seonghyun Kim --- build/walrus.cmake | 4 ++++ src/runtime/Module.cpp | 30 ++++++++++++++++++++++++++++++ src/shell/Shell.cpp | 12 ++++++++++++ 3 files changed, 46 insertions(+) diff --git a/build/walrus.cmake b/build/walrus.cmake index 1a0292112..100a616fc 100644 --- a/build/walrus.cmake +++ b/build/walrus.cmake @@ -28,6 +28,10 @@ IF (WALRUS_ASAN) SET (WALRUS_CXXFLAGS ${WALRUS_CXXFLAGS} -fsanitize=address) SET (WALRUS_LDFLAGS ${WALRUS_LDFLAGS} -lasan) ENDIF() +IF (WALRUS_GOOGLE_PERF) + SET (WALRUS_CXXFLAGS ${WALRUS_CXXFLAGS} -DWALRUS_GOOGLE_PERF) + SET (WALRUS_LDFLAGS ${WALRUS_LDFLAGS} -lprofiler -lunwind -llzma) +ENDIF() IF (WALRUS_SMALL_CONFIG) SET (WALRUS_CXXFLAGS ${WALRUS_CXXFLAGS} -Os) ENDIF() diff --git a/src/runtime/Module.cpp b/src/runtime/Module.cpp index 87ff5fddd..8bd839ef2 100644 --- a/src/runtime/Module.cpp +++ b/src/runtime/Module.cpp @@ -362,11 +362,41 @@ Instance* Module::instantiate(ExecutionState& state, const ExternVector& imports } #if !defined(NDEBUG) + +static const char* localTypeName(Value::Type v) +{ + switch (v) { + case Value::I32: + return "i32"; + case Value::I64: + return "i64"; + case Value::F32: + return "f32"; + case Value::F64: + return "f64"; + case Value::V128: + return "v128"; + case Value::FuncRef: + return "FuncRef"; + case Value::ExternRef: + return "ExternRef"; + default: + RELEASE_ASSERT_NOT_REACHED(); + } +} + void ModuleFunction::dumpByteCode() { printf("\n"); printf("required stack size: %u bytes\n", m_requiredStackSize); printf("required stack size due to local: %u bytes\n", m_requiredStackSizeDueToLocal); + printf("stack: ["); + size_t pos = 0; + for (size_t i = 0; i < m_local.size(); i++) { + printf("%zu(local %zu, %s) ", pos, i, localTypeName(m_local[i])); + pos += valueStackAllocatedSize(m_local[i]); + } + printf("%zu(%" PRIu32 " bytes for general operation)]\n", pos, (m_requiredStackSize - m_requiredStackSizeDueToLocal)); printf("bytecode size: %zu bytes\n", m_byteCode.size()); printf("\n"); diff --git a/src/shell/Shell.cpp b/src/shell/Shell.cpp index 87d752be6..94d3d72d9 100644 --- a/src/shell/Shell.cpp +++ b/src/shell/Shell.cpp @@ -4,6 +4,10 @@ #include #include +#if defined(WALRUS_GOOGLE_PERF) +#include +#endif + #include "Walrus.h" #include "runtime/Engine.h" #include "runtime/Store.h" @@ -970,6 +974,10 @@ int main(int argc, char* argv[]) mallopt(M_MMAP_MAX, 1024 * 1024); #endif +#if defined(WALRUS_GOOGLE_PERF) + ProfilerStart("gperf_result"); +#endif + Engine* engine = new Engine(); Store* store = new Store(engine); @@ -1012,5 +1020,9 @@ int main(int argc, char* argv[]) delete store; delete engine; +#if defined(WALRUS_GOOGLE_PERF) + ProfilerStop(); +#endif + return 0; }