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 31 namespace 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 58 class 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