[lld] r268333 - Pass all buffers to BuildId hash function at once. NFC.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Mon May 2 16:35:59 PDT 2016
Author: ruiu
Date: Mon May 2 18:35:59 2016
New Revision: 268333
URL: http://llvm.org/viewvc/llvm-project?rev=268333&view=rev
Log:
Pass all buffers to BuildId hash function at once. NFC.
This change simplifies the BuildId classes by removing a few member
functions and variables from them. It should also make it easy to
parallelize hash computation in future because now each BuildId object
see all inputs rather than one at a time.
Modified:
lld/trunk/ELF/OutputSections.cpp
lld/trunk/ELF/OutputSections.h
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=268333&r1=268332&r2=268333&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Mon May 2 18:35:59 2016
@@ -1636,35 +1636,36 @@ template <class ELFT> void BuildIdSectio
HashBuf = Buf + 16;
}
-template <class ELFT> void BuildIdFnv1<ELFT>::update(ArrayRef<uint8_t> Buf) {
+template <class ELFT>
+void BuildIdFnv1<ELFT>::writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) {
+ const endianness E = ELFT::TargetEndianness;
+
// 64-bit FNV-1 hash
- const uint64_t Prime = 0x100000001b3;
- for (uint8_t B : Buf) {
- Hash *= Prime;
- Hash ^= B;
+ uint64_t Hash = 0xcbf29ce484222325;
+ for (ArrayRef<uint8_t> Buf : Bufs) {
+ for (uint8_t B : Buf) {
+ Hash *= 0x100000001b3;
+ Hash ^= B;
+ }
}
-}
-
-template <class ELFT> void BuildIdFnv1<ELFT>::writeBuildId() {
- const endianness E = ELFT::TargetEndianness;
write64<E>(this->HashBuf, Hash);
}
-template <class ELFT> void BuildIdMd5<ELFT>::update(ArrayRef<uint8_t> Buf) {
- Hash.update(Buf);
-}
-
-template <class ELFT> void BuildIdMd5<ELFT>::writeBuildId() {
+template <class ELFT>
+void BuildIdMd5<ELFT>::writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) {
+ llvm::MD5 Hash;
+ for (ArrayRef<uint8_t> Buf : Bufs)
+ Hash.update(Buf);
MD5::MD5Result Res;
Hash.final(Res);
memcpy(this->HashBuf, Res, 16);
}
-template <class ELFT> void BuildIdSha1<ELFT>::update(ArrayRef<uint8_t> Buf) {
- Hash.update(Buf);
-}
-
-template <class ELFT> void BuildIdSha1<ELFT>::writeBuildId() {
+template <class ELFT>
+void BuildIdSha1<ELFT>::writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) {
+ llvm::SHA1 Hash;
+ for (ArrayRef<uint8_t> Buf : Bufs)
+ Hash.update(Buf);
memcpy(this->HashBuf, Hash.final().data(), 20);
}
Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=268333&r1=268332&r2=268333&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Mon May 2 18:35:59 2016
@@ -541,8 +541,7 @@ private:
template <class ELFT> class BuildIdSection : public OutputSectionBase<ELFT> {
public:
void writeTo(uint8_t *Buf) override;
- virtual void update(ArrayRef<uint8_t> Buf) = 0;
- virtual void writeBuildId() = 0;
+ virtual void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) = 0;
protected:
BuildIdSection(size_t HashSize);
@@ -553,32 +552,19 @@ protected:
template <class ELFT> class BuildIdFnv1 final : public BuildIdSection<ELFT> {
public:
BuildIdFnv1() : BuildIdSection<ELFT>(8) {}
- void update(ArrayRef<uint8_t> Buf) override;
- void writeBuildId() override;
-
-private:
- // 64-bit FNV-1 initial value
- uint64_t Hash = 0xcbf29ce484222325;
+ void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) override;
};
template <class ELFT> class BuildIdMd5 final : public BuildIdSection<ELFT> {
public:
BuildIdMd5() : BuildIdSection<ELFT>(16) {}
- void update(ArrayRef<uint8_t> Buf) override;
- void writeBuildId() override;
-
-private:
- llvm::MD5 Hash;
+ void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) override;
};
template <class ELFT> class BuildIdSha1 final : public BuildIdSection<ELFT> {
public:
BuildIdSha1() : BuildIdSection<ELFT>(20) {}
- void update(ArrayRef<uint8_t> Buf) override;
- void writeBuildId() override;
-
-private:
- llvm::SHA1 Hash;
+ void writeBuildId(ArrayRef<ArrayRef<uint8_t>> Bufs) override;
};
// All output sections that are hadnled by the linker specially are
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=268333&r1=268332&r2=268333&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Mon May 2 18:35:59 2016
@@ -1907,16 +1907,15 @@ template <class ELFT> void Writer<ELFT>:
// other sections are the same.
uint8_t *Start = Buffer->getBufferStart();
uint8_t *Last = Start;
+ std::vector<ArrayRef<uint8_t>> Regions;
for (OutputSectionBase<ELFT> *Sec : OutputSections) {
uint8_t *End = Start + Sec->getFileOff();
if (!Sec->getName().startswith(".debug_"))
- S->update({Last, End});
+ Regions.push_back({Last, End});
Last = End;
}
- S->update({Last, Start + FileSize});
-
- // Fill the hash value field in the .note.gnu.build-id section.
- S->writeBuildId();
+ Regions.push_back({Last, Start + FileSize});
+ S->writeBuildId(Regions);
}
template void elf::writeResult<ELF32LE>(SymbolTable<ELF32LE> *Symtab);
More information about the llvm-commits
mailing list