forked from OSchip/llvm-project
[ELF] .gnu.hash bloom filter: use Shift2 = 26 instead of 6
Summary: For the 2-bit bloom filter, we currently pick the bits Hash%64 and Hash>>6%64 (Shift2=6), but bits [6:...] are also used to select a word, causing a loss of precision. In this patch, we choose Shift2=26, with is suggested by Ambrose Feinstein. Note, Shift2 is computed as maskbitslog2 in bfd/elflink.c and gold/dynobj.cc It is varying with the number of dynamic symbols but we don't necessarily copy its rule. Reviewers: ruiu, espindola Reviewed By: ruiu Subscribers: emaste, arichardson, llvm-commits Differential Revision: https://reviews.llvm.org/D55971 llvm-svn: 349966
This commit is contained in:
parent
b264d69de7
commit
fe36417f6e
|
@ -2176,6 +2176,8 @@ void GnuHashTableSection::writeTo(uint8_t *Buf) {
|
|||
void GnuHashTableSection::writeBloomFilter(uint8_t *Buf) {
|
||||
unsigned C = Config->Is64 ? 64 : 32;
|
||||
for (const Entry &Sym : Symbols) {
|
||||
// When C = 64, we choose a word with bits [6:...] and set 1 to two bits in
|
||||
// the word using bits [0:5] and [26:31].
|
||||
size_t I = (Sym.Hash / C) & (MaskWords - 1);
|
||||
uint64_t Val = readUint(Buf + I * Config->Wordsize);
|
||||
Val |= uint64_t(1) << (Sym.Hash % C);
|
||||
|
|
|
@ -619,7 +619,8 @@ public:
|
|||
void addSymbols(std::vector<SymbolTableEntry> &Symbols);
|
||||
|
||||
private:
|
||||
enum { Shift2 = 6 };
|
||||
// See the comment in writeBloomFilter.
|
||||
enum { Shift2 = 26 };
|
||||
|
||||
void writeBloomFilter(uint8_t *Buf);
|
||||
void writeHashTable(uint8_t *Buf);
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
# CHECK-NEXT: Num Buckets: 1
|
||||
# CHECK-NEXT: First Hashed Symbol Index: 1
|
||||
# CHECK-NEXT: Num Mask Words: 1
|
||||
# CHECK-NEXT: Shift Count: 6
|
||||
# CHECK-NEXT: Bloom Filter: [0x400000000004204]
|
||||
# CHECK-NEXT: Shift Count: 26
|
||||
# CHECK-NEXT: Bloom Filter: [0x400000000000204]
|
||||
# CHECK-NEXT: Buckets: [1]
|
||||
# CHECK-NEXT: Values: [0xB8860BA, 0xB887389]
|
||||
# CHECK-NEXT: }
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
# EMPTY-NEXT: Num Buckets: 1
|
||||
# EMPTY-NEXT: First Hashed Symbol Index: 2
|
||||
# EMPTY-NEXT: Num Mask Words: 1
|
||||
# EMPTY-NEXT: Shift Count: 6
|
||||
# EMPTY-NEXT: Shift Count: 26
|
||||
# EMPTY-NEXT: Bloom Filter: [0x0]
|
||||
# EMPTY-NEXT: Buckets: [0]
|
||||
# EMPTY-NEXT: Values: []
|
||||
|
@ -121,8 +121,8 @@
|
|||
# I386-NEXT: Num Buckets: 1
|
||||
# I386-NEXT: First Hashed Symbol Index: 4
|
||||
# I386-NEXT: Num Mask Words: 1
|
||||
# I386-NEXT: Shift Count: 6
|
||||
# I386-NEXT: Bloom Filter: [0x4004204]
|
||||
# I386-NEXT: Shift Count: 26
|
||||
# I386-NEXT: Bloom Filter: [0x4000204]
|
||||
# I386-NEXT: Buckets: [4]
|
||||
# I386-NEXT: Values: [0xB8860BA, 0xB887389]
|
||||
# I386-NEXT: }
|
||||
|
@ -181,8 +181,8 @@
|
|||
# X86_64-NEXT: Num Buckets: 1
|
||||
# X86_64-NEXT: First Hashed Symbol Index: 4
|
||||
# X86_64-NEXT: Num Mask Words: 1
|
||||
# X86_64-NEXT: Shift Count: 6
|
||||
# X86_64-NEXT: Bloom Filter: [0x400000000004204]
|
||||
# X86_64-NEXT: Shift Count: 26
|
||||
# X86_64-NEXT: Bloom Filter: [0x400000000000204]
|
||||
# X86_64-NEXT: Buckets: [4]
|
||||
# X86_64-NEXT: Values: [0xB8860BA, 0xB887389]
|
||||
# X86_64-NEXT: }
|
||||
|
@ -241,8 +241,8 @@
|
|||
# PPC64-NEXT: Num Buckets: 1
|
||||
# PPC64-NEXT: First Hashed Symbol Index: 4
|
||||
# PPC64-NEXT: Num Mask Words: 1
|
||||
# PPC64-NEXT: Shift Count: 6
|
||||
# PPC64-NEXT: Bloom Filter: [0x400000000004204]
|
||||
# PPC64-NEXT: Shift Count: 26
|
||||
# PPC64-NEXT: Bloom Filter: [0x400000000000204]
|
||||
# PPC64-NEXT: Buckets: [4]
|
||||
# PPC64-NEXT: Values: [0xB8860BA, 0xB887389]
|
||||
# PPC64-NEXT: }
|
||||
|
|
Loading…
Reference in New Issue