[llvm] r258931 - [DebugInfo] Support zero-length CIE in the _eh_frame parser

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 2 11:51:29 PST 2016


Why do you need to check in a binary to test this? llvm-mc should be
sufficient, no?

Cheers,
Rafael


On 27 January 2016 at 09:05, Igor Laevsky via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: igor.laevsky
> Date: Wed Jan 27 08:05:35 2016
> New Revision: 258931
>
> URL: http://llvm.org/viewvc/llvm-project?rev=258931&view=rev
> Log:
> [DebugInfo] Support zero-length CIE in the _eh_frame parser
>
> MCJIT emits zero-length CIE at the end of the _eh_frame section. This change
> ensures that parser inside DebugInfo will not crash and correctly record such cases.
> We are now recording DW_EH_PE_omit as a default value for FDE and LSDA encodings.
> Also Offset != EndAugmentationOffset assertion check will only happen if augmentation
> string had 'z' letter in it.
>
> Differential Revision: http://reviews.llvm.org/D16588
>
>
> Added:
>     llvm/trunk/test/tools/llvm-objdump/Inputs/eh_frame_zero_cie.o   (with props)
>     llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test
> Modified:
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp?rev=258931&r1=258930&r2=258931&view=diff
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp Wed Jan 27 08:05:35 2016
> @@ -201,8 +201,8 @@ public:
>        SmallString<8> Augmentation, uint8_t AddressSize,
>        uint8_t SegmentDescriptorSize, uint64_t CodeAlignmentFactor,
>        int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister,
> -      SmallString<8> AugmentationData, Optional<uint32_t> FDEPointerEncoding,
> -      Optional<uint32_t> 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 @@ public:
>    StringRef getAugmentationString() const { return Augmentation; }
>    uint64_t getCodeAlignmentFactor() const { return CodeAlignmentFactor; }
>    int64_t getDataAlignmentFactor() const { return DataAlignmentFactor; }
> -  Optional<uint32_t> getFDEPointerEncoding() const {
> +  uint32_t getFDEPointerEncoding() const {
>      return FDEPointerEncoding;
>    }
> -  Optional<uint32_t> getLSDAPointerEncoding() const {
> +  uint32_t getLSDAPointerEncoding() const {
>      return LSDAPointerEncoding;
>    }
>
> @@ -265,8 +265,8 @@ private:
>
>    // The following are used when the CIE represents an EH frame entry.
>    SmallString<8> AugmentationData;
> -  Optional<uint32_t> FDEPointerEncoding;
> -  Optional<uint32_t> LSDAPointerEncoding;
> +  uint32_t FDEPointerEncoding;
> +  uint32_t LSDAPointerEncoding;
>  };
>
>
> @@ -556,16 +556,16 @@ void DWARFDebugFrame::parse(DataExtracto
>        uint64_t ReturnAddressRegister = Data.getULEB128(&Offset);
>
>        // Parse the augmentation data for EH CIEs
> -      StringRef AugmentationData;
> -      Optional<uint32_t> FDEPointerEncoding;
> -      Optional<uint32_t> LSDAPointerEncoding;
> +      StringRef AugmentationData("");
> +      uint32_t FDEPointerEncoding = DW_EH_PE_omit;
> +      uint32_t LSDAPointerEncoding = DW_EH_PE_omit;
>        if (IsEH) {
>          Optional<uint32_t> PersonalityEncoding;
>          Optional<uint64_t> Personality;
>
> -        uint64_t AugmentationLength = 0;
> -        uint32_t StartAugmentationOffset = 0;
> -        uint32_t EndAugmentationOffset = 0;
> +        Optional<uint64_t> 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 @@ void DWARFDebugFrame::parse(DataExtracto
>              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 @@ void DWARFDebugFrame::parse(DataExtracto
>                break;
>              }
>              case 'R':
> -              if (FDEPointerEncoding)
> -                ReportError("Duplicate FDE encoding in entry at %lx");
>                FDEPointerEncoding = Data.getU8(&Offset);
>                break;
>              case 'z':
> @@ -596,20 +592,22 @@ void DWARFDebugFrame::parse(DataExtracto
>                // the string contains a 'z'.
>                AugmentationLength = Data.getULEB128(&Offset);
>                StartAugmentationOffset = Offset;
> -              EndAugmentationOffset =
> -                Offset + static_cast<uint32_t>(AugmentationLength);
> +              EndAugmentationOffset = Offset +
> +                static_cast<uint32_t>(*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<CIE>(StartOffset, Length, Version,
> -                                  StringRef(Augmentation), AddressSize,
> +                                  AugmentationString, AddressSize,
>                                    SegmentDescriptorSize, CodeAlignmentFactor,
>                                    DataAlignmentFactor, ReturnAddressRegister,
>                                    AugmentationData, FDEPointerEncoding,
> @@ -628,12 +626,11 @@ void DWARFDebugFrame::parse(DataExtracto
>          if (!Cie)
>            ReportError("Parsing FDE data at %lx failed due to missing CIE");
>
> -        Optional<uint32_t> 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 @@ void DWARFDebugFrame::parse(DataExtracto
>
>            // Decode the LSDA if the CIE augmentation string said we should.
>            uint64_t LSDA = 0;
> -          if (Optional<uint32_t> 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");
>
> Added: llvm/trunk/test/tools/llvm-objdump/Inputs/eh_frame_zero_cie.o
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/Inputs/eh_frame_zero_cie.o?rev=258931&view=auto
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: llvm/trunk/test/tools/llvm-objdump/Inputs/eh_frame_zero_cie.o
> ------------------------------------------------------------------------------
>     svn:mime-type = application/octet-stream
>
> Added: llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test?rev=258931&view=auto
> ==============================================================================
> --- llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test (added)
> +++ llvm/trunk/test/tools/llvm-objdump/eh_frame_zero_cie.test Wed Jan 27 08:05:35 2016
> @@ -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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list