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

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Jul 27 12:01:27 PDT 2015


> 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`?

> 
> 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





More information about the llvm-commits mailing list