COFF: Don't use COFFHeader->NumberOfRelocations.
authorRui Ueyama <ruiu@google.com>
Thu, 25 Jun 2015 17:43:37 +0000 (17:43 +0000)
committerRui Ueyama <ruiu@google.com>
Thu, 25 Jun 2015 17:43:37 +0000 (17:43 +0000)
The size of the field is 16 bit, so it's inaccurate if the
number of relocations in a section is more than 65535.

llvm-svn: 240661

lld/COFF/Chunks.cpp
lld/COFF/Chunks.h

index 95626fd..74bbe6f 100644 (file)
@@ -29,7 +29,8 @@ namespace coff {
 
 SectionChunk::SectionChunk(ObjectFile *F, const coff_section *H)
     : File(F), Ptr(this), Header(H),
-      Relocs(File->getCOFFObj()->getRelocations(Header)) {
+      Relocs(File->getCOFFObj()->getRelocations(Header)),
+      NumRelocs(std::distance(Relocs.begin(), Relocs.end())) {
   // Initialize SectionName.
   File->getCOFFObj()->getSectionName(Header, SectionName);
 
@@ -156,9 +157,11 @@ StringRef SectionChunk::getDebugName() {
 uint64_t SectionChunk::getHash() const {
   ArrayRef<uint8_t> A;
   File->getCOFFObj()->getSectionContents(Header, A);
-  return hash_combine(getPermissions(), llvm::hash_value(SectionName),
+  return hash_combine(getPermissions(),
+                      llvm::hash_value(SectionName),
+                      NumRelocs,
                       uint32_t(Header->SizeOfRawData),
-                      uint32_t(Header->NumberOfRelocations),
+                      std::distance(Relocs.end(), Relocs.begin()),
                       hash_combine_range(A.data(), A.data() + A.size()));
 }
 
@@ -171,7 +174,7 @@ bool SectionChunk::equals(const SectionChunk *X) const {
     return false;
   if (Header->SizeOfRawData != X->Header->SizeOfRawData)
     return false;
-  if (Header->NumberOfRelocations != X->Header->NumberOfRelocations)
+  if (NumRelocs != X->NumRelocs)
     return false;
 
   // Compare data
index c993c63..3f15c16 100644 (file)
@@ -164,6 +164,7 @@ private:
   StringRef SectionName;
   std::vector<Chunk *> AssocChildren;
   llvm::iterator_range<const coff_relocation *> Relocs;
+  size_t NumRelocs;
 
   // Chunks are basically unnamed chunks of bytes.
   // Symbols are associated for debugging and logging purposs only.