Index: ELF/InputSection.h =================================================================== --- ELF/InputSection.h +++ ELF/InputSection.h @@ -254,13 +254,13 @@ const SectionPiece *getSectionPiece(uint64_t Offset) const; SyntheticSection *getParent() const; + void initOffsetMap(); private: void splitStrings(ArrayRef A, size_t Size); void splitNonStrings(ArrayRef A, size_t Size); - mutable llvm::DenseMap OffsetMap; - mutable llvm::once_flag InitOffsetMap; + llvm::DenseMap OffsetMap; llvm::DenseSet LiveOffsets; }; Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -963,13 +963,6 @@ if (!Live) return 0; - // Initialize OffsetMap lazily. - llvm::call_once(InitOffsetMap, [&] { - OffsetMap.reserve(Pieces.size()); - for (size_t I = 0; I < Pieces.size(); ++I) - OffsetMap[Pieces[I].InputOff] = I; - }); - // Find a string starting at a given offset. auto It = OffsetMap.find(Offset); if (It != OffsetMap.end()) @@ -985,6 +978,12 @@ return Piece.OutputOff + Addend; } +void MergeInputSection::initOffsetMap() { + OffsetMap.reserve(Pieces.size()); + for (size_t I = 0; I < Pieces.size(); ++I) + OffsetMap[Pieces[I].InputOff] = I; +} + template InputSection::InputSection(ObjFile &, const ELF32LE::Shdr &, StringRef); template InputSection::InputSection(ObjFile &, const ELF32BE::Shdr &, Index: ELF/SyntheticSections.h =================================================================== --- ELF/SyntheticSections.h +++ ELF/SyntheticSections.h @@ -684,13 +684,12 @@ class MergeSyntheticSection : public SyntheticSection { public: void addSection(MergeInputSection *MS); + std::vector Sections; protected: MergeSyntheticSection(StringRef Name, uint32_t Type, uint64_t Flags, uint32_t Alignment) : SyntheticSection(Flags, Type, Alignment, Name) {} - - std::vector Sections; }; class MergeTailSection final : public MergeSyntheticSection { Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -2573,8 +2573,11 @@ } (*I)->addSection(MS); } - for (auto *MS : MergeSections) + for (auto *MS : MergeSections) { MS->finalizeContents(); + parallelForEach(MS->Sections, + [](MergeInputSection *Sec) { Sec->initOffsetMap(); }); + } std::vector &V = InputSections; V.erase(std::remove(V.begin(), V.end(), nullptr), V.end());