/// \file Debug.cpp /// \brief Implementation of the debug framework // // This file is distributed under the MIT License. See LICENSE.md for details. // // Standard includes #include #include #include #include // LLVM includes #include "llvm/ADT/Twine.h" #include "llvm/IR/Value.h" // Local libraries includes #include "revng/Support/Debug.h" #include "revng/Support/revng.h" namespace cl = llvm::cl; using llvm::Twine; static cl::opt MaxLocationLength("debug-location-max-length", cl::desc("emit file and line number " "for log " "messages of at most this " "size."), cl::cat(MainCategory), cl::init(0)); size_t MaxLoggerNameLength = 0; llvm::ManagedStatic Loggers; std::ostream &dbg(std::cerr); Logger<> PassesLog("passes"); Logger<> ReleaseLog("release"); template void Logger::emit(const LogTerminator &LineInfo) { if (X && Enabled) { std::string Pad; if (MaxLocationLength != 0) { std::string Suffix = (Twine(":") + Twine(LineInfo.Line)).str(); revng_assert(Suffix.size() < MaxLocationLength); std::string Location(LineInfo.File); size_t LastSlash = Location.rfind("/"); if (LastSlash != std::string::npos) Location.erase(0, LastSlash + 1); if (Location.size() > MaxLocationLength - Suffix.size()) { Location.erase(MaxLocationLength - Suffix.size(), std::string::npos); } Pad = std::string(MaxLocationLength - Location.size() - Suffix.size(), ' '); dbg << "[" << Location << Suffix << "] " << Pad; } Pad = std::string(MaxLoggerNameLength - Name.size(), ' '); dbg << "[" << Name.data() << "] " << Pad; for (unsigned I = 0; I < IndentLevel; I++) dbg << " "; dbg << Buffer.str() << "\n"; Buffer.str(""); Buffer.clear(); } } static std::unique_ptr> DebugLogging; static std::unique_ptr DebugLoggingAlias; llvm::ManagedStatic DebugLogOption; template unsigned Logger::IndentLevel; template void Logger::indent(unsigned Level) { if (isEnabled()) IndentLevel += Level; } template void Logger::unindent(unsigned Level) { if (isEnabled()) { revng_assert(IndentLevel - Level >= 0); IndentLevel -= Level; } } template void Logger::setIndentation(unsigned Level) { if (isEnabled()) IndentLevel = Level; } // Force instantiation template class Logger; template class Logger;