1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Logging and checks. Avoids a dependency on base. 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// LOG(tag) prints messages. Tags are INFO, WARNING, ERROR and FATAL. 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// INFO prints to stdout, the others to stderr. FATAL aborts after printing. 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// LOG_IF(tag, predicate) logs if predicate evaluates to true, else silent. 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// VLOG(level) logs INFO messages where level is less than or equal to the 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// verbosity level set with SetVerbose(). 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// VLOG_IF(level, predicate) logs INFO if predicate evaluates to true, 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// else silent. 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// CHECK(predicate) logs a FATAL error if predicate is false. 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// NOTREACHED() always aborts. 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Log streams can be changed with SetStreams(). Logging is not thread-safe. 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <limits.h> 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <ostream> 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <sstream> 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace relocation_packer { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class Logger { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum Severity {INFO = 0, WARNING, ERROR, FATAL}; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Construct a new message logger. Prints if level is less than or 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // equal to the level set with SetVerbose() and predicate is true. 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |severity| is an enumerated severity. 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |level| is the verbosity level. 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |predicate| controls if the logger prints or is silent. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Logger(Severity severity, int level, bool predicate); 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // On destruction, flush and print the strings accumulated in stream_. 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~Logger(); 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Return the stream for this logger. 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::ostream& GetStream() { return stream_; } 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set verbosity level. Messages with a level less than or equal to 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // this level are printed, others are discarded. Static, not thread-safe. 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void SetVerbose(int level) { max_level_ = level; } 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set info and error logging streams. Static, not thread-safe. 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void SetStreams(std::ostream* info_stream, 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::ostream* error_stream) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch info_stream_ = info_stream; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch error_stream_ = error_stream; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Reset to initial state. 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void Reset(); 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Message severity, verbosity level, and predicate. 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Severity severity_; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int level_; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool predicate_; 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // String stream, accumulates message text. 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::ostringstream stream_; 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Verbosity for INFO messages. Not thread-safe. 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static int max_level_; 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Logging streams. Not thread-safe. 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static std::ostream* info_stream_; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static std::ostream* error_stream_; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace relocation_packer 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Make logging severities visible globally. 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtypedef relocation_packer::Logger::Severity LogSeverity; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst LogSeverity INFO = relocation_packer::Logger::INFO; 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst LogSeverity WARNING = relocation_packer::Logger::WARNING; 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst LogSeverity ERROR = relocation_packer::Logger::ERROR; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst LogSeverity FATAL = relocation_packer::Logger::FATAL; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// LOG(severity) prints a message with the given severity, and aborts if 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// severity is FATAL. LOG_IF(severity, predicate) does the same but only if 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// predicate is true. INT_MIN is guaranteed to be less than or equal to 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// any verbosity level. 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define LOG(severity) \ 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (relocation_packer::Logger(severity, INT_MIN, true).GetStream()) 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define LOG_IF(severity, predicate) \ 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (relocation_packer::Logger(severity, INT_MIN, (predicate)).GetStream()) 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// VLOG(level) prints its message as INFO if level is less than or equal to 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the current verbosity level. 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define VLOG(level) \ 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (relocation_packer::Logger(INFO, (level), true).GetStream()) 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define VLOG_IF(level, predicate) \ 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (relocation_packer::Logger(INFO, (level), (predicate)).GetStream()) 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// CHECK(predicate) fails with a FATAL log message if predicate is false. 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHECK(predicate) (LOG_IF(FATAL, !(predicate)) \ 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << __FILE__ << ":" << __LINE__ << ": " \ 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << __FUNCTION__ << ": CHECK '" #predicate "' failed") 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// NOTREACHED() always fails with a FATAL log message. 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define NOTREACHED(_) (LOG(FATAL) \ 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << __FILE__ << ":" << __LINE__ << ": " \ 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << __FUNCTION__ << ": NOTREACHED() hit") 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 116