[lld] r303801 - Close the gap between ELF and COFF ICF implementations. NFC.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed May 24 13:47:40 PDT 2017


Apologies, I believe r303805 fixes the issue.

On Wed, May 24, 2017 at 1:46 PM, Aleksey Shlyapnikov <alekseys at google.com>
wrote:

> http://lab.llvm.org:8011/builders/sanitizer-windows/builds/11813 reports
> lld related failures, please check.
>
> On Wed, May 24, 2017 at 12:56 PM, Rui Ueyama via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ruiu
>> Date: Wed May 24 14:56:29 2017
>> New Revision: 303801
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=303801&view=rev
>> Log:
>> Close the gap between ELF and COFF ICF implementations. NFC.
>>
>> We originally wrote the ICF code for COFF and ported it to ELF.
>> They started diverging since then. This patch closes the gap.
>>
>> Modified:
>>     lld/trunk/COFF/ICF.cpp
>>
>> Modified: lld/trunk/COFF/ICF.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/ICF.cpp?
>> rev=303801&r1=303800&r2=303801&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/COFF/ICF.cpp (original)
>> +++ lld/trunk/COFF/ICF.cpp Wed May 24 14:56:29 2017
>> @@ -56,7 +56,6 @@ private:
>>
>>    std::vector<SectionChunk *> Chunks;
>>    int Cnt = 0;
>> -  std::atomic<uint32_t> NextId = {1};
>>    std::atomic<bool> Repeat = {false};
>>  };
>>
>> @@ -98,10 +97,10 @@ void ICF::segregate(size_t Begin, size_t
>>          });
>>      size_t Mid = Bound - Chunks.begin();
>>
>> -    // Split [Begin, End) into [Begin, Mid) and [Mid, End).
>> -    uint32_t Id = NextId++;
>> +    // Split [Begin, End) into [Begin, Mid) and [Mid, End). We use Mid
>> as an
>> +    // equivalence class ID because every group ends with a unique index.
>>      for (size_t I = Begin; I < Mid; ++I)
>> -      Chunks[I]->Class[(Cnt + 1) % 2] = Id;
>> +      Chunks[I]->Class[(Cnt + 1) % 2] = Mid;
>>
>>      // If we created a group, we need to iterate the main loop again.
>>      if (Mid != End)
>> @@ -186,6 +185,7 @@ void ICF::forEachClass(std::function<voi
>>    // call Fn sequentially.
>>    if (Chunks.size() < 1024) {
>>      forEachClassRange(0, Chunks.size(), Fn);
>> +    ++Cnt;
>>      return;
>>    }
>>
>> @@ -196,6 +196,7 @@ void ICF::forEachClass(std::function<voi
>>      size_t End = (I == NumShards - 1) ? Chunks.size() : (I + 1) * Step;
>>      forEachClassRange(I * Step, End, Fn);
>>    });
>> +  ++Cnt;
>>  }
>>
>>  // Merge identical COMDAT sections.
>> @@ -203,22 +204,15 @@ void ICF::forEachClass(std::function<voi
>>  // contents and relocations are all the same.
>>  void ICF::run(const std::vector<Chunk *> &Vec) {
>>    // Collect only mergeable sections and group by hash value.
>> -  for (Chunk *C : Vec) {
>> -    auto *SC = dyn_cast<SectionChunk>(C);
>> -    if (!SC)
>> -      continue;
>> -
>> -    if (isEligible(SC)) {
>> -      // Set MSB to 1 to avoid collisions with non-hash classs.
>> -      SC->Class[0] = getHash(SC) | (1 << 31);
>> -      Chunks.push_back(SC);
>> -    } else {
>> -      SC->Class[0] = NextId++;
>> -    }
>> -  }
>> -
>> -  if (Chunks.empty())
>> -    return;
>> +  for (Chunk *C : Vec)
>> +    if (auto *SC = dyn_cast<SectionChunk>(C))
>> +      if (isEligible(SC))
>> +        Chunks.push_back(SC);
>> +
>> +  // Initially, we use hash values to partition sections.
>> +  for (SectionChunk *SC : Chunks)
>> +    // Set MSB to 1 to avoid collisions with non-hash classs.
>> +    SC->Class[0] = getHash(SC) | (1 << 31);
>>
>>    // From now on, sections in Chunks are ordered so that sections in
>>    // the same group are consecutive in the vector.
>> @@ -229,14 +223,12 @@ void ICF::run(const std::vector<Chunk *>
>>
>>    // Compare static contents and assign unique IDs for each static
>> content.
>>    forEachClass([&](size_t Begin, size_t End) { segregate(Begin, End,
>> true); });
>> -  ++Cnt;
>>
>>    // Split groups by comparing relocations until convergence is obtained.
>>    do {
>>      Repeat = false;
>>      forEachClass(
>>          [&](size_t Begin, size_t End) { segregate(Begin, End, false); });
>> -    ++Cnt;
>>    } while (Repeat);
>>
>>    log("ICF needed " + Twine(Cnt) + " iterations");
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170524/695c13d0/attachment.html>


More information about the llvm-commits mailing list