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