summaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2009-10-28 18:07:25 +0000
committerCary Coutant <ccoutant@google.com>2009-10-28 18:07:25 +0000
commit09cfc7a036767502dccea4b7ca807d7756a914be (patch)
tree5aa234bed41142a7591d3bb3c05e31ab2c8b13ca /gold
parent5bf54e8f05aa685b820b95a767d09663de35528c (diff)
downloadbinutils-redhat-09cfc7a036767502dccea4b7ca807d7756a914be.tar.gz
* 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_.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/plugin.cc17
-rw-r--r--gold/plugin.h10
3 files changed, 25 insertions, 12 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 56991ab65c..630854cd14 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 ed334ab8ee..317fb7d09c 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 965b38903e..fa6e594d37 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_;