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