diff options
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 13 | ||||
-rw-r--r-- | gold/gold.cc | 4 | ||||
-rw-r--r-- | gold/plugin.cc | 20 | ||||
-rw-r--r-- | gold/plugin.h | 17 |
4 files changed, 46 insertions, 8 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 9ce8cfd..626532a 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,18 @@ 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. (Pluginobj::get_symbol_resolution_info): Call is_visible_from_outside so we don't return "IR only" status for exported symbols or -r links. diff --git a/gold/gold.cc b/gold/gold.cc index ac321be..8d86a1b 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -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); diff --git a/gold/plugin.cc b/gold/plugin.cc index c624ef1..e2a9e60 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -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 diff --git a/gold/plugin.h b/gold/plugin.h index 20d416a..2ea0370 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -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_; |