From 4da12828829e3b91b03402eb689658fcfc3ce204 Mon Sep 17 00:00:00 2001 From: Saleel Kudchadker Date: Sun, 14 Feb 2021 14:15:34 -0800 Subject: [PATCH] SWDEV-272673 - Add changes to dump log to a file Env var AMD_LOG_LEVEL_FILE would dump the log to file. Change-Id: I6add4a1ae6788f376ce116797cc0573007502e73 [ROCm/clr commit: 0f14c54c04c609344929b64fe423097f9540beb5] --- projects/clr/rocclr/platform/runtime.cpp | 3 +++ projects/clr/rocclr/utils/debug.cpp | 32 ++++++++++++++++-------- projects/clr/rocclr/utils/debug.hpp | 6 ++++- projects/clr/rocclr/utils/flags.cpp | 6 +++++ projects/clr/rocclr/utils/flags.hpp | 4 ++- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/projects/clr/rocclr/platform/runtime.cpp b/projects/clr/rocclr/platform/runtime.cpp index 713948e632..fa7345f4fd 100644 --- a/projects/clr/rocclr/platform/runtime.cpp +++ b/projects/clr/rocclr/platform/runtime.cpp @@ -93,6 +93,9 @@ void Runtime::tearDown() { Device::tearDown(); option::teardown(); Flag::tearDown(); + if (outFile != stderr && outFile != nullptr) { + fclose(outFile); + } initialized_ = false; } diff --git a/projects/clr/rocclr/utils/debug.cpp b/projects/clr/rocclr/utils/debug.cpp index f8f5793910..e533b6ac69 100644 --- a/projects/clr/rocclr/utils/debug.cpp +++ b/projects/clr/rocclr/utils/debug.cpp @@ -36,6 +36,9 @@ namespace amd { +FILE* outFile = stderr; + +// ================================================================================================ //! \cond ignore extern "C" void breakpoint(void) { #ifdef _MSC_VER @@ -44,25 +47,29 @@ extern "C" void breakpoint(void) { } //! \endcond +// ================================================================================================ void report_fatal(const char* file, int line, const char* message) { // FIXME_lmoriche: Obfuscate the message string #if (defined(DEBUG)) - fprintf(stderr, "%s:%d: %s\n", file, line, message); + fprintf(outFile, "%s:%d: %s\n", file, line, message); #else - fprintf(stderr, "%s\n", message); + fprintf(outFile, "%s\n", message); #endif ::abort(); } -void report_warning(const char* message) { fprintf(stderr, "Warning: %s\n", message); } +// ================================================================================================ +void report_warning(const char* message) { fprintf(outFile, "Warning: %s\n", message); } +// ================================================================================================ void log_entry(LogLevel level, const char* file, int line, const char* message) { if (level == LOG_NONE) { return; } - fprintf(stderr, ":%d:%s:%d: %s\n", level, file, line, message); + fprintf(outFile, ":%d:%s:%d: %s\n", level, file, line, message); } +// ================================================================================================ void log_timestamped(LogLevel level, const char* file, int line, const char* message) { static bool gotstart = false; // not thread-safe, but not scary if fails static uint64_t start; @@ -77,13 +84,14 @@ void log_timestamped(LogLevel level, const char* file, int line, const char* mes return; } #if 0 - fprintf(stderr, ":%d:%s:%d: (%010lld) %s\n", level, file, line, time, message); + fprintf(outFile, ":%d:%s:%d: (%010lld) %s\n", level, file, line, time, message); #else // if you prefer fixed-width fields - fprintf(stderr, ":% 2d:%15s:% 5d: (%010lld) us %s\n", level, file, line, time / 1000ULL, + fprintf(outFile, ":% 2d:%15s:% 5d: (%010lld) us %s\n", level, file, line, time / 1000ULL, message); #endif } +// ================================================================================================ void log_printf(LogLevel level, const char* file, int line, const char* format, ...) { va_list ap; @@ -92,10 +100,13 @@ void log_printf(LogLevel level, const char* file, int line, const char* format, vsnprintf(message, sizeof(message), format, ap); va_end(ap); uint64_t timeUs = Os::timeNanos() / 1000ULL; - fprintf(stderr, ":%d:%-25s:%-4d: %010lld us: %s\n", level, file, line, timeUs/1ULL, message); + fprintf(outFile, ":%d:%-25s:%-4d: %010lld us: %s\n", level, file, line, timeUs/1ULL, message); } -void log_printf(LogLevel level, const char* file, int line, uint64_t* start, const char* format, ...) { + +// ================================================================================================ +void log_printf(LogLevel level, const char* file, int line, uint64_t* start, + const char* format, ...) { va_list ap; va_start(ap, format); @@ -104,9 +115,10 @@ void log_printf(LogLevel level, const char* file, int line, uint64_t* start, con va_end(ap); uint64_t timeUs = Os::timeNanos() / 1000ULL; if (start == 0 || *start == 0) { - fprintf(stderr, ":%d:%-25s:%-4d: %010lld us: %s\n", level, file, line, timeUs/1ULL, message); + fprintf(outFile, ":%d:%-25s:%-4d: %010lld us: %s\n", level, file, line, timeUs/1ULL, message); } else { - fprintf(stderr, ":%d:%-25s:%-4d: %010lld us: %s: duration: %lld us\n", level, file, line, timeUs/1ULL, message, (timeUs - *start)/1ULL); + fprintf(outFile, ":%d:%-25s:%-4d: %010lld us: %s: duration: %lld us\n", level, file, line, + timeUs/1ULL, message, (timeUs - *start)/1ULL); } if (*start == 0) { *start = timeUs; diff --git a/projects/clr/rocclr/utils/debug.hpp b/projects/clr/rocclr/utils/debug.hpp index 6bcc68a5be..d23a2a9883 100644 --- a/projects/clr/rocclr/utils/debug.hpp +++ b/projects/clr/rocclr/utils/debug.hpp @@ -23,7 +23,8 @@ #include -#include +#include +#include #include //! \addtogroup Utils #ifdef _WIN32 @@ -58,6 +59,9 @@ enum LogMask { LOG_ALWAYS = 0xFFFFFFFF, //!< Log always even mask flag is zero }; +//! \brief log file output +extern FILE* outFile; + //! \cond ignore extern "C" void breakpoint(); //! \endcond diff --git a/projects/clr/rocclr/utils/flags.cpp b/projects/clr/rocclr/utils/flags.cpp index c57f5025eb..5485262b63 100644 --- a/projects/clr/rocclr/utils/flags.cpp +++ b/projects/clr/rocclr/utils/flags.cpp @@ -145,6 +145,12 @@ bool Flag::init() { flag.setValue(it->second); } } + if (!flagIsDefault(AMD_LOG_LEVEL)) { + if (!flagIsDefault(AMD_LOG_LEVEL_FILE)) { + std::string fileName = AMD_LOG_LEVEL_FILE; + outFile = fopen(fileName.c_str(), "w"); + } + } return true; } diff --git a/projects/clr/rocclr/utils/flags.hpp b/projects/clr/rocclr/utils/flags.hpp index fe1b139f13..9d5e217b99 100644 --- a/projects/clr/rocclr/utils/flags.hpp +++ b/projects/clr/rocclr/utils/flags.hpp @@ -258,7 +258,9 @@ release(bool, PAL_EMBED_KERNEL_MD, false, \ "Enables writing kernel metadata into command buffers.") \ release(cstring, ROC_GLOBAL_CU_MASK, "", \ "Sets a global CU mask (entered as hex value) for all queues," \ - "Each active bit represents using one CU (e.g., 0xf enables only 4 CUs)") + "Each active bit represents using one CU (e.g., 0xf enables only 4 CUs)") \ +release(cstring, AMD_LOG_LEVEL_FILE, "", \ + "Set output file for AMD_LOG_LEVEL, Default is stderr") namespace amd {