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 5 Nov 2010 01:14:23 -0000 @@ -125,8 +125,17 @@ Copy_relocs:: bool is_ordinary; unsigned int shndx = sym->shndx(&is_ordinary); gold_assert(is_ordinary); - typename elfcpp::Elf_types::Elf_WXword addralign = - sym->object()->section_addralign(shndx); + typename elfcpp::Elf_types::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(-1); + Object* obj = sym->object(); + Task_lock_obj tl(dummy_task, obj); + addralign = obj->section_addralign(shndx); + } typename Sized_symbol::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 5 Nov 2010 01:14:23 -0000 @@ -359,6 +359,7 @@ queue_middle_tasks(const General_options p != input_objects->relobj_end(); ++p) { + Task_lock_obj tlo(task, *p); (*p)->layout(symtab, layout, NULL); } } Index: icf.cc =================================================================== RCS file: /cvs/src/src/gold/icf.cc,v retrieving revision 1.15 diff -u -p -r1.15 icf.cc --- icf.cc 28 Sep 2010 17:14:15 -0000 1.15 +++ icf.cc 5 Nov 2010 01:14:23 -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(-1); + Task_lock_obj 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(-1); + Task_lock_obj 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(-1); + Task_lock_obj 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 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(-1); + Task_lock_obj tl(dummy_task, *p); + for (unsigned int i = 0;i < (*p)->shnum(); ++i) { const char* section_name = (*p)->section_name(i).c_str(); 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 5 Nov 2010 01:14:23 -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(-1); + Task_lock_obj 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 diff -u -p -r1.40 plugin.cc --- plugin.cc 14 Oct 2010 22:10:22 -0000 1.40 +++ plugin.cc 5 Nov 2010 01:14:23 -0000 @@ -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(-1); + Task_lock_obj tl(dummy_task, *obj); + (*obj)->layout_deferred_sections(this->layout_); + } } // Call the cleanup handlers.