xref: /freebsd-src/contrib/llvm-project/llvm/lib/Object/FaultMapParser.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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