aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog13
-rw-r--r--gold/gold.cc4
-rw-r--r--gold/plugin.cc20
-rw-r--r--gold/plugin.h17
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_;