[lld] r314711 - Fix a data race found by tsan.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 2 13:16:14 PDT 2017
Author: ruiu
Date: Mon Oct 2 13:16:13 2017
New Revision: 314711
URL: http://llvm.org/viewvc/llvm-project?rev=314711&view=rev
Log:
Fix a data race found by tsan.
Reads from `Live` and writes to `OutputOff` in the following code race
even though they are logically independent because they are bitfields
sharing the same word.
for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) {
if (!Sec->Pieces[I].Live)
continue;
CachedHashStringRef Str = Sec->getData(I);
size_t ShardId = getShardId(Str.hash());
if ((ShardId & (Concurrency - 1)) == ThreadId)
Sec->Pieces[I].OutputOff = Shards[ShardId].add(Str);
}
Modified:
lld/trunk/ELF/InputSection.h
Modified: lld/trunk/ELF/InputSection.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=314711&r1=314710&r2=314711&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.h (original)
+++ lld/trunk/ELF/InputSection.h Mon Oct 2 13:16:13 2017
@@ -196,11 +196,11 @@ private:
// be found by looking at the next one) and put the hash in a side table.
struct SectionPiece {
SectionPiece(size_t Off, bool Live = false)
- : InputOff(Off), OutputOff(-1), Live(Live || !Config->GcSections) {}
+ : InputOff(Off), Live(Live || !Config->GcSections), OutputOff(-1) {}
- size_t InputOff;
- ssize_t OutputOff : 8 * sizeof(ssize_t) - 1;
+ size_t InputOff : 8 * sizeof(ssize_t) - 1;
size_t Live : 1;
+ ssize_t OutputOff;
};
static_assert(sizeof(SectionPiece) == 2 * sizeof(size_t),
"SectionPiece is too big");
More information about the llvm-commits
mailing list