10 #ifndef LLVM_CODEGEN_FAULTMAPS_H
11 #define LLVM_CODEGEN_FAULTMAPS_H
40 static const char *WFMP;
44 const MCExpr *FaultingOffsetExpr;
45 const MCExpr *HandlerOffsetExpr;
49 HandlerOffsetExpr(nullptr) {}
52 const MCExpr *HandlerOffset)
53 : Kind(Kind), FaultingOffsetExpr(FaultingOffset),
54 HandlerOffsetExpr(HandlerOffset) {}
57 typedef std::vector<FaultInfo> FunctionFaultInfos;
61 struct MCSymbolComparator {
63 return LHS->getName() < RHS->getName();
67 std::map<const MCSymbol *, FunctionFaultInfos, MCSymbolComparator>
71 void emitFunctionInfo(
const MCSymbol *FnLabel,
const FunctionFaultInfos &FFI);
79 typedef uint8_t FaultMapVersionType;
80 static const size_t FaultMapVersionOffset = 0;
82 typedef uint8_t Reserved0Type;
83 static const size_t Reserved0Offset =
84 FaultMapVersionOffset +
sizeof(FaultMapVersionType);
86 typedef uint16_t Reserved1Type;
87 static const size_t Reserved1Offset = Reserved0Offset +
sizeof(Reserved0Type);
89 typedef uint32_t NumFunctionsType;
90 static const size_t NumFunctionsOffset =
91 Reserved1Offset +
sizeof(Reserved1Type);
93 static const size_t FunctionInfosOffset =
94 NumFunctionsOffset +
sizeof(NumFunctionsType);
99 template <
typename T>
static T read(
const uint8_t *P,
const uint8_t *E) {
100 assert(P +
sizeof(
T) <= E &&
"out of bounds read!");
101 return support::endian::read<T, support::little, 1>(P);
106 typedef uint32_t FaultKindType;
107 static const size_t FaultKindOffset = 0;
109 typedef uint32_t FaultingPCOffsetType;
110 static const size_t FaultingPCOffsetOffset =
111 FaultKindOffset +
sizeof(FaultKindType);
113 typedef uint32_t HandlerPCOffsetType;
114 static const size_t HandlerPCOffsetOffset =
115 FaultingPCOffsetOffset +
sizeof(FaultingPCOffsetType);
122 HandlerPCOffsetOffset +
sizeof(HandlerPCOffsetType);
128 return read<FaultKindType>(P + FaultKindOffset, E);
132 return read<FaultingPCOffsetType>(P + FaultingPCOffsetOffset, E);
136 return read<HandlerPCOffsetType>(P + HandlerPCOffsetOffset, E);
141 typedef uint64_t FunctionAddrType;
142 static const size_t FunctionAddrOffset = 0;
144 typedef uint32_t NumFaultingPCsType;
145 static const size_t NumFaultingPCsOffset =
146 FunctionAddrOffset +
sizeof(FunctionAddrType);
148 typedef uint32_t ReservedType;
149 static const size_t ReservedOffset =
150 NumFaultingPCsOffset +
sizeof(NumFaultingPCsType);
152 static const size_t FunctionFaultInfosOffset =
153 ReservedOffset +
sizeof(ReservedType);
155 static const size_t FunctionInfoHeaderSize = FunctionFaultInfosOffset;
167 return read<FunctionAddrType>(P + FunctionAddrOffset, E);
171 return read<NumFaultingPCsType>(P + NumFaultingPCsOffset, E);
176 const uint8_t *Begin = P + FunctionFaultInfosOffset +
182 size_t MySize = FunctionInfoHeaderSize +
185 const uint8_t *Begin = P + MySize;
186 assert(Begin < E &&
"out of bounds!");
192 : P(Begin), E(End) {}
195 auto Version = read<FaultMapVersionType>(P + FaultMapVersionOffset, E);
196 assert(
Version == 1 &&
"only version 1 supported!");
201 return read<NumFunctionsType>(P + NumFunctionsOffset, E);
205 const uint8_t *Begin = P + FunctionInfosOffset;
211 operator<<(raw_ostream &OS,
const FaultMapParser::FunctionFaultInfoAccessor &);
214 const FaultMapParser::FunctionInfoAccessor &);
216 raw_ostream &
operator<<(raw_ostream &OS,
const FaultMapParser &);
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
FunctionInfoAccessor getFirstFunctionInfo() const
FaultingPCOffsetType getFaultingPCOffset() const
Base class for the full range of assembler expressions which are needed for parsing.
void recordFaultingOp(FaultKind FaultTy, const MCSymbol *HandlerLabel)
NumFaultingPCsType getNumFaultingPCs() const
FaultMapParser(const uint8_t *Begin, const uint8_t *End)
HandlerPCOffsetType getHandlerPCOffset() const
FaultMaps(AsmPrinter &AP)
FunctionFaultInfoAccessor getFunctionFaultInfoAt(uint32_t Index) const
This class is intended to be used as a driving class for all asm writers.
FaultKindType getFaultKind() const
A parser for the __llvm_faultmaps section generated by the FaultMaps class above. ...
void serializeToFaultMapSection()
FunctionFaultInfoAccessor(const uint8_t *P, const uint8_t *E)
NumFunctionsType getNumFunctions() const
FaultMapVersionType getFaultMapVersion() const
static const char * faultTypeToString(FaultKind)
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
FunctionInfoAccessor getNextFunctionInfo() const
FunctionAddrType getFunctionAddr() const
const ARM::ArchExtKind Kind
FunctionInfoAccessor(const uint8_t *P, const uint8_t *E)