Index: tools/relocation_packer/src/debug.h |
diff --git a/tools/relocation_packer/src/debug.h b/tools/relocation_packer/src/debug.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47ee96ae4d9531e7cd2a94a47fdf11d7e02903c7 |
--- /dev/null |
+++ b/tools/relocation_packer/src/debug.h |
@@ -0,0 +1,88 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Logging and checks. |
+// |
+// Log messages to stdout. LOG() prints normal user messages, VLOG() |
+// is verbose, for tracing and debugging. SetVerbose() enables/disables |
+// VLOG() output. |
+// |
+// LOG() and VLOG() are printf-like, and arguments are checked by gcc. |
+// LOG_IF() and VLOG_IF() call LOG/VLOG if their predicate is true. |
+// CHECK() aborts if its predicate is false. NOTREACHED() always aborts. |
+// Logging is not thread-safe. |
+// |
+ |
+#ifndef TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ |
+#define TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ |
+ |
+#ifdef NDEBUG |
+#undef NDEBUG |
+#include <assert.h> |
+#define NDEBUG |
+#else |
+#include <assert.h> |
+#endif |
+ |
+#include <stdarg.h> |
+#include <string.h> |
+ |
+namespace relocation_packer { |
+ |
+// If gcc, define PRINTF_ATTRIBUTE so that gcc checks Log() as printf-like. |
+#if defined(__GNUC__) && (__GNUC__ >= 3) |
+#define PRINTF_ATTRIBUTE(string_index, first_to_check) \ |
+ __attribute__((__format__(__printf__, string_index, first_to_check))) |
+#else |
+#define PRINTF_ATTRIBUTE(string_index, first_to_check) |
+#endif |
+ |
+// Logging and checking macros. |
+#define LOG(...) ::relocation_packer::Logger::Log(__VA_ARGS__) |
+#define VLOG(...) ::relocation_packer::Logger::VLog(__VA_ARGS__) |
+#define LOG_IF(cond, ...) \ |
+ do { \ |
+ if ((cond)) \ |
+ LOG(__VA_ARGS__); \ |
+ } while (0) |
+#define VLOG_IF(cond, ...) \ |
+ do { \ |
+ if ((cond)) \ |
+ VLOG(__VA_ARGS__); \ |
+ } while (0) |
+ |
+#define CHECK(expr) assert((expr)) |
+#define NOTREACHED(_) assert(false) |
+ |
+class Logger { |
+ public: |
+ // Log and verbose log to stdout. |
+ // |format| is a printf format string. |
+ static void Log(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); |
+ static void VLog(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); |
+ |
+ // Set verbose mode. |
+ // |flag| is true to enable verbose logging, false to disable it. |
+ static void SetVerbose(bool flag); |
+ |
+ private: |
+ Logger() : is_verbose_(false) { } |
+ ~Logger() {} |
+ |
+ // Implementation of log to stdout. |
+ // |format| is a printf format string. |
+ // |args| is a varargs list of printf arguments. |
+ void Log(const char* format, va_list args); |
+ |
+ // If set, VLOG is enabled, otherwise it is a no-op. |
+ bool is_verbose_; |
+ |
+ // Singleton support. Not thread-safe. |
+ static Logger* GetInstance(); |
+ static Logger* instance_; |
+}; |
+ |
+} // namespace relocation_packer |
+ |
+#endif // TOOLS_RELOCATION_PACKER_SRC_DEBUG_H_ |