23 if (
End > Data.size()) {
25 formatv(
"unexpected end of data at offset {0:x} while reading [{1:x}, "
29 object_error::unexpected_eof);
37 static_assert(std::is_trivial_v<T>);
41 return Slice.takeError();
43 return ArrayRef(
reinterpret_cast<const T *
>(
Slice->data()), Count);
51 return Array.takeError();
53 return Array->front();
56template <endianness E>
60 getDataSliceAs<sframe::Preamble<E>>(Contents, 0);
66 formatv(
"invalid magic number ({0:x+4})", Preamble->Magic.value()));
67 if (Preamble->Version != sframe::Version::V2)
69 formatv(
"invalid/unsupported version number ({0})",
70 static_cast<unsigned>(Preamble->Version.value())));
73 getDataSliceAs<sframe::Header<E>>(Contents, 0);
75 return Header.takeError();
79template <endianness E>
81 return getDataSlice(Data,
sizeof(Header), Header.AuxHdrLen);
84template <endianness E>
89 return Slice.takeError();
95template <endianness E>
98 uint64_t Result = SectionAddress + FDE->StartAddress;
100 if ((getPreamble().Flags.value() & sframe::Flags::FDEFuncStartPCRel) ==
101 sframe::Flags::FDEFuncStartPCRel)
102 Result += offsetOf(FDE);
107template <endianness E>
109 uintptr_t DataPtr =
reinterpret_cast<uintptr_t
>(Data.data());
110 uintptr_t FDEPtr =
reinterpret_cast<uintptr_t
>(&*FDE);
112 assert(DataPtr <= FDEPtr && FDEPtr < DataPtr + Data.size() &&
113 "Iterator does not belong to this object!");
114 return FDEPtr - DataPtr;
117template <
typename EndianT>
121 getDataSliceAsArrayOf<EndianT>(Data,
Offset, Count);
124 Offset += Count *
sizeof(EndianT);
130template <
typename T, endianness E>
134 getDataSliceAs<sframe::FrameRowEntry<T, E>>(Data,
Offset);
138 Offset +=
sizeof(*RawFRE);
139 FRE.StartAddress = RawFRE->StartAddress;
140 FRE.Info.Info = RawFRE->Info.Info;
142 switch (FRE.Info.getOffsetSize()) {
143 case sframe::FREOffset::B1:
144 return readArray<sframe::detail::packed<int8_t, E>>(
145 Data, FRE.Info.getOffsetCount(),
Offset, FRE.Offsets);
146 case sframe::FREOffset::B2:
147 return readArray<sframe::detail::packed<int16_t, E>>(
148 Data, FRE.Info.getOffsetCount(),
Offset, FRE.Offsets);
149 case sframe::FREOffset::B4:
150 return readArray<sframe::detail::packed<int32_t, E>>(
151 Data, FRE.Info.getOffsetCount(),
Offset, FRE.Offsets);
154 static_cast<unsigned>(FRE.Info.getOffsetSize()),
163 case sframe::FREType::Addr1:
164 return readFRE<uint8_t, E>(Data, Offset, FRE);
165 case sframe::FREType::Addr2:
166 return readFRE<uint16_t, E>(Data, Offset, FRE);
167 case sframe::FREType::Addr4:
168 return readFRE<uint32_t, E>(Data, Offset, FRE);
171 static_cast<unsigned>(FREType), Offset));
174template <endianness E>
184 return {++BeforeBegin,
End};
188 if (Offsets.size() >
Idx)
196template <endianness E>
197std::optional<int32_t>
202template <endianness E>
203std::optional<int32_t>
206 return Header.CFAFixedRAOffset;
210template <endianness E>
211std::optional<int32_t>
214 return Header.CFAFixedFPOffset;
218template <endianness E>
221 size_t UsedOffsets = 1;
226 if (FRE.Offsets.size() > UsedOffsets)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_EXPORT_TEMPLATE
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static Expected< const T & > getDataSliceAs(ArrayRef< uint8_t > Data, uint64_t Offset)
static Error readArray(ArrayRef< uint8_t > Data, uint64_t Count, uint64_t &Offset, SmallVectorImpl< int32_t > &Vec)
static Expected< ArrayRef< T > > getDataSliceAsArrayOf(ArrayRef< uint8_t > Data, uint64_t Offset, uint64_t Count)
static Error readFRE(ArrayRef< uint8_t > Data, uint64_t &Offset, typename SFrameParser< E >::FrameRowEntry &FRE)
static Expected< ArrayRef< uint8_t > > getDataSlice(ArrayRef< uint8_t > Data, uint64_t Offset, uint64_t Size)
This file contains data-structure definitions and constants to support unwinding based on ....
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
A wrapper class for fallible iterators.
A range adaptor for a pair of iterators.
Expected< ArrayRef< uint8_t > > getAuxHeader() const
std::optional< int32_t > getRAOffset(const FrameRowEntry &FRE) const
static Expected< SFrameParser > create(ArrayRef< uint8_t > Contents, uint64_t SectionAddress)
bool usesFixedFPOffset() const
bool usesFixedRAOffset() const
std::optional< int32_t > getCFAOffset(const FrameRowEntry &FRE) const
iterator_range< fre_iterator > fres(const sframe::FuncDescEntry< E > &FDE, Error &Err) const
std::optional< int32_t > getFPOffset(const FrameRowEntry &FRE) const
uint64_t offsetOf(typename FDERange::iterator FDE) const
ArrayRef< int32_t > getExtraOffsets(const FrameRowEntry &FRE) const
uint64_t getAbsoluteStartAddress(typename FDERange::iterator FDE) const
Expected< FDERange > fdes() const
Error createError(const Twine &Err)
This is an optimization pass for GlobalISel generic memory operations.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
fallible_iterator< Underlying > make_fallible_itr(Underlying I, Error &Err)
Convenience wrapper to make a fallible_iterator value from an instance of an underlying iterator and ...
fallible_iterator< Underlying > make_fallible_end(Underlying E)
Convenience wrapper to make a fallible_iterator end value from an instance of an underlying iterator.
OutputIt copy(R &&Range, OutputIt Out)
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)
Add two unsigned integers, X and Y, of type T.
detail::packed< uint32_t, E > StartFREOff
detail::packed< uint32_t, E > NumFREs