* gold.cc (gold_exit): Call plugin cleanup handlers on exit.

* plugin.cc (Plugin_manager::finish): Rename as
	layout_deferred_objects.  Move cleanup to separate function.
	(Plugin_manager::cleanup): New function.
	(Plugin_finish::run): Call layout_deferred_objects and cleanup
	separately.
	* plugin.h (Plugin_manager::finish): Rename as
	layout_deferred_objects.
	(Plugin_manager::cleanup): New function.
	(Plugin_manager::cleanup_done): New field.
This commit is contained in:
Cary Coutant 2008-12-24 06:17:18 +00:00
parent 7fe893f8f0
commit 483620e86f
4 changed files with 46 additions and 8 deletions

View File

@ -1,3 +1,16 @@
2008-12-23 Cary Coutant <ccoutant@google.com>
* gold.cc (gold_exit): Call plugin cleanup handlers on exit.
* plugin.cc (Plugin_manager::finish): Rename as
layout_deferred_objects. Move cleanup to separate function.
(Plugin_manager::cleanup): New function.
(Plugin_finish::run): Call layout_deferred_objects and cleanup
separately.
* plugin.h (Plugin_manager::finish): Rename as
layout_deferred_objects.
(Plugin_manager::cleanup): New function.
(Plugin_manager::cleanup_done): New field.
2008-12-23 Cary Coutant <ccoutant@google.com>
* plugin.cc (is_visible_from_outside): New function.

View File

@ -50,6 +50,10 @@ const char* program_name;
void
gold_exit(bool status)
{
if (parameters != NULL
&& parameters->options_valid()
&& parameters->options().has_plugins())
parameters->options().plugins()->cleanup();
if (!status && parameters != NULL && parameters->options_valid())
unlink_if_ordinary(parameters->options().output_file_name());
exit(status ? EXIT_SUCCESS : EXIT_FAILURE);

View File

@ -306,10 +306,10 @@ Plugin_manager::all_symbols_read(Workqueue* workqueue,
*last_blocker = this->this_blocker_;
}
// Layout deferred sections and call the cleanup handlers.
// Layout deferred objects.
void
Plugin_manager::finish()
Plugin_manager::layout_deferred_objects()
{
Deferred_layout_list::iterator obj;
@ -317,11 +317,20 @@ Plugin_manager::finish()
obj != this->deferred_layout_objects_.end();
++obj)
(*obj)->layout_deferred_sections(this->layout_);
}
// Call the cleanup handlers.
void
Plugin_manager::cleanup()
{
if (this->cleanup_done_)
return;
for (this->current_ = this->plugins_.begin();
this->current_ != this->plugins_.end();
++this->current_)
(*this->current_)->cleanup();
this->cleanup_done_ = true;
}
// Make a new Pluginobj object. This is called when the plugin calls
@ -766,7 +775,12 @@ class Plugin_finish : public Task
void
run(Workqueue*)
{ parameters->options().plugins()->finish(); }
{
Plugin_manager* plugins = parameters->options().plugins();
gold_assert(plugins != NULL);
plugins->layout_deferred_objects();
plugins->cleanup();
}
std::string
get_name() const

View File

@ -121,9 +121,9 @@ class Plugin_manager
public:
Plugin_manager(const General_options& options)
: plugins_(), objects_(), deferred_layout_objects_(), input_file_(NULL),
plugin_input_file_(), in_replacement_phase_(false), options_(options),
workqueue_(NULL), input_objects_(NULL), symtab_(NULL), layout_(NULL),
dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL)
plugin_input_file_(), in_replacement_phase_(false), cleanup_done_(false),
options_(options), workqueue_(NULL), input_objects_(NULL), symtab_(NULL),
layout_(NULL), dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL)
{ this->current_ = plugins_.end(); }
~Plugin_manager();
@ -155,9 +155,13 @@ class Plugin_manager
Symbol_table* symtab, Layout* layout, Dirsearch* dirpath,
Mapfile* mapfile, Task_token** last_blocker);
// Run deferred layout and call the cleanup handlers.
// Run deferred layout.
void
finish();
layout_deferred_objects();
// Call the cleanup handlers.
void
cleanup();
// Register a claim-file handler.
void
@ -248,6 +252,9 @@ class Plugin_manager
// placeholder symbols from the Pluginobj objects.
bool in_replacement_phase_;
// TRUE if the cleanup handlers have been called.
bool cleanup_done_;
const General_options& options_;
Workqueue* workqueue_;
Input_objects* input_objects_;