Commit 8f38b5ed authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r322264:

------------------------------------------------------------------------
r322264 | dim | 2018-01-11 00:03:22 -0800 (Thu, 11 Jan 2018) | 17 lines

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

------------------------------------------------------------------------

llvm-svn: 322648
parent 5b930ddf
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -2438,10 +2438,8 @@ void MergeNoTailSection::finalizeContents() {
  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));
      }
    }