LLVM: lib/Object/SFrameParser.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
14
15using namespace llvm;
17
21
22
23 if (End > Data.size()) {
25 formatv("unexpected end of data at offset {0:x} while reading [{1:x}, "
26 "{2:x})",
28 .str(),
30 }
32}
33
34template
37 static_assert(std::is_trivial_v);
41 return Slice.takeError();
42
44}
45
46template
50 if (!Array)
51 return Array.takeError();
52
53 return Array->front();
54}
55
56template
61 if (!Preamble)
63
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())));
71
74 if (!Header)
75 return Header.takeError();
76 return SFrameParser(Contents, SectionAddress, *Header);
77}
78
79template
81 return getDataSlice(Data, sizeof(Header), Header.AuxHdrLen);
82}
83
84template
89 return Slice.takeError();
92 Header.NumFDEs);
93}
94
95template
98 uint64_t Result = SectionAddress + FDE->StartAddress;
99
100 if ((getPreamble().Flags.value() & sframe::Flags::FDEFuncStartPCRel) ==
101 sframe::Flags::FDEFuncStartPCRel)
103
104 return Result;
105}
106
107template
109 uintptr_t DataPtr = reinterpret_cast<uintptr_t>(Data.data());
110 uintptr_t FDEPtr = reinterpret_cast<uintptr_t>(&*FDE);
111
112 assert(DataPtr <= FDEPtr && FDEPtr < DataPtr + Data.size() &&
113 "Iterator does not belong to this object!");
114 return FDEPtr - DataPtr;
115}
116
117template
129
130template <typename T, endianness E>
135 if (!RawFRE)
137
138 Offset += sizeof(*RawFRE);
140 FRE.Info.Info = RawFRE->Info.Info;
141
143 case sframe::FREOffset::B1:
146 case sframe::FREOffset::B2:
149 case sframe::FREOffset::B4:
152 }
153 return createError(formatv("unsupported FRE offset size {0} at offset {1:x+}",
156}
157
159 if (++Idx == Size)
161
162 switch (FREType) {
163 case sframe::FREType::Addr1:
165 case sframe::FREType::Addr2:
167 case sframe::FREType::Addr4:
169 }
170 return createError(formatv("unsupported FRE type {0} at offset {1:x+}",
171 static_cast<unsigned>(FREType), Offset));
172}
173
174template
180 Err);
183 0));
184 return {++BeforeBegin, End};
185}
186
188 if (Offsets.size() > Idx)
189 return Offsets[Idx];
190 return std::nullopt;
191}
192
193
194
195
196template
197std::optional<int32_t>
201
202template
203std::optional<int32_t>
206 return Header.CFAFixedRAOffset;
208}
209
210template
211std::optional<int32_t>
214 return Header.CFAFixedFPOffset;
216}
217
218template
221 size_t UsedOffsets = 1;
223 ++UsedOffsets;
225 ++UsedOffsets;
228 return {};
229}
230
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_EXPORT_TEMPLATE
static Expected< const T & > getDataSliceAs(ArrayRef< uint8_t > Data, uint64_t Offset)
Definition SFrameParser.cpp:47
static Error readArray(ArrayRef< uint8_t > Data, uint64_t Count, uint64_t &Offset, SmallVectorImpl< int32_t > &Vec)
Definition SFrameParser.cpp:118
static Expected< ArrayRef< T > > getDataSliceAsArrayOf(ArrayRef< uint8_t > Data, uint64_t Offset, uint64_t Count)
Definition SFrameParser.cpp:36
static Error readFRE(ArrayRef< uint8_t > Data, uint64_t &Offset, typename SFrameParser< E >::FrameRowEntry &FRE)
Definition SFrameParser.cpp:131
static Expected< ArrayRef< uint8_t > > getDataSlice(ArrayRef< uint8_t > Data, uint64_t Offset, uint64_t Size)
Definition SFrameParser.cpp:19
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),...
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 range adaptor for a pair of iterators.
LLVM_ABI Error inc()
Definition SFrameParser.cpp:158
Expected< ArrayRef< uint8_t > > getAuxHeader() const
Definition SFrameParser.cpp:80
std::optional< int32_t > getRAOffset(const FrameRowEntry &FRE) const
Definition SFrameParser.cpp:204
static Expected< SFrameParser > create(ArrayRef< uint8_t > Contents, uint64_t SectionAddress)
Definition SFrameParser.cpp:57
bool usesFixedFPOffset() const
bool usesFixedRAOffset() const
const sframe::Preamble< E > & getPreamble() const
std::optional< int32_t > getCFAOffset(const FrameRowEntry &FRE) const
Definition SFrameParser.cpp:198
fallible_iterator< FallibleFREIterator > fre_iterator
iterator_range< fre_iterator > fres(const sframe::FuncDescEntry< E > &FDE, Error &Err) const
Definition SFrameParser.cpp:176
std::optional< int32_t > getFPOffset(const FrameRowEntry &FRE) const
Definition SFrameParser.cpp:212
uint64_t offsetOf(typename FDERange::iterator FDE) const
Definition SFrameParser.cpp:108
ArrayRef< int32_t > getExtraOffsets(const FrameRowEntry &FRE) const
Definition SFrameParser.cpp:220
uint64_t getAbsoluteStartAddress(typename FDERange::iterator FDE) const
Definition SFrameParser.cpp:96
Expected< FDERange > fdes() const
Definition SFrameParser.cpp:85
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)
FunctionAddr VTableAddr Count
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
ArrayRef(const T &OneElt) -> ArrayRef< T >
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.
SmallVector< int32_t, 3 > Offsets
sframe::FREInfo< endianness::native > Info
FREOffset getOffsetSize() const
detail::packed< uint8_t, E > Info
uint8_t getOffsetCount() const
detail::packed< uint32_t, E > StartFREOff
detail::packed< uint32_t, E > NumFREs