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