#ifndef EMULATOR_INCLUDE_EMULATOR_LIBS_LIBS_H_ #define EMULATOR_INCLUDE_EMULATOR_LIBS_LIBS_H_ #include "common/abi.h" #include "common/logging/log.h" #include "common/stringUtils.h" #include "common/threads.h" #include "loader/timer.h" // IWYU pragma: keep // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define PRINT_NAME_ENABLED g_print_name // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define PRINT_NAME_ENABLE(flag) PRINT_NAME_ENABLED = flag; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_DEFINE(name) void name(Loader::SymbolDatabase* s) // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_NAME(l, m) \ [[maybe_unused]] static thread_local bool PRINT_NAME_ENABLED = false; \ static constexpr char g_library[] = l; \ static constexpr char g_module[] = m; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_VERSION(l, lv, m, mv1, mv2) \ LIB_NAME(l, m); \ static constexpr int g_library_version = lv; \ static constexpr int g_module_version_major = mv1; \ static constexpr int g_module_version_minor = mv2; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_ADD(n, f, t) \ { \ Loader::SymbolResolve sr {}; \ sr.name = n; \ sr.library = g_library; \ sr.library_version = g_library_version; \ sr.module = g_module; \ sr.module_version_major = g_module_version_major; \ sr.module_version_minor = g_module_version_minor; \ sr.type = t; \ auto func = reinterpret_cast(f); \ const char* dbg_name = "" #f; \ s->Add(sr, func, dbg_name); \ } // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_OBJECT(n, f) LIB_ADD(n, f, Loader::SymbolType::Object) // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define LIB_FUNC(n, f) LIB_ADD(n, f, Loader::SymbolType::Func) // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define PRINT_NAME() \ if (PRINT_NAME_ENABLED) { \ if (Log::GetDirection() != Log::Direction::Silent) { \ const auto print_name_time = Loader::Timer::GetTime().ToString("HH24:MI:SS.FFF"); \ LOGF_COLOR(Log::Color::Cyan, "[%d][%s] %s::%s::%s()\n", \ Common::Thread::GetThreadIdUnique(), print_name_time.c_str(), g_library, \ g_module, __func__); \ } \ } namespace Loader { class SymbolDatabase; } // namespace Loader namespace Libs { void InitAll(Loader::SymbolDatabase* s); } // namespace Libs #endif /* EMULATOR_INCLUDE_EMULATOR_LIBS_LIBS_H_ */