// debug.h -- gold internal debugging support -*- C++ -*-
-// Copyright 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007-2019 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
#ifndef GOLD_DEBUG_H
#define GOLD_DEBUG_H
+#include <cstring>
+
#include "parameters.h"
#include "errors.h"
// The different types of debugging we support. These are bitflags.
-const int DEBUG_TASK = 1;
+const int DEBUG_TASK = 0x1;
+const int DEBUG_SCRIPT = 0x2;
+const int DEBUG_FILES = 0x4;
+const int DEBUG_RELAXATION = 0x8;
+const int DEBUG_INCREMENTAL = 0x10;
+const int DEBUG_LOCATION = 0x20;
+const int DEBUG_TARGET = 0x40;
+const int DEBUG_PLUGIN = 0x80;
+
+const int DEBUG_ALL = (DEBUG_TASK | DEBUG_SCRIPT | DEBUG_FILES
+ | DEBUG_RELAXATION | DEBUG_INCREMENTAL
+ | DEBUG_LOCATION | DEBUG_TARGET | DEBUG_PLUGIN);
+
+// Convert a debug string to the appropriate enum.
+inline int
+debug_string_to_enum(const char* arg)
+{
+ static const struct { const char* name; int value; }
+ debug_options[] =
+ {
+ { "task", DEBUG_TASK },
+ { "script", DEBUG_SCRIPT },
+ { "files", DEBUG_FILES },
+ { "relaxation", DEBUG_RELAXATION },
+ { "incremental", DEBUG_INCREMENTAL },
+ { "location", DEBUG_LOCATION },
+ { "target", DEBUG_TARGET },
+ { "plugin", DEBUG_PLUGIN },
+ { "all", DEBUG_ALL }
+ };
-const int DEBUG_ALL = DEBUG_TASK;
+ int retval = 0;
+ for (size_t i = 0; i < sizeof(debug_options) / sizeof(*debug_options); ++i)
+ if (strstr(arg, debug_options[i].name))
+ retval |= debug_options[i].value;
+ return retval;
+}
// Print a debug message if TYPE is enabled. This is a macro so that
// we only evaluate the arguments if necessary.
-#define gold_debug(TYPE, FORMAT, ...) \
+#define gold_debug(TYPE, ...) \
do \
{ \
if (is_debugging_enabled(TYPE)) \
- parameters->errors()->debug(FORMAT, __VA_ARGS__); \
+ parameters->errors()->debug(__VA_ARGS__); \
} \
while (0)