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

Rui Ueyama ruiu at google.com
Mon Jul 27 17:17:59 PDT 2015


Done in r243358.

On Mon, Jul 27, 2015 at 5:07 PM, Rui Ueyama <ruiu at google.com> wrote:

> On Mon, Jul 27, 2015 at 5:00 PM, Duncan P. N. Exon Smith <
> dexonsmith at apple.com> wrote:
>
>>
>> > On 2015-Jul-27, at 16:37, Rui Ueyama <ruiu at google.com> wrote:
>> >
>> > 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
>> > > 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.
>>
>> Looking again, you're just using `Map` as a cache here, right?  If
>> you're not iterating over the map, you can probably skip the
>> red-black tree by using a (Small?)DenseMap.
>>
>
> Yes, we can do that. Use of std::map was just my negligence. I'll replace
> them with a DenseMap.
>
> >
>> >
>> > >
>> > > 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
>>
>> >
>> > >
>> ==============================================================================
>> > > --- 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/7b4eaebe/attachment.html>


More information about the llvm-commits mailing list