Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -920,6 +920,10 @@ else splitNonStrings(Data, Entsize); + OffsetMap.reserve(Pieces.size()); + for (size_t I = 0, E = Pieces.size(); I != E; ++I) + OffsetMap[Pieces[I].InputOff] = I; + if (Config->GcSections && (Flags & SHF_ALLOC)) for (uint32_t Off : LiveOffsets) getSectionPiece(Off)->Live = true; Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -2440,15 +2440,10 @@ // finalize() fixed tail-optimized strings, so we can now get // offsets of strings. Get an offset for each string and save it // to a corresponding StringPiece for easy access. - for (MergeInputSection *Sec : Sections) { - Sec->OffsetMap.reserve(Sec->Pieces.size()); - for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) { - SectionPiece &P = Sec->Pieces[I]; - Sec->OffsetMap[P.InputOff] = I; - if (P.Live) - P.OutputOff = Builder.getOffset(Sec->getData(I)); - } - } + for (MergeInputSection *Sec : Sections) + for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) + if (Sec->Pieces[I].Live) + Sec->Pieces[I].OutputOff = Builder.getOffset(Sec->getData(I)); } void MergeNoTailSection::writeTo(uint8_t *Buf) { @@ -2501,13 +2496,10 @@ // So far, section pieces have offsets from beginning of shards, but // we want offsets from beginning of the whole section. Fix them. parallelForEach(Sections, [&](MergeInputSection *Sec) { - Sec->OffsetMap.reserve(Sec->Pieces.size()); - for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) { - SectionPiece &P = Sec->Pieces[I]; - Sec->OffsetMap[P.InputOff] = I; - if (P.Live) - P.OutputOff += ShardOffsets[getShardId(P.Hash)]; - } + for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I) + if (Sec->Pieces[I].Live) + Sec->Pieces[I].OutputOff += + ShardOffsets[getShardId(Sec->Pieces[I].Hash)]; }); }