[lld] r322264 - Fix thread race between SectionPiece's OutputOff and Live members

Dimitry Andric via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 11 00:03:23 PST 2018


Author: dim
Date: Thu Jan 11 00:03:22 2018
New Revision: 322264

URL: http://llvm.org/viewvc/llvm-project?rev=322264&view=rev
Log:
Fix thread race between SectionPiece's OutputOff and Live members

Summary:
As reported in bug 35788, rL316280 reintroduces a race between two
members of SectionPiece, which share the same 64 bit memory location.

To fix the race, check the hash before checking the Live member, as
suggested by Rafael.

Reviewers: ruiu, rafael

Reviewed By: ruiu

Subscribers: smeenai, emaste, llvm-commits

Differential Revision: https://reviews.llvm.org/D41884

Modified:
    lld/trunk/ELF/SyntheticSections.cpp

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=322264&r1=322263&r2=322264&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Thu Jan 11 00:03:22 2018
@@ -2451,10 +2451,8 @@ void MergeNoTailSection::finalizeContent
   parallelForEachN(0, Concurrency, [&](size_t ThreadId) {
     for (MergeInputSection *Sec : Sections) {
       for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) {
-        if (!Sec->Pieces[I].Live)
-          continue;
         size_t ShardId = getShardId(Sec->Pieces[I].Hash);
-        if ((ShardId & (Concurrency - 1)) == ThreadId)
+        if ((ShardId & (Concurrency - 1)) == ThreadId && Sec->Pieces[I].Live)
           Sec->Pieces[I].OutputOff = Shards[ShardId].add(Sec->getData(I));
       }
     }




More information about the llvm-commits mailing list