debug.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Logging and checks. 6// 7// Log messages to stdout. LOG() prints normal user messages, VLOG() 8// is verbose, for tracing and debugging. SetVerbose() enables/disables 9// VLOG() output. 10// 11// LOG() and VLOG() are printf-like, and arguments are checked by gcc. 12// LOG_IF() and VLOG_IF() call LOG/VLOG if their predicate is true. 13// CHECK() aborts if its predicate is false. NOTREACHED() always aborts. 14// Logging is not thread-safe. 15// 16 17#ifndef TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 18#define TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 19 20#ifdef NDEBUG 21#undef NDEBUG 22#include <assert.h> 23#define NDEBUG 24#else 25#include <assert.h> 26#endif 27 28#include <stdarg.h> 29#include <string.h> 30 31namespace relocation_packer { 32 33// If gcc, define PRINTF_ATTRIBUTE so that gcc checks Log() as printf-like. 34#if defined(__GNUC__) && (__GNUC__ >= 3) 35#define PRINTF_ATTRIBUTE(string_index, first_to_check) \ 36 __attribute__((__format__(__printf__, string_index, first_to_check))) 37#else 38#define PRINTF_ATTRIBUTE(string_index, first_to_check) 39#endif 40 41// Logging and checking macros. 42#define LOG(...) ::relocation_packer::Logger::Log(__VA_ARGS__) 43#define VLOG(...) ::relocation_packer::Logger::VLog(__VA_ARGS__) 44#define LOG_IF(cond, ...) \ 45 do { \ 46 if ((cond)) \ 47 LOG(__VA_ARGS__); \ 48 } while (0) 49#define VLOG_IF(cond, ...) \ 50 do { \ 51 if ((cond)) \ 52 VLOG(__VA_ARGS__); \ 53 } while (0) 54 55#define CHECK(expr) assert((expr)) 56#define NOTREACHED(_) assert(false) 57 58class Logger { 59 public: 60 // Log and verbose log to stdout. 61 // |format| is a printf format string. 62 static void Log(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); 63 static void VLog(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); 64 65 // Set verbose mode. 66 // |flag| is true to enable verbose logging, false to disable it. 67 static void SetVerbose(bool flag); 68 69 private: 70 Logger() : is_verbose_(false) { } 71 ~Logger() {} 72 73 // Implementation of log to stdout. 74 // |format| is a printf format string. 75 // |args| is a varargs list of printf arguments. 76 void Log(const char* format, va_list args); 77 78 // If set, VLOG is enabled, otherwise it is a no-op. 79 bool is_verbose_; 80 81 // Singleton support. Not thread-safe. 82 static Logger* GetInstance(); 83 static Logger* instance_; 84}; 85 86} // namespace relocation_packer 87 88#endif // TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ 89