diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 6d2605ab5cc6c..8bdc2b0e5c4f9 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -947,8 +947,7 @@ void EHOutputSection::addSectionAux( auto RelI = Rels.begin(); auto RelE = Rels.end(); - // Maps offset to Index/Length pair. - DenseMap> OffsetToData; + DenseMap OffsetToIndex; while (!D.empty()) { unsigned Index = S->Offsets.size(); S->Offsets.push_back(std::make_pair(Offset, -1)); @@ -975,24 +974,21 @@ void EHOutputSection::addSectionAux( std::pair CieInfo(Entry, Personality); auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size())); - if (P.second) + if (P.second) { Cies.push_back(C); - OffsetToData[Offset] = std::make_pair(P.first->second, Length); + this->Header.sh_size += RoundUpToAlignment(Length, sizeof(uintX_t)); + } + OffsetToIndex[Offset] = P.first->second; } else { if (!HasReloc) error("FDE doesn't reference another section"); InputSectionBase *Target = S->getRelocTarget(*RelI); if (Target != &InputSection::Discarded && Target->isLive()) { uint32_t CieOffset = Offset + 4 - ID; - auto I = OffsetToData.find(CieOffset); - if (I == OffsetToData.end()) + auto I = OffsetToIndex.find(CieOffset); + if (I == OffsetToIndex.end()) error("Invalid CIE reference"); - std::pair &IndLen = I->second; - Cie &Cie = Cies[IndLen.first]; - if (Cie.Fdes.empty()) - this->Header.sh_size += - RoundUpToAlignment(IndLen.second, sizeof(uintX_t)); - Cie.Fdes.push_back(EHRegion(S, Index)); + Cies[I->second].Fdes.push_back(EHRegion(S, Index)); this->Header.sh_size += RoundUpToAlignment(Length, sizeof(uintX_t)); } } diff --git a/lld/test/ELF/eh-frame-opt.s b/lld/test/ELF/eh-frame-opt.s deleted file mode 100644 index 25ad99a07c4c5..0000000000000 --- a/lld/test/ELF/eh-frame-opt.s +++ /dev/null @@ -1,39 +0,0 @@ -// REQUIRES: x86 -// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -// RUN: ld.lld --gc-sections %t.o -o %t -// RUN: llvm-readobj -s -section-data %t | FileCheck %s - -// Here we check that if all FDEs referencing a CIE -// were removed, CIE is also removed. -// CHECK: Section { -// CHECK: Index: -// CHECK: Name: .eh_frame -// CHECK-NEXT: Type: SHT_X86_64_UNWIND -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x10120 -// CHECK-NEXT: Offset: 0x120 -// CHECK-NEXT: Size: 0 -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 8 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: ) -// CHECK-NEXT: } - -.section foo,"ax",@progbits -.cfi_startproc - nop -.cfi_endproc - -.section bar,"ax",@progbits -.cfi_startproc - nop - nop -.cfi_endproc - -.text -.globl _start; -_start: