* plugin.h (Plugin::Plugin): Initialize cleanup_done_.
authorCary Coutant <ccoutant@google.com>
Wed, 28 Oct 2009 18:07:25 +0000 (18:07 +0000)
committerCary Coutant <ccoutant@google.com>
Wed, 28 Oct 2009 18:07:25 +0000 (18:07 +0000)
(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_.

gold/ChangeLog
gold/plugin.cc
gold/plugin.h

index 56991ab65c5a6f1247cf704852d9bad08d876b98..630854cd144f863690c6e30250a08070423b380b 100644 (file)
@@ -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
index ed334ab8ee7227819fd7b16a351826d4cc4f08da..317fb7d09c8f1fe8104830b95ebea9d63663a8b9 100644 (file)
@@ -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_,
index 965b38903e5b6894d774824f1b4117b09448b912..fa6e594d37a3dc765987054bd2051668c50d64cb 100644 (file)
@@ -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_;