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.
This commit is contained in:
Cary Coutant
2018-03-23 10:05:38 -07:00
parent 2cc9b3048b
commit 291158a341
3 changed files with 294 additions and 21 deletions

View File

@@ -47,6 +47,7 @@ class Task;
class Task_token;
class Pluginobj;
class Plugin_rescan;
class Plugin_recorder;
// This class represents a single plugin library.
@@ -114,6 +115,10 @@ class Plugin
this->args_.push_back(arg);
}
const std::string&
filename() const
{ return this->filename_; }
private:
Plugin(const Plugin&);
Plugin& operator=(const Plugin&);
@@ -146,7 +151,8 @@ class Plugin_manager
options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL),
symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL),
this_blocker_(NULL), extra_search_path_(), lock_(NULL),
initialize_lock_(&lock_), defsym_defines_set_()
initialize_lock_(&lock_), defsym_defines_set_(),
recorder_(NULL)
{ this->current_ = plugins_.end(); }
~Plugin_manager();
@@ -316,6 +322,10 @@ class Plugin_manager
layout()
{ return this->layout_; }
Plugin_recorder*
recorder() const
{ return this->recorder_; }
private:
Plugin_manager(const Plugin_manager&);
Plugin_manager& operator=(const Plugin_manager&);
@@ -413,6 +423,9 @@ class Plugin_manager
// Keep track of all symbols defined by defsym.
typedef Unordered_set<std::string> Defsym_defines_set;
Defsym_defines_set defsym_defines_set_;
// Class to record plugin actions.
Plugin_recorder* recorder_;
};