Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp @@ -201,8 +201,8 @@ SmallString<8> Augmentation, uint8_t AddressSize, uint8_t SegmentDescriptorSize, uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister, - SmallString<8> AugmentationData, Optional FDEPointerEncoding, - Optional LSDAPointerEncoding) + SmallString<8> AugmentationData, uint32_t FDEPointerEncoding, + uint32_t LSDAPointerEncoding) : FrameEntry(FK_CIE, Offset, Length), Version(Version), Augmentation(std::move(Augmentation)), AddressSize(AddressSize), @@ -219,10 +219,10 @@ StringRef getAugmentationString() const { return Augmentation; } uint64_t getCodeAlignmentFactor() const { return CodeAlignmentFactor; } int64_t getDataAlignmentFactor() const { return DataAlignmentFactor; } - Optional getFDEPointerEncoding() const { + uint32_t getFDEPointerEncoding() const { return FDEPointerEncoding; } - Optional getLSDAPointerEncoding() const { + uint32_t getLSDAPointerEncoding() const { return LSDAPointerEncoding; } @@ -265,8 +265,8 @@ // The following are used when the CIE represents an EH frame entry. SmallString<8> AugmentationData; - Optional FDEPointerEncoding; - Optional LSDAPointerEncoding; + uint32_t FDEPointerEncoding; + uint32_t LSDAPointerEncoding; }; @@ -556,16 +556,16 @@ uint64_t ReturnAddressRegister = Data.getULEB128(&Offset); // Parse the augmentation data for EH CIEs - StringRef AugmentationData; - Optional FDEPointerEncoding; - Optional LSDAPointerEncoding; + StringRef AugmentationData(""); + uint32_t FDEPointerEncoding = DW_EH_PE_omit; + uint32_t LSDAPointerEncoding = DW_EH_PE_omit; if (IsEH) { Optional PersonalityEncoding; Optional Personality; - uint64_t AugmentationLength = 0; - uint32_t StartAugmentationOffset = 0; - uint32_t EndAugmentationOffset = 0; + Optional AugmentationLength; + uint32_t StartAugmentationOffset; + uint32_t EndAugmentationOffset; // Walk the augmentation string to get all the augmentation data. for (unsigned i = 0, e = AugmentationString.size(); i != e; ++i) { @@ -573,8 +573,6 @@ default: ReportError("Unknown augmentation character in entry at %lx"); case 'L': - if (LSDAPointerEncoding) - ReportError("Duplicate LSDA encoding in entry at %lx"); LSDAPointerEncoding = Data.getU8(&Offset); break; case 'P': { @@ -585,8 +583,6 @@ break; } case 'R': - if (FDEPointerEncoding) - ReportError("Duplicate FDE encoding in entry at %lx"); FDEPointerEncoding = Data.getU8(&Offset); break; case 'z': @@ -596,20 +592,22 @@ // the string contains a 'z'. AugmentationLength = Data.getULEB128(&Offset); StartAugmentationOffset = Offset; - EndAugmentationOffset = - Offset + static_cast(AugmentationLength); + EndAugmentationOffset = Offset + + static_cast(*AugmentationLength); } } - if (Offset != EndAugmentationOffset) - ReportError("Parsing augmentation data at %lx failed"); + if (AugmentationLength.hasValue()) { + if (Offset != EndAugmentationOffset) + ReportError("Parsing augmentation data at %lx failed"); - AugmentationData = Data.getData().slice(StartAugmentationOffset, - EndAugmentationOffset); + AugmentationData = Data.getData().slice(StartAugmentationOffset, + EndAugmentationOffset); + } } auto Cie = make_unique(StartOffset, Length, Version, - StringRef(Augmentation), AddressSize, + AugmentationString, AddressSize, SegmentDescriptorSize, CodeAlignmentFactor, DataAlignmentFactor, ReturnAddressRegister, AugmentationData, FDEPointerEncoding, @@ -628,12 +626,11 @@ if (!Cie) ReportError("Parsing FDE data at %lx failed due to missing CIE"); - Optional FDEPointerEncoding = Cie->getFDEPointerEncoding(); - if (!FDEPointerEncoding) - ReportError("Parsing at %lx failed due to missing pointer encoding"); + InitialLocation = readPointer(Data, Offset, + Cie->getFDEPointerEncoding()); + AddressRange = readPointer(Data, Offset, + Cie->getFDEPointerEncoding()); - InitialLocation = readPointer(Data, Offset, *FDEPointerEncoding); - AddressRange = readPointer(Data, Offset, *FDEPointerEncoding); StringRef AugmentationString = Cie->getAugmentationString(); if (!AugmentationString.empty()) { // Parse the augmentation length and data for this FDE. @@ -644,8 +641,8 @@ // Decode the LSDA if the CIE augmentation string said we should. uint64_t LSDA = 0; - if (Optional Encoding = Cie->getLSDAPointerEncoding()) - LSDA = readPointer(Data, Offset, *Encoding); + if (Cie->getLSDAPointerEncoding() != DW_EH_PE_omit) + LSDA = readPointer(Data, Offset, Cie->getLSDAPointerEncoding()); if (Offset != EndAugmentationOffset) ReportError("Parsing augmentation data at %lx failed"); Index: llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test =================================================================== --- llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test +++ llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test @@ -0,0 +1,10 @@ +# RUN: llvm-objdump -dwarf=frames %p/Inputs/eh_frame_zero_cie.o 2>/dev/null | FileCheck %s + +# CHECK: .eh_frame contents: + +# CHECK: 00000000 00000000 ffffffff CIE +# CHECK: Version: 0 +# CHECK: Augmentation: "" +# CHECK: Code alignment factor: 0 +# CHECK: Data alignment factor: 0 +# CHECK: Return address column: 0