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
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker
8*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
9*89c4ff92SAndroid Build Coastguard Worker #include <memory>
10*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
11*89c4ff92SAndroid Build Coastguard Worker #include <vector>
12*89c4ff92SAndroid Build Coastguard Worker
13*89c4ff92SAndroid Build Coastguard Worker namespace arm
14*89c4ff92SAndroid Build Coastguard Worker {
15*89c4ff92SAndroid Build Coastguard Worker
16*89c4ff92SAndroid Build Coastguard Worker namespace pipe
17*89c4ff92SAndroid Build Coastguard Worker {
18*89c4ff92SAndroid Build Coastguard Worker
19*89c4ff92SAndroid Build Coastguard Worker #if defined(__clang__) &&((__clang_major__>=3)||(__clang_major__==3 && __clang_minor__ >= 5))
20*89c4ff92SAndroid Build Coastguard Worker # define ARM_PIPE_FALLTHROUGH [[clang::fallthrough]]
21*89c4ff92SAndroid Build Coastguard Worker #elif defined(__GNUC__) && (__GNUC__ >= 7)
22*89c4ff92SAndroid Build Coastguard Worker # define ARM_PIPE_FALLTHROUGH __attribute__((fallthrough))
23*89c4ff92SAndroid Build Coastguard Worker #else
24*89c4ff92SAndroid Build Coastguard Worker # define ARM_PIPE_FALLTHROUGH ((void)0)
25*89c4ff92SAndroid Build Coastguard Worker #endif
26*89c4ff92SAndroid Build Coastguard Worker
27*89c4ff92SAndroid Build Coastguard Worker enum class LogSeverity
28*89c4ff92SAndroid Build Coastguard Worker {
29*89c4ff92SAndroid Build Coastguard Worker Trace,
30*89c4ff92SAndroid Build Coastguard Worker Debug,
31*89c4ff92SAndroid Build Coastguard Worker Info,
32*89c4ff92SAndroid Build Coastguard Worker Warning,
33*89c4ff92SAndroid Build Coastguard Worker Error,
34*89c4ff92SAndroid Build Coastguard Worker Fatal
35*89c4ff92SAndroid Build Coastguard Worker };
36*89c4ff92SAndroid Build Coastguard Worker
LevelToString(LogSeverity level)37*89c4ff92SAndroid Build Coastguard Worker inline std::string LevelToString(LogSeverity level)
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker switch(level)
40*89c4ff92SAndroid Build Coastguard Worker {
41*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Trace:
42*89c4ff92SAndroid Build Coastguard Worker return "Trace";
43*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Debug:
44*89c4ff92SAndroid Build Coastguard Worker return "Debug";
45*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Info:
46*89c4ff92SAndroid Build Coastguard Worker return "Info";
47*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Warning:
48*89c4ff92SAndroid Build Coastguard Worker return "Warning";
49*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Error:
50*89c4ff92SAndroid Build Coastguard Worker return "Error";
51*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Fatal:
52*89c4ff92SAndroid Build Coastguard Worker return "Fatal";
53*89c4ff92SAndroid Build Coastguard Worker default:
54*89c4ff92SAndroid Build Coastguard Worker return "Log";
55*89c4ff92SAndroid Build Coastguard Worker }
56*89c4ff92SAndroid Build Coastguard Worker }
57*89c4ff92SAndroid Build Coastguard Worker
58*89c4ff92SAndroid Build Coastguard Worker /// Configures the logging behaviour of the ARMNN library.
59*89c4ff92SAndroid Build Coastguard Worker /// printToStandardOutput: Set to true if log messages should be printed to the standard output.
60*89c4ff92SAndroid Build Coastguard Worker /// printToDebugOutput: Set to true if log messages be printed to a platform-specific debug output
61*89c4ff92SAndroid Build Coastguard Worker /// (where supported).
62*89c4ff92SAndroid Build Coastguard Worker /// severity: All log messages that are at this severity level or higher will be printed, others will be ignored.
63*89c4ff92SAndroid Build Coastguard Worker void ConfigureLogging(bool printToStandardOutput, bool printToDebugOutput, LogSeverity severity);
64*89c4ff92SAndroid Build Coastguard Worker
65*89c4ff92SAndroid Build Coastguard Worker class LogSink
66*89c4ff92SAndroid Build Coastguard Worker {
67*89c4ff92SAndroid Build Coastguard Worker public:
~LogSink()68*89c4ff92SAndroid Build Coastguard Worker virtual ~LogSink(){};
69*89c4ff92SAndroid Build Coastguard Worker
70*89c4ff92SAndroid Build Coastguard Worker virtual void Consume(const std::string&) = 0;
71*89c4ff92SAndroid Build Coastguard Worker private:
72*89c4ff92SAndroid Build Coastguard Worker
73*89c4ff92SAndroid Build Coastguard Worker };
74*89c4ff92SAndroid Build Coastguard Worker
75*89c4ff92SAndroid Build Coastguard Worker class StandardOutputSink : public LogSink
76*89c4ff92SAndroid Build Coastguard Worker {
77*89c4ff92SAndroid Build Coastguard Worker public:
Consume(const std::string & s)78*89c4ff92SAndroid Build Coastguard Worker void Consume(const std::string& s) override
79*89c4ff92SAndroid Build Coastguard Worker {
80*89c4ff92SAndroid Build Coastguard Worker std::cout << s << std::endl;
81*89c4ff92SAndroid Build Coastguard Worker }
82*89c4ff92SAndroid Build Coastguard Worker };
83*89c4ff92SAndroid Build Coastguard Worker
84*89c4ff92SAndroid Build Coastguard Worker struct ScopedRecord
85*89c4ff92SAndroid Build Coastguard Worker {
ScopedRecordarm::pipe::ScopedRecord86*89c4ff92SAndroid Build Coastguard Worker ScopedRecord(const std::vector<std::shared_ptr<LogSink>>& sinks, LogSeverity level, bool enabled)
87*89c4ff92SAndroid Build Coastguard Worker : m_LogSinks(sinks)
88*89c4ff92SAndroid Build Coastguard Worker , m_Enabled(enabled)
89*89c4ff92SAndroid Build Coastguard Worker {
90*89c4ff92SAndroid Build Coastguard Worker if (enabled)
91*89c4ff92SAndroid Build Coastguard Worker {
92*89c4ff92SAndroid Build Coastguard Worker m_Os << LevelToString(level) << ": ";
93*89c4ff92SAndroid Build Coastguard Worker }
94*89c4ff92SAndroid Build Coastguard Worker }
95*89c4ff92SAndroid Build Coastguard Worker
~ScopedRecordarm::pipe::ScopedRecord96*89c4ff92SAndroid Build Coastguard Worker ~ScopedRecord()
97*89c4ff92SAndroid Build Coastguard Worker {
98*89c4ff92SAndroid Build Coastguard Worker if (m_Enabled)
99*89c4ff92SAndroid Build Coastguard Worker {
100*89c4ff92SAndroid Build Coastguard Worker for (auto sink : m_LogSinks)
101*89c4ff92SAndroid Build Coastguard Worker {
102*89c4ff92SAndroid Build Coastguard Worker if (sink)
103*89c4ff92SAndroid Build Coastguard Worker {
104*89c4ff92SAndroid Build Coastguard Worker sink->Consume(m_Os.str());
105*89c4ff92SAndroid Build Coastguard Worker }
106*89c4ff92SAndroid Build Coastguard Worker }
107*89c4ff92SAndroid Build Coastguard Worker }
108*89c4ff92SAndroid Build Coastguard Worker }
109*89c4ff92SAndroid Build Coastguard Worker
110*89c4ff92SAndroid Build Coastguard Worker ScopedRecord(const ScopedRecord&) = delete;
111*89c4ff92SAndroid Build Coastguard Worker ScopedRecord& operator=(const ScopedRecord&) = delete;
112*89c4ff92SAndroid Build Coastguard Worker ScopedRecord& operator=(ScopedRecord&&) = delete;
113*89c4ff92SAndroid Build Coastguard Worker
114*89c4ff92SAndroid Build Coastguard Worker ScopedRecord(ScopedRecord&& other) = default;
115*89c4ff92SAndroid Build Coastguard Worker
116*89c4ff92SAndroid Build Coastguard Worker template<typename Streamable>
operator <<arm::pipe::ScopedRecord117*89c4ff92SAndroid Build Coastguard Worker ScopedRecord& operator<<(const Streamable& s)
118*89c4ff92SAndroid Build Coastguard Worker {
119*89c4ff92SAndroid Build Coastguard Worker if (m_Enabled)
120*89c4ff92SAndroid Build Coastguard Worker {
121*89c4ff92SAndroid Build Coastguard Worker m_Os << s;
122*89c4ff92SAndroid Build Coastguard Worker }
123*89c4ff92SAndroid Build Coastguard Worker return (*this);
124*89c4ff92SAndroid Build Coastguard Worker }
125*89c4ff92SAndroid Build Coastguard Worker
126*89c4ff92SAndroid Build Coastguard Worker private:
127*89c4ff92SAndroid Build Coastguard Worker const std::vector<std::shared_ptr<LogSink>>& m_LogSinks;
128*89c4ff92SAndroid Build Coastguard Worker std::ostringstream m_Os;
129*89c4ff92SAndroid Build Coastguard Worker bool m_Enabled;
130*89c4ff92SAndroid Build Coastguard Worker };
131*89c4ff92SAndroid Build Coastguard Worker
132*89c4ff92SAndroid Build Coastguard Worker template<LogSeverity Level>
133*89c4ff92SAndroid Build Coastguard Worker class SimpleLogger
134*89c4ff92SAndroid Build Coastguard Worker {
135*89c4ff92SAndroid Build Coastguard Worker public:
SimpleLogger()136*89c4ff92SAndroid Build Coastguard Worker SimpleLogger()
137*89c4ff92SAndroid Build Coastguard Worker : m_Sinks{std::make_shared<StandardOutputSink>()}
138*89c4ff92SAndroid Build Coastguard Worker , m_Enable(true)
139*89c4ff92SAndroid Build Coastguard Worker {
140*89c4ff92SAndroid Build Coastguard Worker }
141*89c4ff92SAndroid Build Coastguard Worker
Get()142*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<Level>& Get()
143*89c4ff92SAndroid Build Coastguard Worker {
144*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<Level> logger;
145*89c4ff92SAndroid Build Coastguard Worker return logger;
146*89c4ff92SAndroid Build Coastguard Worker }
147*89c4ff92SAndroid Build Coastguard Worker
Enable(bool enable=true)148*89c4ff92SAndroid Build Coastguard Worker void Enable(bool enable = true)
149*89c4ff92SAndroid Build Coastguard Worker {
150*89c4ff92SAndroid Build Coastguard Worker m_Enable = enable;
151*89c4ff92SAndroid Build Coastguard Worker }
152*89c4ff92SAndroid Build Coastguard Worker
StartNewRecord()153*89c4ff92SAndroid Build Coastguard Worker ScopedRecord StartNewRecord()
154*89c4ff92SAndroid Build Coastguard Worker {
155*89c4ff92SAndroid Build Coastguard Worker ScopedRecord record(m_Sinks, Level, m_Enable);
156*89c4ff92SAndroid Build Coastguard Worker return record;
157*89c4ff92SAndroid Build Coastguard Worker }
158*89c4ff92SAndroid Build Coastguard Worker
RemoveAllSinks()159*89c4ff92SAndroid Build Coastguard Worker void RemoveAllSinks()
160*89c4ff92SAndroid Build Coastguard Worker {
161*89c4ff92SAndroid Build Coastguard Worker m_Sinks.clear();
162*89c4ff92SAndroid Build Coastguard Worker }
163*89c4ff92SAndroid Build Coastguard Worker
AddSink(std::shared_ptr<LogSink> sink)164*89c4ff92SAndroid Build Coastguard Worker void AddSink(std::shared_ptr<LogSink> sink)
165*89c4ff92SAndroid Build Coastguard Worker {
166*89c4ff92SAndroid Build Coastguard Worker m_Sinks.push_back(sink);
167*89c4ff92SAndroid Build Coastguard Worker }
168*89c4ff92SAndroid Build Coastguard Worker private:
169*89c4ff92SAndroid Build Coastguard Worker std::vector<std::shared_ptr<LogSink>> m_Sinks;
170*89c4ff92SAndroid Build Coastguard Worker bool m_Enable;
171*89c4ff92SAndroid Build Coastguard Worker };
172*89c4ff92SAndroid Build Coastguard Worker
173*89c4ff92SAndroid Build Coastguard Worker void SetLogFilter(LogSeverity level);
174*89c4ff92SAndroid Build Coastguard Worker
175*89c4ff92SAndroid Build Coastguard Worker void SetAllLoggingSinks(bool standardOut, bool debugOut, bool coloured);
176*89c4ff92SAndroid Build Coastguard Worker
177*89c4ff92SAndroid Build Coastguard Worker enum class BoostLogSeverityMapping
178*89c4ff92SAndroid Build Coastguard Worker {
179*89c4ff92SAndroid Build Coastguard Worker trace,
180*89c4ff92SAndroid Build Coastguard Worker debug,
181*89c4ff92SAndroid Build Coastguard Worker info,
182*89c4ff92SAndroid Build Coastguard Worker warning,
183*89c4ff92SAndroid Build Coastguard Worker error,
184*89c4ff92SAndroid Build Coastguard Worker fatal
185*89c4ff92SAndroid Build Coastguard Worker };
186*89c4ff92SAndroid Build Coastguard Worker
ConvertLogSeverity(BoostLogSeverityMapping severity)187*89c4ff92SAndroid Build Coastguard Worker constexpr LogSeverity ConvertLogSeverity(BoostLogSeverityMapping severity)
188*89c4ff92SAndroid Build Coastguard Worker {
189*89c4ff92SAndroid Build Coastguard Worker return static_cast<LogSeverity>(severity);
190*89c4ff92SAndroid Build Coastguard Worker }
191*89c4ff92SAndroid Build Coastguard Worker
192*89c4ff92SAndroid Build Coastguard Worker
193*89c4ff92SAndroid Build Coastguard Worker #define ARM_PIPE_LOG(severity) \
194*89c4ff92SAndroid Build Coastguard Worker arm::pipe::SimpleLogger<ConvertLogSeverity(arm::pipe::BoostLogSeverityMapping::severity)>::Get().StartNewRecord()
195*89c4ff92SAndroid Build Coastguard Worker
196*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
197*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
198