summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-11-08 04:10:01 -0800
committerH.J. Lu <hjl.tools@gmail.com>2020-11-08 04:10:15 -0800
commitd4820dac5e7608e24fba6d08cde9248b4c4b2928 (patch)
treee679864fec0c2c99baf9f1f2cab0ad3ac2f60666
parenta907d563de51b5288a7acae8df805428cc1b960d (diff)
downloadbinutils-gdb-d4820dac5e7608e24fba6d08cde9248b4c4b2928.tar.gz
gold: Avoid sharing Plugin_list::iterator
class Plugin_manager has // A pointer to the current plugin. Used while loading plugins. Plugin_list::iterator current_; The same iterator is shared by all threads. It is OK to use it to load plugins since only one thread loads plugins. Avoid sharing Plugin_list iterator in all other cases. PR gold/26200 * plugin.cc (Plugin_manager::claim_file): Don't share Plugin_list iterator. (Plugin_manager::all_symbols_read): Likewise. (Plugin_manager::cleanup): Likewise.
-rw-r--r--gold/ChangeLog8
-rw-r--r--gold/plugin.cc34
2 files changed, 25 insertions, 17 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 73a74190511..cb2ad727067 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,11 @@
+2020-11-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR gold/26200
+ * plugin.cc (Plugin_manager::claim_file): Don't share Plugin_list
+ iterator.
+ (Plugin_manager::all_symbols_read): Likewise.
+ (Plugin_manager::cleanup): Likewise.
+
2020-11-03 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::tocsave_loc): Return a pointer.
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 8963c7fa4c8..729ddca9f31 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -755,17 +755,17 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset,
this->objects_.push_back(elf_object);
this->in_claim_file_handler_ = true;
- for (this->current_ = this->plugins_.begin();
- this->current_ != this->plugins_.end();
- ++this->current_)
+ for (Plugin_list::iterator p = this->plugins_.begin();
+ p != this->plugins_.end();
+ ++p)
{
// If we aren't yet in replacement phase, allow plugins to claim input
// files, otherwise notify the plugin of the new input file, if needed.
if (!this->in_replacement_phase_)
- {
- if ((*this->current_)->claim_file(&this->plugin_input_file_))
- {
- this->any_claimed_ = true;
+ {
+ if ((*p)->claim_file(&this->plugin_input_file_))
+ {
+ this->any_claimed_ = true;
this->in_claim_file_handler_ = false;
if (this->recorder_ != NULL)
@@ -775,7 +775,7 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset,
: elf_object->name());
this->recorder_->claimed_file(objname,
offset, filesize,
- (*this->current_)->filename());
+ (*p)->filename());
}
if (this->objects_.size() > handle
@@ -790,7 +790,7 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset,
}
else
{
- (*this->current_)->new_input(&this->plugin_input_file_);
+ (*p)->new_input(&this->plugin_input_file_);
}
}
@@ -850,10 +850,10 @@ Plugin_manager::all_symbols_read(Workqueue* workqueue, Task* task,
layout->script_options()->set_defsym_uses_in_real_elf(symtab);
layout->script_options()->find_defsym_defs(this->defsym_defines_set_);
- for (this->current_ = this->plugins_.begin();
- this->current_ != this->plugins_.end();
- ++this->current_)
- (*this->current_)->all_symbols_read();
+ for (Plugin_list::iterator p = this->plugins_.begin();
+ p != this->plugins_.end();
+ ++p)
+ (*p)->all_symbols_read();
if (this->any_added_)
{
@@ -1028,10 +1028,10 @@ Plugin_manager::cleanup()
close_all_descriptors();
}
- for (this->current_ = this->plugins_.begin();
- this->current_ != this->plugins_.end();
- ++this->current_)
- (*this->current_)->cleanup();
+ for (Plugin_list::iterator p = this->plugins_.begin();
+ p != this->plugins_.end();
+ ++p)
+ (*p)->cleanup();
}
// Make a new Pluginobj object. This is called when the plugin calls