Skip to content

Commit

Permalink
[LLD][NFC] Refactor: BuildID hash size now computed in one place.
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D61078

llvm-svn: 360316
  • Loading branch information
bd1976bris authored and MrSidims committed May 17, 2019
1 parent 833e4d0 commit ce61311
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 25 deletions.
2 changes: 1 addition & 1 deletion lld/ELF/SyntheticSections.h
Expand Up @@ -148,13 +148,13 @@ class BuildIdSection : public SyntheticSection {
static const unsigned HeaderSize = 16;

public:
const size_t HashSize;
BuildIdSection();
void writeTo(uint8_t *Buf) override;
size_t getSize() const override { return HeaderSize + HashSize; }
void writeBuildId(llvm::ArrayRef<uint8_t> Buf);

private:
size_t HashSize;
uint8_t *HashBuf;
};

Expand Down
42 changes: 18 additions & 24 deletions lld/ELF/Writer.cpp
Expand Up @@ -2541,48 +2541,42 @@ computeHash(llvm::MutableArrayRef<uint8_t> HashBuf,
HashFn(HashBuf.data(), Hashes);
}

static std::vector<uint8_t> computeBuildId(llvm::ArrayRef<uint8_t> Buf) {
std::vector<uint8_t> BuildId;
template <class ELFT> void Writer<ELFT>::writeBuildId() {
if (!In.BuildId || !In.BuildId->getParent())
return;

if (Config->BuildId == BuildIdKind::Hexstring) {
In.BuildId->writeBuildId(Config->BuildIdVector);
return;
}

// Compute a hash of all sections of the output file.
std::vector<uint8_t> BuildId(In.BuildId->HashSize);
llvm::ArrayRef<uint8_t> Buf{Out::BufferStart, size_t(FileSize)};

switch (Config->BuildId) {
case BuildIdKind::Fast:
BuildId.resize(8);
computeHash(BuildId, Buf, [](uint8_t *Dest, ArrayRef<uint8_t> Arr) {
write64le(Dest, xxHash64(Arr));
});
break;
case BuildIdKind::Md5:
BuildId.resize(16);
computeHash(BuildId, Buf, [](uint8_t *Dest, ArrayRef<uint8_t> Arr) {
memcpy(Dest, MD5::hash(Arr).data(), 16);
computeHash(BuildId, Buf, [&](uint8_t *Dest, ArrayRef<uint8_t> Arr) {
memcpy(Dest, MD5::hash(Arr).data(), In.BuildId->HashSize);
});
break;
case BuildIdKind::Sha1:
BuildId.resize(20);
computeHash(BuildId, Buf, [](uint8_t *Dest, ArrayRef<uint8_t> Arr) {
memcpy(Dest, SHA1::hash(Arr).data(), 20);
computeHash(BuildId, Buf, [&](uint8_t *Dest, ArrayRef<uint8_t> Arr) {
memcpy(Dest, SHA1::hash(Arr).data(), In.BuildId->HashSize);
});
break;
case BuildIdKind::Uuid:
BuildId.resize(16);
if (auto EC = llvm::getRandomBytes(BuildId.data(), 16))
if (auto EC = llvm::getRandomBytes(BuildId.data(), In.BuildId->HashSize))
error("entropy source failure: " + EC.message());
break;
case BuildIdKind::Hexstring:
BuildId = Config->BuildIdVector;
break;
default:
llvm_unreachable("unknown BuildIdKind");
}
return BuildId;
}

template <class ELFT> void Writer<ELFT>::writeBuildId() {
if (!In.BuildId || !In.BuildId->getParent())
return;

// Compute a hash of all sections of the output file.
std::vector<uint8_t> BuildId =
computeBuildId({Out::BufferStart, size_t(FileSize)});
In.BuildId->writeBuildId(BuildId);
}

Expand Down

0 comments on commit ce61311

Please sign in to comment.