Skip to content

Commit

Permalink
Use xxhash for fast --build-id.
Browse files Browse the repository at this point in the history
The speed improvements I got were:

firefox
  master 7.050784981
  patch  6.842361079 0.970439617353
chromium
  master 4.260626249
  patch  4.183148025 0.981815296749
chromium fast
  master 1.829028591
  patch  1.806439277 0.987649556649
the gold plugin
  master 0.336154128
  patch  0.331893374 0.987324998728
clang
  master 0.561869781
  patch  0.558640828 0.994253200458
llvm-as
  master 0.034025959
  patch  0.033984389 0.99877828572
the gold plugin fsds
  master 0.360710529
  patch  0.356483564 0.988281559145
clang fsds
  master 0.640518422
  patch  0.632329874 0.987215749432
llvm-as fsds
  master 0.031569416
  patch  0.030822055 0.976326423017
scylla
  master 3.154770529
  patch  3.11982016 0.988921422754

llvm-svn: 282505
  • Loading branch information
espindola committed Sep 27, 2016
1 parent 95d0c62 commit a42b3bc
Showing 1 changed file with 4 additions and 50 deletions.
54 changes: 4 additions & 50 deletions lld/ELF/OutputSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/MD5.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/SHA1.h"
#include "llvm/Support/RandomNumberGenerator.h"
#include "llvm/Support/SHA1.h"
#include "llvm/Support/xxhash.h"

using namespace llvm;
using namespace llvm::dwarf;
Expand Down Expand Up @@ -1681,59 +1682,12 @@ template <class ELFT> void BuildIdSection<ELFT>::writeTo(uint8_t *Buf) {
HashBuf = Buf + 16;
}

static uint64_t murmurHash64A(const void *Key, int Len) {
uint64_t Seed = 0;
const uint64_t M = 0xc6a4a7935bd1e995LLU;
const int R = 47;

uint64_t H = Seed ^ (Len * M);

const uint64_t *Data = (const uint64_t *)Key;
const uint64_t *End = Data + (Len / 8);

while (Data != End) {
uint64_t K = *Data++;

K *= M;
K ^= K >> R;
K *= M;

H ^= K;
H *= M;
}

const unsigned char *Data2 = (const unsigned char *)Data;
switch (Len & 7) {
case 7:
H ^= uint64_t(Data2[6]) << 48;
case 6:
H ^= uint64_t(Data2[5]) << 40;
case 5:
H ^= uint64_t(Data2[4]) << 32;
case 4:
H ^= uint64_t(Data2[3]) << 24;
case 3:
H ^= uint64_t(Data2[2]) << 16;
case 2:
H ^= uint64_t(Data2[1]) << 8;
case 1:
H ^= uint64_t(Data2[0]);
H *= M;
};

H ^= H >> R;
H *= M;
H ^= H >> R;

return H;
}

template <class ELFT>
void BuildIdFastHash<ELFT>::writeBuildId(ArrayRef<uint8_t> Buf) {
const endianness E = ELFT::TargetEndianness;

// 64-bit murmur2 hash
uint64_t Hash = murmurHash64A(Buf.data(), Buf.size());
// 64-bit xxhash
uint64_t Hash = xxHash64(StringRef((const char *)Buf.data(), Buf.size()));
write64<E>(this->HashBuf, Hash);
}

Expand Down

0 comments on commit a42b3bc

Please sign in to comment.