10 #ifndef LLVM_CODEGEN_FAULTMAPS_H
11 #define LLVM_CODEGEN_FAULTMAPS_H
39 static const char *WFMP;
43 const MCExpr *FaultingOffsetExpr;
44 const MCExpr *HandlerOffsetExpr;
48 HandlerOffsetExpr(nullptr) {}
51 const MCExpr *HandlerOffset)
52 : Kind(Kind), FaultingOffsetExpr(FaultingOffset),
53 HandlerOffsetExpr(HandlerOffset) {}
56 typedef std::vector<FaultInfo> FunctionFaultInfos;
60 struct MCSymbolComparator {
62 return LHS->getName() < RHS->getName();
66 std::map<const MCSymbol *, FunctionFaultInfos, MCSymbolComparator>
70 void emitFunctionInfo(
const MCSymbol *FnLabel,
const FunctionFaultInfos &FFI);
78 typedef uint8_t FaultMapVersionType;
79 static const size_t FaultMapVersionOffset = 0;
81 typedef uint8_t Reserved0Type;
82 static const size_t Reserved0Offset =
83 FaultMapVersionOffset +
sizeof(FaultMapVersionType);
85 typedef uint16_t Reserved1Type;
86 static const size_t Reserved1Offset = Reserved0Offset +
sizeof(Reserved0Type);
89 static const size_t NumFunctionsOffset =
90 Reserved1Offset +
sizeof(Reserved1Type);
92 static const size_t FunctionInfosOffset =
98 template <
typename T>
static T read(
const uint8_t *P,
const uint8_t *E) {
99 assert(P +
sizeof(
T) <= E &&
"out of bounds read!");
100 return support::endian::read<T, support::little, 1>(P);
106 static const size_t FaultKindOffset = 0;
109 static const size_t FaultingPCOffsetOffset =
113 static const size_t HandlerPCOffsetOffset =
127 return read<FaultKindType>(P + FaultKindOffset, E);
131 return read<FaultingPCOffsetType>(P + FaultingPCOffsetOffset, E);
135 return read<HandlerPCOffsetType>(P + HandlerPCOffsetOffset, E);
140 typedef uint64_t FunctionAddrType;
141 static const size_t FunctionAddrOffset = 0;
144 static const size_t NumFaultingPCsOffset =
145 FunctionAddrOffset +
sizeof(FunctionAddrType);
148 static const size_t ReservedOffset =
151 static const size_t FunctionFaultInfosOffset =
154 static const size_t FunctionInfoHeaderSize = FunctionFaultInfosOffset;
166 return read<FunctionAddrType>(P + FunctionAddrOffset, E);
170 return read<NumFaultingPCsType>(P + NumFaultingPCsOffset, E);
175 const uint8_t *Begin = P + FunctionFaultInfosOffset +
181 size_t MySize = FunctionInfoHeaderSize +
184 const uint8_t *Begin = P + MySize;
185 assert(Begin < E &&
"out of bounds!");
191 : P(Begin), E(End) {}
194 auto Version = read<FaultMapVersionType>(P + FaultMapVersionOffset, E);
200 return read<NumFunctionsType>(P + NumFunctionsOffset, E);
204 const uint8_t *Begin = P + FunctionInfosOffset;
210 operator<<(raw_ostream &OS,
const FaultMapParser::FunctionFaultInfoAccessor &);
213 const FaultMapParser::FunctionInfoAccessor &);
215 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.
static const unsigned End
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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
FunctionInfoAccessor(const uint8_t *P, const uint8_t *E)