1*fe6060f1SDimitry Andric //===----------------------- FaultMapParser.cpp ---------------------------===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric
9*fe6060f1SDimitry Andric #include "llvm/Object/FaultMapParser.h"
10*fe6060f1SDimitry Andric #include "llvm/Support/ErrorHandling.h"
11*fe6060f1SDimitry Andric #include "llvm/Support/Format.h"
12*fe6060f1SDimitry Andric #include "llvm/Support/raw_ostream.h"
13*fe6060f1SDimitry Andric
14*fe6060f1SDimitry Andric using namespace llvm;
15*fe6060f1SDimitry Andric
printFaultType(FaultMapParser::FaultKind FT,raw_ostream & OS)16*fe6060f1SDimitry Andric void printFaultType(FaultMapParser::FaultKind FT, raw_ostream &OS) {
17*fe6060f1SDimitry Andric switch (FT) {
18*fe6060f1SDimitry Andric default:
19*fe6060f1SDimitry Andric llvm_unreachable("unhandled fault type!");
20*fe6060f1SDimitry Andric case FaultMapParser::FaultingLoad:
21*fe6060f1SDimitry Andric OS << "FaultingLoad";
22*fe6060f1SDimitry Andric break;
23*fe6060f1SDimitry Andric case FaultMapParser::FaultingLoadStore:
24*fe6060f1SDimitry Andric OS << "FaultingLoadStore";
25*fe6060f1SDimitry Andric break;
26*fe6060f1SDimitry Andric case FaultMapParser::FaultingStore:
27*fe6060f1SDimitry Andric OS << "FaultingStore";
28*fe6060f1SDimitry Andric break;
29*fe6060f1SDimitry Andric }
30*fe6060f1SDimitry Andric }
31*fe6060f1SDimitry Andric
32*fe6060f1SDimitry Andric raw_ostream &
operator <<(raw_ostream & OS,const FaultMapParser::FunctionFaultInfoAccessor & FFI)33*fe6060f1SDimitry Andric llvm::operator<<(raw_ostream &OS,
34*fe6060f1SDimitry Andric const FaultMapParser::FunctionFaultInfoAccessor &FFI) {
35*fe6060f1SDimitry Andric OS << "Fault kind: ";
36*fe6060f1SDimitry Andric printFaultType((FaultMapParser::FaultKind)FFI.getFaultKind(), OS);
37*fe6060f1SDimitry Andric OS << ", faulting PC offset: " << FFI.getFaultingPCOffset()
38*fe6060f1SDimitry Andric << ", handling PC offset: " << FFI.getHandlerPCOffset();
39*fe6060f1SDimitry Andric return OS;
40*fe6060f1SDimitry Andric }
41*fe6060f1SDimitry Andric
operator <<(raw_ostream & OS,const FaultMapParser::FunctionInfoAccessor & FI)42*fe6060f1SDimitry Andric raw_ostream &llvm::operator<<(raw_ostream &OS,
43*fe6060f1SDimitry Andric const FaultMapParser::FunctionInfoAccessor &FI) {
44*fe6060f1SDimitry Andric OS << "FunctionAddress: " << format_hex(FI.getFunctionAddr(), 8)
45*fe6060f1SDimitry Andric << ", NumFaultingPCs: " << FI.getNumFaultingPCs() << "\n";
46*fe6060f1SDimitry Andric for (unsigned I = 0, E = FI.getNumFaultingPCs(); I != E; ++I)
47*fe6060f1SDimitry Andric OS << FI.getFunctionFaultInfoAt(I) << "\n";
48*fe6060f1SDimitry Andric return OS;
49*fe6060f1SDimitry Andric }
50*fe6060f1SDimitry Andric
operator <<(raw_ostream & OS,const FaultMapParser & FMP)51*fe6060f1SDimitry Andric raw_ostream &llvm::operator<<(raw_ostream &OS, const FaultMapParser &FMP) {
52*fe6060f1SDimitry Andric OS << "Version: " << format_hex(FMP.getFaultMapVersion(), 2) << "\n";
53*fe6060f1SDimitry Andric OS << "NumFunctions: " << FMP.getNumFunctions() << "\n";
54*fe6060f1SDimitry Andric
55*fe6060f1SDimitry Andric if (FMP.getNumFunctions() == 0)
56*fe6060f1SDimitry Andric return OS;
57*fe6060f1SDimitry Andric
58*fe6060f1SDimitry Andric FaultMapParser::FunctionInfoAccessor FI;
59*fe6060f1SDimitry Andric
60*fe6060f1SDimitry Andric for (unsigned I = 0, E = FMP.getNumFunctions(); I != E; ++I) {
61*fe6060f1SDimitry Andric FI = (I == 0) ? FMP.getFirstFunctionInfo() : FI.getNextFunctionInfo();
62*fe6060f1SDimitry Andric OS << FI;
63*fe6060f1SDimitry Andric }
64*fe6060f1SDimitry Andric
65*fe6060f1SDimitry Andric return OS;
66*fe6060f1SDimitry Andric }
67