forked from OSchip/llvm-project
[ELF] Simplify GnuHashSection::write. NFC
This commit is contained in:
parent
55c14d6dbf
commit
5ca54c6686
|
@ -2380,21 +2380,8 @@ void GnuHashTableSection::writeTo(uint8_t *buf) {
|
||||||
write32(buf + 12, Shift2);
|
write32(buf + 12, Shift2);
|
||||||
buf += 16;
|
buf += 16;
|
||||||
|
|
||||||
// Write a bloom filter and a hash table.
|
// Write the 2-bit bloom filter.
|
||||||
writeBloomFilter(buf);
|
const unsigned c = config->is64 ? 64 : 32;
|
||||||
buf += config->wordsize * maskWords;
|
|
||||||
writeHashTable(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function writes a 2-bit bloom filter. This bloom filter alone
|
|
||||||
// usually filters out 80% or more of all symbol lookups [1].
|
|
||||||
// The dynamic linker uses the hash table only when a symbol is not
|
|
||||||
// filtered out by a bloom filter.
|
|
||||||
//
|
|
||||||
// [1] Ulrich Drepper (2011), "How To Write Shared Libraries" (Ver. 4.1.2),
|
|
||||||
// p.9, https://www.akkadia.org/drepper/dsohowto.pdf
|
|
||||||
void GnuHashTableSection::writeBloomFilter(uint8_t *buf) {
|
|
||||||
unsigned c = config->is64 ? 64 : 32;
|
|
||||||
for (const Entry &sym : symbols) {
|
for (const Entry &sym : symbols) {
|
||||||
// When C = 64, we choose a word with bits [6:...] and set 1 to two bits in
|
// 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].
|
// the word using bits [0:5] and [26:31].
|
||||||
|
@ -2404,9 +2391,9 @@ void GnuHashTableSection::writeBloomFilter(uint8_t *buf) {
|
||||||
val |= uint64_t(1) << ((sym.hash >> Shift2) % c);
|
val |= uint64_t(1) << ((sym.hash >> Shift2) % c);
|
||||||
writeUint(buf + i * config->wordsize, val);
|
writeUint(buf + i * config->wordsize, val);
|
||||||
}
|
}
|
||||||
}
|
buf += config->wordsize * maskWords;
|
||||||
|
|
||||||
void GnuHashTableSection::writeHashTable(uint8_t *buf) {
|
// Write the hash table.
|
||||||
uint32_t *buckets = reinterpret_cast<uint32_t *>(buf);
|
uint32_t *buckets = reinterpret_cast<uint32_t *>(buf);
|
||||||
uint32_t oldBucket = -1;
|
uint32_t oldBucket = -1;
|
||||||
uint32_t *values = buckets + nBuckets;
|
uint32_t *values = buckets + nBuckets;
|
||||||
|
|
|
@ -675,9 +675,6 @@ private:
|
||||||
// See the comment in writeBloomFilter.
|
// See the comment in writeBloomFilter.
|
||||||
enum { Shift2 = 26 };
|
enum { Shift2 = 26 };
|
||||||
|
|
||||||
void writeBloomFilter(uint8_t *buf);
|
|
||||||
void writeHashTable(uint8_t *buf);
|
|
||||||
|
|
||||||
struct Entry {
|
struct Entry {
|
||||||
Symbol *sym;
|
Symbol *sym;
|
||||||
size_t strTabOffset;
|
size_t strTabOffset;
|
||||||
|
|
Loading…
Reference in New Issue