diff options
-rw-r--r-- | gold/ChangeLog | 10 | ||||
-rw-r--r-- | gold/plugin.cc | 17 | ||||
-rw-r--r-- | gold/plugin.h | 10 |
3 files changed, 25 insertions, 12 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 56991ab..630854c 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2009-10-28 Cary Coutant <ccoutant@google.com> + + * plugin.h (Plugin::Plugin): Initialize cleanup_done_. + (Plugin::cleanup_done_): New member. + (Plugin_manager::Plugin_manager): Remove cleanup_done_. + (Plugin_manager::cleanup_done_): Remove. + (Plugin_manager::add_input_file): Edit error message. + * plugin.cc (Plugin::cleanup): Test and set cleanup_done_. + (Plugin_manager::cleanup): Remove use of cleanup_done_. + 2009-10-27 Mikolaj Zalewski <mikolajz@google.com> * fileread.cc: (File_read::View::~View): Use the new diff --git a/gold/plugin.cc b/gold/plugin.cc index ed334ab..317fb7d 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -238,8 +238,14 @@ Plugin::all_symbols_read() inline void Plugin::cleanup() { - if (this->cleanup_handler_ != NULL) - (*this->cleanup_handler_)(); + if (this->cleanup_handler_ != NULL && !this->cleanup_done_) + { + // Set this flag before calling to prevent a recursive plunge + // in the event that a plugin's cleanup handler issues a + // fatal error. + this->cleanup_done_ = true; + (*this->cleanup_handler_)(); + } } // Plugin_manager methods. @@ -350,13 +356,10 @@ Plugin_manager::layout_deferred_objects() 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 @@ -423,8 +426,8 @@ Plugin_manager::add_input_file(char *pathname, bool is_lib) Task_token* next_blocker = new Task_token(true); next_blocker->add_blocker(); if (this->layout_->incremental_inputs()) - gold_error(_("Input files added by plug-ins in --incremental mode not " - "supported yet.\n")); + gold_error(_("input files added by plug-ins in --incremental mode not " + "supported yet")); this->workqueue_->queue_soon(new Read_symbols(this->input_objects_, this->symtab_, this->layout_, diff --git a/gold/plugin.h b/gold/plugin.h index 965b389..fa6e594 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -54,7 +54,8 @@ class Plugin args_(), claim_file_handler_(NULL), all_symbols_read_handler_(NULL), - cleanup_handler_(NULL) + cleanup_handler_(NULL), + cleanup_done_(false) { } ~Plugin() @@ -112,6 +113,8 @@ class Plugin ld_plugin_claim_file_handler claim_file_handler_; ld_plugin_all_symbols_read_handler all_symbols_read_handler_; ld_plugin_cleanup_handler cleanup_handler_; + // TRUE if the cleanup handlers have been called. + bool cleanup_done_; }; // A manager class for plugins. @@ -121,7 +124,7 @@ 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), cleanup_done_(false), + plugin_input_file_(), in_replacement_phase_(false), options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL), symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL) @@ -263,9 +266,6 @@ 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_; Task* task_; |