[lld] r243232 - ELF2: Avoid calling std::sort to make output deterministic.

Rui Ueyama ruiu at google.com
Mon Jul 27 16:37:58 PDT 2015


On Mon, Jul 27, 2015 at 4:18 PM, Chandler Carruth <chandlerc at google.com>
wrote:

> On Mon, Jul 27, 2015 at 2:02 PM Rui Ueyama <ruiu at google.com> wrote:
>
>> On Mon, Jul 27, 2015 at 12:01 PM, Duncan P. N. Exon Smith <
>> dexonsmith at apple.com> wrote:
>>
>>>
>>> > On 2015-Jul-25, at 17:50, Rui Ueyama <ruiu at google.com> wrote:
>>> >
>>> > Author: ruiu
>>> > Date: Sat Jul 25 19:50:15 2015
>>> > New Revision: 243232
>>> >
>>> > URL: http://llvm.org/viewvc/llvm-project?rev=243232&view=rev
>>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243232-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A7YEbZn5UiSjeArc6rLNc6OXlfY7Hm0OXfSQWGYHAns&s=wmdRPI5Lb9TNc_6lTBnZH0eo6CyF0IJSE6TQ7CrgwlU&e=>
>>> > Log:
>>> > ELF2: Avoid calling std::sort to make output deterministic.
>>>
>>> Using `std::stable_sort` should also make it deterministic.  Is that
>>> better than switching to a `std::map`?
>>>
>>
>> Yeah, I think the new code is slightly more readable than the previous
>> one. At least it's shorter than before.
>>
>
>
> "Yeah" doesn't seem to agree with the rest of your email, so I'm left
> confused.
>
> Why wouldn't switching to std::stable_sort be better?
>
> std::map is horribly slow in essentially every way, and so I struggle to
> believe it is the best tool for the job even if the code using it is very
> compact.
>

std::stable_sort would actually be slower than the new code. What we are
doing here is bin chunks into a few sections, so putting everything into
one array and stable-sorting them and scanning them again doesn't make much
sense. We used std::stable_sort in COFF before but I removed that in
r239292 for that reason.


>
>>
>>
>>> >
>>> > Modified:
>>> >    lld/trunk/ELF/Writer.cpp
>>> >
>>> > Modified: lld/trunk/ELF/Writer.cpp
>>> > URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=243232&r1=243231&r2=243232&view=diff
>>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Writer.cpp-3Frev-3D243232-26r1-3D243231-26r2-3D243232-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A7YEbZn5UiSjeArc6rLNc6OXlfY7Hm0OXfSQWGYHAns&s=pRVul_ct6AiIzUBKOQnvAVJ__uAbRsd-pdfkjBz9dco&e=>
>>>
>>> >
>>> ==============================================================================
>>> > --- lld/trunk/ELF/Writer.cpp (original)
>>> > +++ lld/trunk/ELF/Writer.cpp Sat Jul 25 19:50:15 2015
>>> > @@ -10,6 +10,7 @@
>>> > #include "Writer.h"
>>> > #include "Chunks.h"
>>> > #include "Driver.h"
>>> > +#include <map>
>>> >
>>> > using namespace llvm;
>>> > using namespace llvm::ELF;
>>> > @@ -58,24 +59,14 @@ void OutputSection::addChunk(Chunk *C) {
>>> >   Header.sh_size = Off;
>>> > }
>>> >
>>> > -static int compare(const Chunk *A, const Chunk *B) {
>>> > -  return A->getSectionName() < B->getSectionName();
>>> > -}
>>> > -
>>> > // Create output section objects and add them to OutputSections.
>>> > template <class ELFT> void Writer<ELFT>::createSections() {
>>> > -  std::vector<Chunk *> Chunks = Symtab->getChunks();
>>> > -  if (Chunks.empty())
>>> > -    return;
>>> > -  std::sort(Chunks.begin(), Chunks.end(), compare);
>>> > -
>>> > -  Chunk *Prev = nullptr;
>>> > -  OutputSection *Sec = nullptr;
>>> > -  for (Chunk *C : Chunks) {
>>> > -    if (Prev == nullptr || Prev->getSectionName() !=
>>> C->getSectionName()) {
>>> > +  std::map<StringRef, OutputSection *> Map;
>>> > +  for (Chunk *C : Symtab->getChunks()) {
>>> > +    OutputSection *&Sec = Map[C->getSectionName()];
>>> > +    if (!Sec) {
>>> >       Sec = new (CAlloc.Allocate()) OutputSection(C->getSectionName());
>>> >       OutputSections.push_back(Sec);
>>> > -      Prev = C;
>>> >     }
>>> >     Sec->addChunk(C);
>>> >   }
>>> >
>>> >
>>> > _______________________________________________
>>> > llvm-commits mailing list
>>> > llvm-commits at cs.uiuc.edu
>>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>>  _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150727/c9304833/attachment.html>


More information about the llvm-commits mailing list