1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include <stdexcept> 8*89c4ff92SAndroid Build Coastguard Worker #include <string> 9*89c4ff92SAndroid Build Coastguard Worker #include <sstream> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker namespace arm 12*89c4ff92SAndroid Build Coastguard Worker { 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker namespace pipe 15*89c4ff92SAndroid Build Coastguard Worker { 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker struct Location 18*89c4ff92SAndroid Build Coastguard Worker { 19*89c4ff92SAndroid Build Coastguard Worker const char* m_Function; 20*89c4ff92SAndroid Build Coastguard Worker const char* m_File; 21*89c4ff92SAndroid Build Coastguard Worker unsigned int m_Line; 22*89c4ff92SAndroid Build Coastguard Worker Locationarm::pipe::Location23*89c4ff92SAndroid Build Coastguard Worker Location(const char* func, 24*89c4ff92SAndroid Build Coastguard Worker const char* file, 25*89c4ff92SAndroid Build Coastguard Worker unsigned int line) 26*89c4ff92SAndroid Build Coastguard Worker : m_Function{func} 27*89c4ff92SAndroid Build Coastguard Worker , m_File{file} 28*89c4ff92SAndroid Build Coastguard Worker , m_Line{line} 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker } 31*89c4ff92SAndroid Build Coastguard Worker AsStringarm::pipe::Location32*89c4ff92SAndroid Build Coastguard Worker std::string AsString() const 33*89c4ff92SAndroid Build Coastguard Worker { 34*89c4ff92SAndroid Build Coastguard Worker std::stringstream ss; 35*89c4ff92SAndroid Build Coastguard Worker ss << " at function " << m_Function 36*89c4ff92SAndroid Build Coastguard Worker << " [" << m_File << ':' << m_Line << "]"; 37*89c4ff92SAndroid Build Coastguard Worker return ss.str(); 38*89c4ff92SAndroid Build Coastguard Worker } 39*89c4ff92SAndroid Build Coastguard Worker FileLinearm::pipe::Location40*89c4ff92SAndroid Build Coastguard Worker std::string FileLine() const 41*89c4ff92SAndroid Build Coastguard Worker { 42*89c4ff92SAndroid Build Coastguard Worker std::stringstream ss; 43*89c4ff92SAndroid Build Coastguard Worker ss << " [" << m_File << ':' << m_Line << "]"; 44*89c4ff92SAndroid Build Coastguard Worker return ss.str(); 45*89c4ff92SAndroid Build Coastguard Worker } 46*89c4ff92SAndroid Build Coastguard Worker }; 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker /// General Exception class for Profiling code 49*89c4ff92SAndroid Build Coastguard Worker class ProfilingException : public std::exception 50*89c4ff92SAndroid Build Coastguard Worker { 51*89c4ff92SAndroid Build Coastguard Worker public: ProfilingException(const std::string & message)52*89c4ff92SAndroid Build Coastguard Worker explicit ProfilingException(const std::string& message) : m_Message(message) {}; 53*89c4ff92SAndroid Build Coastguard Worker ProfilingException(const std::string & message,const Location & location)54*89c4ff92SAndroid Build Coastguard Worker explicit ProfilingException(const std::string& message, 55*89c4ff92SAndroid Build Coastguard Worker const Location& location) : m_Message(message + location.AsString()) {}; 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker /// @return - Error message of ProfilingException what() const58*89c4ff92SAndroid Build Coastguard Worker virtual const char *what() const noexcept override 59*89c4ff92SAndroid Build Coastguard Worker { 60*89c4ff92SAndroid Build Coastguard Worker return m_Message.c_str(); 61*89c4ff92SAndroid Build Coastguard Worker } 62*89c4ff92SAndroid Build Coastguard Worker 63*89c4ff92SAndroid Build Coastguard Worker private: 64*89c4ff92SAndroid Build Coastguard Worker std::string m_Message; 65*89c4ff92SAndroid Build Coastguard Worker }; 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker class BackendProfilingException : public ProfilingException 68*89c4ff92SAndroid Build Coastguard Worker { 69*89c4ff92SAndroid Build Coastguard Worker public: 70*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 71*89c4ff92SAndroid Build Coastguard Worker }; 72*89c4ff92SAndroid Build Coastguard Worker 73*89c4ff92SAndroid Build Coastguard Worker class BadOptionalAccessException : public ProfilingException 74*89c4ff92SAndroid Build Coastguard Worker { 75*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 76*89c4ff92SAndroid Build Coastguard Worker }; 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard Worker class BufferExhaustion : public ProfilingException 79*89c4ff92SAndroid Build Coastguard Worker { 80*89c4ff92SAndroid Build Coastguard Worker public: 81*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 82*89c4ff92SAndroid Build Coastguard Worker }; 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker class InvalidArgumentException : public ProfilingException 85*89c4ff92SAndroid Build Coastguard Worker { 86*89c4ff92SAndroid Build Coastguard Worker public: 87*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 88*89c4ff92SAndroid Build Coastguard Worker }; 89*89c4ff92SAndroid Build Coastguard Worker 90*89c4ff92SAndroid Build Coastguard Worker class TimeoutException : public ProfilingException 91*89c4ff92SAndroid Build Coastguard Worker { 92*89c4ff92SAndroid Build Coastguard Worker public: 93*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 94*89c4ff92SAndroid Build Coastguard Worker }; 95*89c4ff92SAndroid Build Coastguard Worker 96*89c4ff92SAndroid Build Coastguard Worker class UnimplementedException : public ProfilingException 97*89c4ff92SAndroid Build Coastguard Worker { 98*89c4ff92SAndroid Build Coastguard Worker public: 99*89c4ff92SAndroid Build Coastguard Worker using ProfilingException::ProfilingException; 100*89c4ff92SAndroid Build Coastguard Worker }; 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 103*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 104*89c4ff92SAndroid Build Coastguard Worker 105*89c4ff92SAndroid Build Coastguard Worker #define LOCATION() arm::pipe::Location(__func__, __FILE__, __LINE__) 106