Don't create a temporary DenseMap for each input .eh_frame.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 27 Apr 2018 20:19:28 +0000 (20:19 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 27 Apr 2018 20:19:28 +0000 (20:19 +0000)
These maps are small, but we are creating an destroying one for each
input .eh_frame.

This patch reduces the total memory allocation from 765.54MB to
749.19MB. The peak is still the same: 563.7MB.

llvm-svn: 331075

lld/ELF/SyntheticSections.cpp
lld/ELF/SyntheticSections.h

index 6f91a64..a951beb 100644 (file)
@@ -425,7 +425,7 @@ bool EhFrameSection::isFdeLive(EhSectionPiece &Fde, ArrayRef<RelTy> Rels) {
 // one and associates FDEs to the CIE.
 template <class ELFT, class RelTy>
 void EhFrameSection::addSectionAux(EhInputSection *Sec, ArrayRef<RelTy> Rels) {
-  DenseMap<size_t, CieRecord *> OffsetToCie;
+  OffsetToCie.clear();
   for (EhSectionPiece &Piece : Sec->Pieces) {
     // The empty record is the end marker.
     if (Piece.Size == 4)
index f27b91b..fc5ffa3 100644 (file)
@@ -86,6 +86,10 @@ public:
   ArrayRef<CieRecord *> getCieRecords() const { return CieRecords; }
 
 private:
+  // This is used only when parsing EhInputSection. We keep it here to avoid
+  // allocating one for each EhInputSection.
+  llvm::DenseMap<size_t, CieRecord *> OffsetToCie;
+
   uint64_t Size = 0;
 
   template <class ELFT, class RelTy>