aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog16
-rw-r--r--gold/copy-relocs.cc13
-rw-r--r--gold/gold.cc1
-rw-r--r--gold/icf.cc22
-rw-r--r--gold/mapfile.cc6
-rw-r--r--gold/plugin.cc9
6 files changed, 64 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 53bc363..ee2b865 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,19 @@
+2010-11-05 Cary Coutant <ccoutant@google.com>
+
+ PR gold/10708
+ * copy-relocs.cc (Copy_relocs::emit_copy_reloc): Hold a lock on the
+ object when reading from the file.
+ * gold.cc (queue_middle_tasks): Hold a lock on the object when doing
+ second layout pass.
+ * icf.cc (preprocess_for_unique_sections): Hold a lock on the object
+ when reading section contents.
+ (get_section_contents): Likewise.
+ (icf::find_identical_sections): Likewise.
+ * mapfile.cc (Mapfile::print_discarded_sections): Hold a lock on the
+ object when reading from the file.
+ * plugin.cc (Plugin_manager::layout_deferred_objects): Hold a lock on
+ the object when doing deferred section layout.
+
2010-11-03 Nick Clifton <nickc@redhat.com>
PR gold/12001
diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc
index ed8002f..4931aa0 100644
--- a/gold/copy-relocs.cc
+++ b/gold/copy-relocs.cc
@@ -125,8 +125,17 @@ Copy_relocs<sh_type, size, big_endian>::emit_copy_reloc(
bool is_ordinary;
unsigned int shndx = sym->shndx(&is_ordinary);
gold_assert(is_ordinary);
- typename elfcpp::Elf_types<size>::Elf_WXword addralign =
- sym->object()->section_addralign(shndx);
+ typename elfcpp::Elf_types<size>::Elf_WXword addralign;
+
+ {
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from scan_relocs, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Object* obj = sym->object();
+ Task_lock_obj<Object> tl(dummy_task, obj);
+ addralign = obj->section_addralign(shndx);
+ }
typename Sized_symbol<size>::Value_type value = sym->value();
while ((value & (addralign - 1)) != 0)
diff --git a/gold/gold.cc b/gold/gold.cc
index 6bbf02e..564ca39 100644
--- a/gold/gold.cc
+++ b/gold/gold.cc
@@ -359,6 +359,7 @@ queue_middle_tasks(const General_options& options,
p != input_objects->relobj_end();
++p)
{
+ Task_lock_obj<Object> tlo(task, *p);
(*p)->layout(symtab, layout, NULL);
}
}
diff --git a/gold/icf.cc b/gold/icf.cc
index 09cb1d4..a132875 100644
--- a/gold/icf.cc
+++ b/gold/icf.cc
@@ -182,6 +182,11 @@ preprocess_for_unique_sections(const std::vector<Section_id>& id_section,
section_size_type plen;
if (section_contents == NULL)
{
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from queue_middle_tasks, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, secn.first);
const unsigned char* contents;
contents = secn.first->section_contents(secn.second,
&plen,
@@ -237,6 +242,11 @@ get_section_contents(bool first_iteration,
if (first_iteration)
{
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from queue_middle_tasks, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, secn.first);
contents = secn.first->section_contents(secn.second,
&plen,
false);
@@ -363,6 +373,12 @@ get_section_contents(bool first_iteration,
if (!first_iteration)
continue;
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from queue_middle_tasks, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, it_v->first);
+
uint64_t secn_flags = (it_v->first)->section_flags(it_v->second);
// This reloc points to a merge section. Hash the
// contents of this section.
@@ -682,6 +698,12 @@ Icf::find_identical_sections(const Input_objects* input_objects,
p != input_objects->relobj_end();
++p)
{
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from queue_middle_tasks, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, *p);
+
for (unsigned int i = 0;i < (*p)->shnum(); ++i)
{
const char* section_name = (*p)->section_name(i).c_str();
diff --git a/gold/mapfile.cc b/gold/mapfile.cc
index a3ba52b..0cde51e 100644
--- a/gold/mapfile.cc
+++ b/gold/mapfile.cc
@@ -347,6 +347,12 @@ Mapfile::print_discarded_sections(const Input_objects* input_objects)
++p)
{
Relobj* relobj = *p;
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from Layout_task_runner, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, relobj);
+
unsigned int shnum = relobj->shnum();
for (unsigned int i = 0; i < shnum; ++i)
{
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 7dd1fa3..a3569c9 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -361,7 +361,14 @@ Plugin_manager::layout_deferred_objects()
for (obj = this->deferred_layout_objects_.begin();
obj != this->deferred_layout_objects_.end();
++obj)
- (*obj)->layout_deferred_sections(this->layout_);
+ {
+ // Lock the object so we can read from it. This is only called
+ // single-threaded from queue_middle_tasks, so it is OK to lock.
+ // Unfortunately we have no way to pass in a Task token.
+ const Task* dummy_task = reinterpret_cast<const Task*>(-1);
+ Task_lock_obj<Object> tl(dummy_task, *obj);
+ (*obj)->layout_deferred_sections(this->layout_);
+ }
}
// Call the cleanup handlers.