mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
COFF: Use section content checksum for ICF.
Previously, we calculated our own hash values for section contents. Of coruse that's slow because we had to access all bytes in sections. Fortunately, COFF objects usually contain hash values for COMDAT sections. We can use that to speed up Identical COMDAT Folding. llvm-svn: 246869
This commit is contained in:
@@ -183,6 +183,10 @@ public:
|
||||
// and this chunk is considrered as dead.
|
||||
SectionChunk *Ptr;
|
||||
|
||||
// The CRC of the contents as described in the COFF spec 4.5.5.
|
||||
// Auxiliary Format 5: Section Definitions. Used for ICF.
|
||||
uint32_t Checksum = 0;
|
||||
|
||||
private:
|
||||
ArrayRef<uint8_t> getContents() const;
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ uint64_t SectionChunk::getHash() const {
|
||||
NumRelocs,
|
||||
uint32_t(Header->SizeOfRawData),
|
||||
std::distance(Relocs.end(), Relocs.begin()),
|
||||
hash_combine_range(A.data(), A.data() + A.size()));
|
||||
Checksum);
|
||||
}
|
||||
|
||||
// Returns true if this and a given chunk are identical COMDAT sections.
|
||||
@@ -58,6 +58,8 @@ bool SectionChunk::equals(const SectionChunk *X) const {
|
||||
return false;
|
||||
if (NumRelocs != X->NumRelocs)
|
||||
return false;
|
||||
if (Checksum != X->Checksum)
|
||||
return false;
|
||||
|
||||
// Compare data
|
||||
if (getContents() != X->getContents())
|
||||
|
||||
@@ -225,13 +225,14 @@ Defined *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
|
||||
if (!SC)
|
||||
return nullptr;
|
||||
|
||||
// Handle associative sections
|
||||
// Handle section definitions
|
||||
if (IsFirst && AuxP) {
|
||||
auto *Aux = reinterpret_cast<const coff_aux_section_definition *>(AuxP);
|
||||
if (Aux->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE)
|
||||
if (auto *ParentSC = cast_or_null<SectionChunk>(
|
||||
SparseChunks[Aux->getNumber(Sym.isBigObj())]))
|
||||
ParentSC->addAssociative(SC);
|
||||
SC->Checksum = Aux->CheckSum;
|
||||
}
|
||||
|
||||
auto *B = new (Alloc) DefinedRegular(this, Sym, SC);
|
||||
|
||||
Reference in New Issue
Block a user