binutils-gdb/gold/debug.h
Cary Coutant 291158a341 Add --debug=plugin option to record plugin actions.
With --debug=plugin, gold will log all plugin actions to a log file,
and make copies of plugin-supplied replacement files in a temporary
directory created under the current working directory.

gold/
	* debug.h (DEBUG_PLUGIN): New constant.
	(DEBUG_ALL): Add DEBUG_PLUGIN.
	(debug_string_to_enum): Likewise.
	* plugin.cc (make_sized_plugin_object): Add filename parameter.
	(Plugin_recorder): New class.
	(Plugin_manager::~Plugin_manager): Delete recorder_.
	(Plugin_manager::load_plugins): Create and initialize recorder_.
	(Plugin_manager::claim_file): Record claimed and unclaimed files.
	(Plugin_manager::make_plugin_object): Use object name as name for
	plugin object, if available.
	(Plugin_manager::add_input_file): Record replacement files.
	(Sized_pluginobj::do_add_symbols): Record plugin symbols.
	(Plugin_finish::run): Call Plugin_recorder::finish().
	(make_sized_plugin_object): Add filename parameter and pass to
	Sized_pluginobj constructor.
	* plugin.h (Plugin::filename): New method.
	(Plugin::recorder): New method.
	(Plugin::recorder_): New data member.
2018-03-23 10:05:38 -07:00

88 lines
2.5 KiB
C++

// debug.h -- gold internal debugging support -*- C++ -*-
// Copyright (C) 2007-2018 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.
#ifndef GOLD_DEBUG_H
#define GOLD_DEBUG_H
#include <cstring>
#include "parameters.h"
#include "errors.h"
namespace gold
{
// The different types of debugging we support. These are bitflags.
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 }
};
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, ...) \
do \
{ \
if (is_debugging_enabled(TYPE)) \
parameters->errors()->debug(__VA_ARGS__); \
} \
while (0)
} // End namespace gold.
#endif // !defined(GOLD_DEBUG_H)