diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp index 0e8d521f94330..51dc54e49fcc9 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp @@ -304,6 +304,12 @@ constexpr uint64_t getCIEId(bool IsDWARF64, bool IsEH) { } void CIE::dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH) const { + // A CIE with a zero length is a terminator entry in the .eh_frame sextion. + if (IsEH && Length == 0) { + OS << format("%08" PRIx64, Offset) << " ZERO terminator\n"; + return; + } + OS << format("%08" PRIx64, Offset) << format(" %0*" PRIx64, IsDWARF64 ? 16 : 8, Length) << format(" %0*" PRIx64, IsDWARF64 && !IsEH ? 16 : 8, diff --git a/llvm/test/tools/llvm-objdump/eh_frame-mipsel.test b/llvm/test/tools/llvm-objdump/eh_frame-mipsel.test index e89d9aeb53cb2..91058e28effc1 100644 --- a/llvm/test/tools/llvm-objdump/eh_frame-mipsel.test +++ b/llvm/test/tools/llvm-objdump/eh_frame-mipsel.test @@ -1,28 +1,25 @@ # RUN: llvm-objdump --dwarf=frames %p/Inputs/eh_frame.elf-mipsel | FileCheck %s -# CHECK: .eh_frame contents: - -# CHECK: 00000000 00000018 00000000 CIE -# CHECK: Version: 1 -# CHECK: Augmentation: "zPLR" -# CHECK: Code alignment factor: 1 -# CHECK: Data alignment factor: -4 -# CHECK: Return address column: 31 -# CHECK: Augmentation data: 80 90 0B 41 00 00 0B - -# CHECK: DW_CFA_def_cfa: reg29 +0 - -# CHECK: 0000001c 00000018 00000020 FDE cie=00000000 pc=00400890...004008dc -# CHECK: DW_CFA_advance_loc: 4 -# CHECK: DW_CFA_def_cfa_offset: +24 -# CHECK: DW_CFA_advance_loc: 4 -# CHECK: DW_CFA_offset: reg31 -4 -# CHECK: DW_CFA_nop: - -## FIXME: GNU objdump prints "00000038 ZERO terminator" instead. -# CHECK: 00000038 00000000 00000000 CIE -# CHECK: Version: 0 -# CHECK: Augmentation: "" -# CHECK: Code alignment factor: 0 -# CHECK: Data alignment factor: 0 -# CHECK: Return address column: 0 +# CHECK: .eh_frame contents: +# CHECK-EMPTY: +# CHECK-NEXT: 00000000 00000018 00000000 CIE +# CHECK-NEXT: Version: 1 +# CHECK-NEXT: Augmentation: "zPLR" +# CHECK-NEXT: Code alignment factor: 1 +# CHECK-NEXT: Data alignment factor: -4 +# CHECK-NEXT: Return address column: 31 +# CHECK-NEXT: Personality Address: 0000000000410b90 +# CHECK-NEXT: Augmentation data: 80 90 0B 41 00 00 0B +# CHECK-EMPTY: +# CHECK-NEXT: DW_CFA_def_cfa: reg29 +0 +# CHECK-EMPTY: +# CHECK-NEXT: 0000001c 00000018 00000020 FDE cie=00000000 pc=00400890...004008dc +# CHECK-NEXT: LSDA Address: 0000000000400a90 +# CHECK-NEXT: DW_CFA_advance_loc: 4 +# CHECK-NEXT: DW_CFA_def_cfa_offset: +24 +# CHECK-NEXT: DW_CFA_advance_loc: 4 +# CHECK-NEXT: DW_CFA_offset: reg31 -4 +# CHECK-NEXT: DW_CFA_nop: +# CHECK-EMPTY: +# CHECK-NEXT: 00000038 ZERO terminator +# CHECK-NOT: {{.}} diff --git a/llvm/test/tools/llvm-objdump/eh_frame_zero_cie.test b/llvm/test/tools/llvm-objdump/eh_frame_zero_cie.test index 510c944028cdf..30bbec9b97230 100644 --- a/llvm/test/tools/llvm-objdump/eh_frame_zero_cie.test +++ b/llvm/test/tools/llvm-objdump/eh_frame_zero_cie.test @@ -1,11 +1,6 @@ # RUN: llvm-objdump --dwarf=frames %p/Inputs/eh_frame_zero_cie.o 2>/dev/null | FileCheck %s -# CHECK: .eh_frame contents: - -## FIXME: GNU objdump prints "00000000 ZERO terminator" instead. -# CHECK: 00000000 00000000 00000000 CIE -# CHECK: Version: 0 -# CHECK: Augmentation: "" -# CHECK: Code alignment factor: 0 -# CHECK: Data alignment factor: 0 -# CHECK: Return address column: 0 +# CHECK: .eh_frame contents: +# CHECK-EMPTY: +# CHECK-NEXT: 00000000 ZERO terminator +# CHECK-NOT: {{.}}