This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: Backport PR 10708 patch to 2.21 branch
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Sun, 27 Feb 2011 07:24:01 -0800
- Subject: gold patch committed: Backport PR 10708 patch to 2.21 branch
I committed this patch to the binutils 2.21 branch to bring over the
fix for PR 10708.
Ian
2011-02-27 Ian Lance Taylor <iant@google.com>
Backport from mainline:
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.
Index: copy-relocs.cc
===================================================================
RCS file: /cvs/src/src/gold/copy-relocs.cc,v
retrieving revision 1.11
diff -u -p -r1.11 copy-relocs.cc
--- copy-relocs.cc 25 Aug 2010 08:36:54 -0000 1.11
+++ copy-relocs.cc 27 Feb 2011 15:11:33 -0000
@@ -125,8 +125,17 @@ Copy_relocs<sh_type, size, big_endian>::
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)
Index: gold.cc
===================================================================
RCS file: /cvs/src/src/gold/gold.cc,v
retrieving revision 1.85
diff -u -p -r1.85 gold.cc
--- gold.cc 14 Oct 2010 22:10:22 -0000 1.85
+++ gold.cc 27 Feb 2011 15:11:33 -0000
@@ -359,6 +359,7 @@ queue_middle_tasks(const General_options
p != input_objects->relobj_end();
++p)
{
+ Task_lock_obj<Object> tlo(task, *p);
(*p)->layout(symtab, layout, NULL);
}
}
Index: icf.cc
===================================================================
RCS file: /cvs/src/src/gold/icf.cc,v
retrieving revision 1.15.2.1
diff -u -p -r1.15.2.1 icf.cc
--- icf.cc 3 Feb 2011 20:42:07 -0000 1.15.2.1
+++ icf.cc 27 Feb 2011 15:11:33 -0000
@@ -182,6 +182,11 @@ preprocess_for_unique_sections(const std
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_iteratio
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_iteratio
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.
@@ -683,6 +699,12 @@ Icf::find_identical_sections(const Input
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 std::string section_name = (*p)->section_name(i);
Index: mapfile.cc
===================================================================
RCS file: /cvs/src/src/gold/mapfile.cc,v
retrieving revision 1.6
diff -u -p -r1.6 mapfile.cc
--- mapfile.cc 14 Dec 2009 19:53:05 -0000 1.6
+++ mapfile.cc 27 Feb 2011 15:11:33 -0000
@@ -347,6 +347,12 @@ Mapfile::print_discarded_sections(const
++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)
{
Index: plugin.cc
===================================================================
RCS file: /cvs/src/src/gold/plugin.cc,v
retrieving revision 1.40.2.1
diff -u -p -r1.40.2.1 plugin.cc
--- plugin.cc 24 Jan 2011 21:54:56 -0000 1.40.2.1
+++ plugin.cc 27 Feb 2011 15:11:33 -0000
@@ -564,7 +564,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.