/// \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/IR/Value.h" // Local includes #include "debug.h" #ifndef NDEBUG namespace llvm { void Value::assertModuleIsMaterialized() const { } } #endif static size_t MaxLoggerNameLength = 0; LogTerminator DoLog; llvm::ManagedStatic Loggers; bool DebuggingEnabled = false; std::ostream &dbg(std::cerr); static std::vector DebugFeatures; bool isDebugFeatureEnabled(std::string Name) { return std::find(DebugFeatures.begin(), DebugFeatures.end(), Name) != DebugFeatures.end(); } void enableDebugFeature(std::string Name) { if (!isDebugFeatureEnabled(Name)) DebugFeatures.push_back(Name); Loggers->enable(Name); if (Name.size() > MaxLoggerNameLength) MaxLoggerNameLength = Name.size(); } void disableDebugFeature(std::string Name) { auto It = std::find(DebugFeatures.begin(), DebugFeatures.end(), Name); if (It != DebugFeatures.end()) DebugFeatures.erase(It); Loggers->disable(Name); } template void Logger::emit() { if (X && Enabled) { std::string 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(); } } template unsigned Logger::IndentLevel; // Force instantiation template class Logger; template class Logger;